Vizitator nenea dani Postat Octombrie 17, 2010 Partajează Postat Octombrie 17, 2010 Buna ziua tuturor Am si eu o intrebare de subincepator pentru Attiny461 . Dupa ce am lucrat doi oameni vreo 4 zile ca sa scriem un program in C pentru un led clipitor acum avem urmatoarea problema de rezolvat . Cum declar ca intr-un port unii pini sa fie iesiri iar altii intrari cu rezistente de pull-up ? . Vreau sa aprind un led la un pin din portul A cand pun la masa un pin din portul B. Nu reusesc nici cum . Aceasta este o varianta care bineanteles ca nu functioneaza . #include // header #define F_CPU 8000000UL // stabilesc frecventa 8Mhz#include // header pentru intarzieriint main(void) // The main function { // incep programulDDRA=0XB1; // portul A este iesire DDRB=0X00; // portul B este intrarePORTB=0XFF; // pull-up la toti pinii BPORTA=0X00; // Led-ul din pinul 20 este stins if(PORTB == 0x80) // Daca butonul din pinul 10 este apasatPORTA = 0x01 ; // Atunci Led-ul din pinul 20 lumineaza } Link spre comentariu
ole Postat Octombrie 18, 2010 Autor Partajează Postat Octombrie 18, 2010 In primul rand CITESTE DATASHEETUL!!!!!!!!! Acolo se explica foarte clar si cu exemple atat in ASM cat si in C cum se seteaza si cum se citesc porturile. Daca citeai probabil ca nu mai stateai 4 zile sa aprinzi un led. Acum incearca if(PINB&(1<<7)) //testezi starea PINului care te intereseaza (stare care o afli citind registrul PIN nu PORT); starea portului putand fi diferita de 0x80PORTA |=0x01; //setezi bitul 1 din portul A; facand PORTA=0x01; schimbi starea tuturor pinilor de pe PORTA lucru destul de nasol daca ai alte chestii legate pe PORTA si nu trebuiesc schimbate. Once again: cititi oameni buni datasheet-urile ca nu degeaba sunt facute!!!! Link spre comentariu
DarkAngel_Bv Postat Octombrie 23, 2010 Partajează Postat Octombrie 23, 2010 Salutare, cine este dispus sa ma invete cateva chestii basics despre AVR-uri (citire/scriere date, folosire interrupts, cum se foloseste corect baud rate si altele) il rog sa-mi dea add la id-ul dabvnet. Daca as posta doar pe acest topic toate intrebarile ar merge greu treaba :( Multumesc anticipat. Link spre comentariu
ole Postat Noiembrie 14, 2010 Autor Partajează Postat Noiembrie 14, 2010 Am facut putina curatenie in topic. Va rog sa nu mai umpleti topicul de certuri fara rost. Link spre comentariu
srdjan Postat Noiembrie 14, 2010 Partajează Postat Noiembrie 14, 2010 sincer primele datasheet-uri care le-am citit m-au cam lasat in ceata... dupa ce m-am jucat 4-5 ore cu primele microcontrollere am inceput sa inteleg si ce scrie prin datasheet-uri. doresc doar sa subliniez faptul ca nu e suficient sa te duca capul si sa vrei ceva... trebuie sa te si familiarizezi. iar pentru mine forumul a fost un mediu agreabil de familiarizare atat cu electronica in general cat si cu microcontrollerele. Link spre comentariu
ole Postat Noiembrie 14, 2010 Autor Partajează Postat Noiembrie 14, 2010 De acord cu tine. De aceea am facut recent un topic nou "Tutorial - introducere in prog uC Atmel" in care in timp am sa incerc sa explic cum se foloseste fiecare particica din microcontroller ca sa incerc sa le usurez viata incepatorilor. Link spre comentariu
yo9hnf Postat Decembrie 2, 2010 Partajează Postat Decembrie 2, 2010 Am si eu o problema cu un programel de termometru pe 1wire cu DS18B20. Este vorba de cel de mai jos : $regfile "m32def.dat"$crystal = 16000000Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2Declare Sub Convallt ' Convert T on ALL sensorsDeclare Sub Meas_to_cel(offset As Byte)Declare Sub Temp_to_decicelDeclare Sub Disp_temp(cnt As Byte , Offset As Byte)' Up to 8 devices - each having an 8 byte ROMIDConst Max1wire = 8Dim Dsid(64) As Byte ' Dallas ID 64bit inc. CRCDim Sc(9) As Byte ' scratch padDim Cnt1wire As Byte ' Number of 1-wire devices foundDim Cel As IntegerDim Cel_frac_bit As ByteDim Subzero As ByteDim Temp As Integer'Temp variablesDim B As ByteDim B1 As ByteDim B2 As ByteDim I As ByteDim W As WordConst Ds18b20_conf_reg = 4' constant to convert the fraction bits to cel*(10^-4)Const Ds18x20_fracconv = 625' DS18x20 ROM IDConst Ds18s20_id = &H10Const Ds18b20_id = &H28' COMMANDSConst Ds18x20_convert_t = &H44Const Ds18x20_read = &HBEConst Ds18x20_write = &H4EConst Ds18x20_ee_write = &H48Const Ds18x20_ee_recall = &HB8Const Ds18x20_read_power_supply = &HB4'LCD config'Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0'Config Lcd = 16 * 1aConfig 1wire = Portd.4 ' DS1820 on Port B.4 (mega8 pin 18)Cursor OffClsLcd "1-wire DS18x20"Wait 1Cls' Gather ROM ID for all 1-wire devicesCnt1wire = 1wirecount()If Cnt1wire > Max1wire Then Cnt1wire = Max1wireEnd IfB = 1Dsid(b) = 1wsearchfirst()For I = 1 To Cnt1wire B = B + 8 Dsid(b) = 1wsearchnext()Next' Show what we found on the busB1 = 1B2 = 8For I = 1 To Cnt1wire Cls If Dsid(b2) = Crc8(dsid(b1) , 7) Then Lcd "CRC OK sensor " ; I Waitms 500 Cls Lcd "ROM ID " For B = B1 To B2 Lcd Hex(dsid(b)) Next Else Lcd "CRC BAD sensor " ; I End If Wait 1 B1 = B1 + 8 B2 = B2 + 8Next' Monitor temperature sensorsDo Convallt Waitms 750 B = 1 For I = 1 To Cnt1wire If Dsid(b) = Ds18s20_id Or Dsid(b) = Ds18b20_id Then ' Only process TEMP sensors 1wverify Dsid(b) 'Issues the "Match ROM " If Err = 1 Then Cls Lcd "18x20 not on bus" 'where did it go? Elseif Err = 0 Then 1wwrite Ds18x20_read Sc(1) = 1wread(9) If Sc(9) = Crc8(sc(1) , 8) Then Call Disp_temp(i , B) If I < Cnt1wire Then ' if more 1-wire devices. Wait 1 ' SE SETEAZA TIMPUL DE AFISARE PT TEMP 1 End If End If End If End If B = B + 8 NextLoopEnd'Makes the Dallas "Convert T" command on the 1w-bus configured in "Config 1wire = Portb. "'WAIT 200-750 ms after issued, internal conversion time for the sensor'SKIPS ROM - so it makes the conversion on ALL sensors on the bus simultaniously'When leaving this sub, NO sensor is selected, but ALL sensors has the actual'temperature in their scratchpad ( within 750 ms )Sub Convallt 1wreset ' reset the bus 1wwrite &HCC ' skip rom 1wwrite Ds18x20_convert_tEnd Sub' output is:' - cel full celsius' - fractions of celsius in millicelsius*(10^-1)/625 (the 4 LS-Bits)' - subzero =0 positiv / 1 negativSub Meas_to_cel(offset As Byte) Dim Meas As Word Meas = 0 Meas = Makeint(sc(1) , Sc(2)) ' 18S20 is only 9bit upscale to 12bit If Dsid(offset) = Ds18s20_id Then Meas = Meas And &HFFFE Shift Meas , Left , 3 B1 = 16 - Sc(6) B1 = B1 - 4 Meas = Meas + B1 End If If meas.15 = 1 Then Subzero = 1 ' convert to +ve, (two's complement)++ Meas = Meas Xor &HFFFF Incr Meas Else Subzero = 0 End If If Dsid(offset) = Ds18b20_id Then B1 = Sc(ds18b20_conf_reg) ' clear undefined bit for != 12bit If B1.5 = 1 And B1.6 = 1 Then ' 12 bit ' nothing Elseif B1.6 = 1 Then ' 11 bit Meas = Meas And &HFFFE Elseif B1.5 = 1 Then '10 bit Meas = Meas And &HFFFC Else ' 9 bit Meas = Meas And &HFFF8 End If End If Cel = Meas Shift Cel , Right , 4 Cel_frac_bit = Meas And &HFEnd Sub' input: cel, cel_frac_bit, subzero' output: temp (as decicelsius)' ie 289 = 28.9CSub Temp_to_decicel Temp = Cel_frac_bit * Ds18x20_fracconv Temp = Temp / 1000 Cel = Cel * 10 Temp = Temp + Cel If Subzero = 1 Then Restore Rounding For B1 = 1 To 8 Read B2 If Cel_frac_bit = B2 Then Incr Temp Exit For End If Next End IfEnd Sub' Display the temperature' INPUT: tempSub Disp_temp(cnt As Byte , Offset As Byte) Call Meas_to_cel(offset) Call Temp_to_decicel Cls Lcd "TEMP " ; Cnt ; " " If Subzero = 1 Then Lcd "-" Else Lcd "+" End If W = Temp / 10 B1 = Temp Mod 10 Lcd W ; "." ; B1 Lcd " C"End SubRounding:Data 1 , 3 , 4 , 6 , 9 , 11 , 12 , 14Practic "printarea" finala pe LCD se face cu Lcd "TEMP " ; Cnt ; " " + C de la Celsius. Ma intereseaza ca in loc de Cnt sa imi apare IN sau OUT. Am incercat ceva cu If dar nu am reusit...de ex : If Cnt=1 Cnt ="IN" End if Cnt este de tip Byte. Imi prind urechile rau.... ..Si ar mai fi o chestie... Daca am mai multi senzori, programul mi-i arata alternant, cu un delay de 1 secunda : If Dsid(b) = Ds18s20_id Or Dsid(b) = Ds18b20_id Then ' Only process TEMP sensors 1wverify Dsid(b) 'Issues the "Match ROM " If Err = 1 Then Cls Lcd "18x20 not on bus" 'where did it go? Elseif Err = 0 Then 1wwrite Ds18x20_read Sc(1) = 1wread(9) If Sc(9) = Crc8(sc(1) , 8) Then Call Disp_temp(i , B) If I < Cnt1wire Then ' if more 1-wire devices. [b]Wait 1[/b] ' SE SETEAZA TIMPUL DE AFISARE PT TEMP 1 End If End If End If End IfDaca eu modific acel Wait 1 scris mai sus cu bold, atunci imi ramane afisat pentru X secunde doar TEMP 1, iar TEMP 2 este tot de 1 secunda. Cum le pot modifica ? Multumesc ! PS : Codul original este de aici http://www.dbzoo.com/atmel/ds18b20 Link spre comentariu
yo9hnf Postat Decembrie 2, 2010 Partajează Postat Decembrie 2, 2010 am rezolvat ceva : If I = 1 Then Lcd "Temp In: " ; " " End If If I = 2 Then Lcd "TempOUT: " ; " " End If Acum imi arata TEMP In si TEMP Out...dar tot nu stiu cum sa modific timpul de afisare... L-am pacalit sa-mi afiseze si semnul de grad celsius. Link spre comentariu
yo9hnf Postat Decembrie 3, 2010 Partajează Postat Decembrie 3, 2010 Inca o chestie....Conform aplicatiei An#111 de la BASCOM, temperatura este afisata cu 3 cifre, gen 123 ca fiind 12.3 grade.Ce trebuie sa fac ca temperatura sa-mi apara 12.3, deci cu virgula ?Am incercat sa impart numarul obtinut la 10, declarand o variabila pe care sa mi-o printeze, ca integer....deci numar intreg, deci nu are virula.Daca ii dau variabila SINGLE, imi pune Ţşpe zecimale dupa virgula. Link spre comentariu
iulian2010 Postat Decembrie 3, 2010 Partajează Postat Decembrie 3, 2010 Salut, '-----------------------------------------------------------------------------------------'copyright : (c) 2008-2009, AVRprojects.info'purpose : DS1820 / DS18S20 Temperature Indicator'-----------------------------------------------------------------------------------------'$sim$regfile = "m8515.dat" ' specify the used micro$crystal = 8000000 ' used crystal frequencyDeclare Sub Read1820Config 1wire = Portd.7Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0'Temp variablesDim Bd1 As ByteDim Bd2 As ByteDim Bd7 As ByteDim Bd8 As ByteDim I As Byte , Tmp As ByteDim T As Integer , T1 As IntegerDim Bd(9) As Byte 'Scratchpad 0-8 72 bits incl CRC, explanations for DS1820'Sc(1) 'Temperature LSB'Sc(2) 'Temperature MSB'Sc(3) 'TH/user byte 1 also SRAM'Sc(4) 'TL/user byte 2 also SRAM'Sc(5) 'config also SRAM x R1 R0 1 1 1 1 1 - the r1 r0 are config for resolution - write FF to byte for 12 bit - others dont care'Sc(6) 'res'Sc(7) 'res'Sc(8) 'res'Sc(9) '8 CRC'DALLAS DS1820 ROM and scratchpad commands''''''''''''''''''''''''''1wwrite....'&H 33 read rom - single sensor'&H CC skip rom'&H BE read scratchpad'&H 44 convert T' Main loopClsCursor OffDo 1wwrite &HCC : 1wwrite &H44 ' start measure Waitms 400 ' wait for end of conversion Read1820 Wait 1LoopEnd 'end program'Read the DS1820 by skipping the ROM checking, since we are using only 1 sensorSub Read1820 ' reads sensor ans calculate ' T for 0.1 C 1wreset ' reset the bus 1wwrite &HCC ' read internal RAM 1wwrite &HBE ' read 9 data bytest Bd(1) = 1wread(9) Bd1 = Bd(1) Bd2 = Bd(2) Bd7 = Bd(7) Bd8 = Bd(8) ' read bytes in array 1wreset ' reset the bus Tmp = Bd1 And 1 If Tmp = 1 Then Decr Bd1 ' 0.1C precision T = Bd1 T = T * 50 T = T - 25 T1 = Bd8 - Bd7 T1 = T1 * 100 T1 = T1 / Bd8 T = T + T1 T1 = T / 100 'store tens T = T Mod 100 'store decimal number Cls Locate 1 , 3 Lcd "Temperature" Locate 2 , 7 Lcd T1 ; "," ; TEnd SubEnd Link spre comentariu
nickrvl Postat Decembrie 8, 2010 Partajează Postat Decembrie 8, 2010 Incerc cu un ATtiny13 sa citesc o tensiune oarecare, atunci cind e depasita (tensiunea) sa faca ceva bla bla bla....e capabil acesta de asa ceva?pentru ca in Bascom nu pot, asta am incercat $regfile = "ATtiny13.DAT"$crystal = 1000000Config Portb.0 = OutputPortb.0 = 0Config Portb.5 = InputPortb.5 = 0Dim V As BitConfig Adc = Single , Prescaler = Auto , Reference = AvccStart AdcDoV = Getadc(0)V = V + 1Wait 1LoopEndSI asta e eroarea:[attachment=0]bas.jpg[/attachment] Link spre comentariu
ole Postat Decembrie 8, 2010 Autor Partajează Postat Decembrie 8, 2010 Poate ai vrut sa scrii "dim V as byte" Link spre comentariu
yo9hnf Postat Decembrie 8, 2010 Partajează Postat Decembrie 8, 2010 iulian2010, iti multumesc pentru program. Problema e ca afiseaza circa 76 la temperatura ambianta, deci banuiesc ca afiseaza in Fehrenheit. Link spre comentariu
ole Postat Decembrie 8, 2010 Autor Partajează Postat Decembrie 8, 2010 Ca sa faci conversia in celsius scazi 32 si imparti la 1.8. Vezi daca se potriveste temperatura afisata cu ce ar trebui sa masoare. Link spre comentariu
yo9hnf Postat Decembrie 8, 2010 Partajează Postat Decembrie 8, 2010 Ca sa faci conversia in celsius scazi 32 si imparti la 1.8. Vezi daca se potriveste temperatura afisata cu ce ar trebui sa masoare.Asa am facut. Initial am scazut si eu 32, dar imi iesea peste 40. Acum imi arata 23.62 gr. Celsius...dar de unde ai luat 1.8 pentru ca nu-mi dau seama acum ? Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum