Vizitator nicaflorin Postat Octombrie 20, 2009 Partajează Postat Octombrie 20, 2009 cumpar un program pentru pic 16f84 facut in asembler . in care picu trebuie sa comunice cu un senzor de temperatura ds18b20 ;practic este un termometru cu senzorul de temperatura ds18b20 care lucreaza cu mc pic16f84 ma intereseaza mai mult sa vad cum se face un program de pic si cum se poate face comunicarea cu ds18b20 va multumesc si astept oferte stiu deja adresele de net;http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf http://www.google.ro/imgres?imgurl=http ... CCMQ9QEwBg http://www.rentron.com/PicBasic/PBP1-wire.htm[size=150 ceva de genu de program ca asta dar mai simplu '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '* Universal thermostat -25/+75 C. by R.T.G. van Steenis * '* Digital thermostat (080090-11) from Elektor july_august 2008 * '* Compiler ] ' Init Sensor 1 OWOut DQ, 1, [$55, $28, $DD, $06, $49, $1, $0, $0, $D4, $48] OWOut DQ, 1, [$55, $28, $DD, $06, $49, $1, $0, $0, $D4, $B8] OWOut DQ, 1, [$55, $28, $DD, $06, $49, $1, $0, $0, $D4, $BE] Pause 1000 OWIn DQ, 0, [Temperature1.Byte0, Temperature2.Byte1] LcdOut $FE, $80, "Senzor1 INIT OK" Pause 500 OWOut DQ, 1, [$55, $28, $EB, $EA, $48, $1, $0, $0, $FF, $4E, $FF, $FF, $7F] ' Init Sensor 2 OWOut DQ, 1, [$55, $28, $EB, $EA, $48, $1, $0, $0, $FF, $48] OWOut DQ, 1, [$55, $28, $EB, $EA, $48, $1, $0, $0, $FF, $B8] OWOut DQ, 1, [$55, $28, $EB, $EA, $48, $1, $0, $0, $FF, $BE] Pause 1000 OWIn DQ, 0, [Temperature2.Byte0, Temperature2.Byte1] LcdOut $FE, $C0, "Senzor2 INIT OK" Pause 1000 MainLoop: If PORTB.0=0 then ' Mode switch pressed Pause 50 ' Debounce LcdOut $FE, 1 LcdOut $FE, $8F, "*" ' Show that command is accepted If PORTB.0=0 then MainLoop ' Wait until button is released Mode=Mode+1 ' Increment mode If Mode=2 then ' Save Target Temperature (Mode1 -> Mode2) Write 0, TargetTemp / 256 ' TargetTemp MSB Write 1, TargetTemp MOD 256 ' TargetTemp LSB EndIf If Mode > 2 Then ' Save Hysteresis (Mode 2 -> Mode 0) Mode=0 ' Only 0, 1, 2 are valid Write 2, Hyst / 10 ' Divide Hyst value to fit in Byte EndIf EndIf If Mode =1 then LcdOut $FE, $80, "SET TEMPERATURE " ' Show function V=TargetTemp ' TargetTemp in V Gosub SelectSign ' Select +/blank/- Gosub DTemp ' Display Target Temperature If (PORTB.1=0) Or (PORTB.2=0) then ' Up or Down button pushed If PORTB.2=0 then ' Down button If TargetTemp > 7500 then ' Not lower than -25 C. (10000-MinTemp * 100) TargetTemp=TargetTemp-25 ' Decrease temperuture with 0.25 C. EndIf EndIf If PORTB.1=0 then ' Up button If TargetTemp < 17500 then ' Not higher than 75 C. (10000+MaxTemp * 100) TargetTemp=TargetTemp+25 ' Increase temperature with 0.25 C. EndIf EndIf GoSub SetTargetTemp ' Display TargetTemp and delay 0.25 Sec. EndIf EndIf If Mode=2 then ' Set Hysteresis LcdOut $FE, $80, "SET HYSTERESIS " ' Show function Sign=" " ' No sign V= 10000+Hyst ' Set value for V Gosub DTemp ' Display Hysteresis If (PORTB.1=0) Or (PORTB.2=0) then ' Up or down button pushed Sign=" " ' No sign for Hysteresis If PORTB.2=0 then ' Down button If Hyst > 10 then Hyst=Hyst-10 ' Not less than 0.1 C. EndIf If PORTB.1=0 then ' Up button If Hyst < 1000 then Hyst=Hyst+10 ' Not more than 10.0 C. EndIf V= 10000+Hyst ' Set value for V Gosub DTemp ' Display Hysteresis Pause 250 ' Delay 0.25 Sec. EndIf EndIf If Mode > 0 then Mainloop ' Setting TargetTemperature or Hysteresis Output DQ ' Make Pin Output DQ=0 ' OneWire line Low PauseUs 480 ' Keep down for 480 ?S Input DQ ' Make Pin Input PauseUs 70 ' Wait 70 ?S If DQ=1 then ' No presence pulse from DS1820 LcdOut $FE, $1, "** No sensor! **" ' Show message Pause 500 ' Wait 0.5 Sec. Goto MainLoop ' Check again EndIf '=================================================================================================== Main : Part1: OWOut DQ, 1, [$55, $28, $DD, $06, $49, $1, $0, $0, $D4, $44] ' Start temp. conversion Sensor1 WaitLoop: While not DQ Wend OWOut DQ, 1, [$55, $28, $DD, $06, $49, $1, $0, $0, $D4, $BE] Pause 500 OWIn DQ, 0, [Temperature1.Byte0, Temperature1.Byte1] If Temperature1.15 then Temperature1= ~Temperature1 +1 Twist = 1 Endif Dummy = 625 * Temperature1 TempC = DIV32 10 TempC = (Temperature1 & $7FF) >> 4 Float = ((Temperature1.Lowbyte & $0F ) * 25 )>>2 Temperature1 = TempC*100 + Float If Twist then V= 10000 - Temperature1 ' 25 C=12500 0 C=10000 -10 C=9000 Twist = 0 else V= 10000 + Temperature1 EndIf If V >= 10000 then ' Above 0 C. Temperature1=V-10000 Else Temperature1=10000-V ' Below 0 C. EndIf GoSub SelectSign ' +/blank/- Sign GoSub DisplayTemp ' Temperature to LCD '=================================================================================================== Part2 : OWOut DQ, 1, [$55, $28, $EB, $EA, $48, $1, $0, $0, $FF, $44] ' Start temp. conversion Sensor2 WaitLoop2: While not DQ Wend OWOut DQ, 1, [$55, $28, $EB, $EA, $48, $1, $0, $0, $FF, $BE] Pause 500 OWIn DQ, 0, [Temperature2.Byte0, Temperature2.Byte1] If Temperature2.15 then Temperature2= ~Temperature2 +1 Twist2 = 1 Endif Dummy = 625 * Temperature2 TempC = DIV32 10 TempC = (Temperature2 & $7FF) >> 4 Float = ((Temperature2.Lowbyte & $0F ) * 25 )>>2 Temperature2 = TempC*100 + Float If Twist2 then V2= 10000 - Temperature2 ' 25 C=12500 0 C=10000 -10 C=9000 Twist2 = 0 else V2= 10000 + Temperature2 EndIf If V2 >= 10000 then ' Above 0 C. Temperature2=V2-10000 Else Temperature2=10000-V2 ' Below 0 C. EndIf GoSub SelectSign ' +/blank/- Sign GoSub DisplayTemp ' Temperature to LCD Goto MainLoop ' Do it forever ' SUBROUTINES: '=================================================================================================== SelectSign: If v = 10000 then ' Temperature = 0 C. Sign=" " ' No sign Else If v < 10000 then ' <> 0 Sign="-" ' Temperature below 0 C. Else Sign="+" ' Temperature above 0 C. EndIf EndIf If v2 = 10000 then ' Temperature = 0 C. Sign=" " ' No sign Else If v2 < 10000 then ' <> 0 Sign="-" ' Temperature below 0 C. Else Sign="+" ' Temperature above 0 C. EndIf EndIf Return '=================================================================================================== DisplayTemp: If V >= 10000 then ' Above 0 C. Temperature1=V-10000 Else Temperature1=10000-V ' Below 0 C. EndIf If V2 >= 10000 then ' Above 0 C. Temperature2=V2-10000 Else Temperature2=10000-V2 ' Below 0 C. EndIf LcdOut $FE, $80, "INT : ", Sign," ", DEC (Temperature1 / 100), ".", DEC2 Temperature1, " ",223,"C " LcdOut $FE, $C0, "EXT : ", Sign," ", DEC (Temperature2 / 100), ".", DEC2 Temperature2, " ",223,"C " Return '=================================================================================================== SetTargetTemp: V=TargetTemp Gosub SelectSign Gosub DTemp Pause 250 Return '=================================================================================================== DTemp : If V >= 10000 then ' Above 0 C. Temperature1=V-10000 Else Temperature1=10000-V ' Below 0 C. EndIf LcdOut $FE, $C0, Sign," ", DEC (Temperature1 / 100), ".", DEC2 Temperature1, " ",223,"C " Return '============================================= END OF PROGRAM ====================================== Link spre comentariu
sofian Postat Octombrie 20, 2009 Partajează Postat Octombrie 20, 2009 uite aici un exemplu de program http://www.nomad.ee/PIC/ds1820.asm Link spre comentariu
kit Postat Octombrie 20, 2009 Partajează Postat Octombrie 20, 2009 Am extras dintr-un proiect propriu partea de conversie a temperaturii, pentru DS1820, am atasat-o.Trecerea de la DS1820 la DS18B20 este extrem de simpla, asa ca nu am vrut sa-ti rapesc din placerea de a o incerca.Conversia mea este un extrem de simpla, citeste doar primii doi octeti, restul ii baga-n reset.Conversia se face pasand valoarea de convertit registrului 'conv'. In cazul DS18B20 va trebui sa faci ajustarea (repet, simpla) valorii ce convertit, de la primul octet (ds0, pentru DS1820) la valoarea temperaturii in cazul DS18B20.Bafta!PS: dupa ceva truda am reusit sa fac sa mearga DS-ul sub C. Ar putea fi o alternativa serioasa la Basic. Oricum, codul postat de tine pare a fi facut la modul serios, nu pe genunchi (ca al meu).Era sa uit: e moca, bineinteles. Link spre comentariu
fratello Postat Octombrie 21, 2009 Partajează Postat Octombrie 21, 2009 Programul din primul post este modificat de mine. In el gasesti tot ce iti trebuie : citirea senzorului DS18B20 sau/si citirea a doi senzori pe acelasi pin al PIC-ului (one-wire). Renunti la partea de termostat, renunti la citirea si afisarea a doua temperaturi si ai ce ti-ai dorit...doar modifici configuratia pentru 16F84...citind, bineinteles, inainte data-sheet-ul acestuia ! Pe undeva prin forum am pus si codul pentru termometru cu display de Nokia 3310, si codul pentru ceas si termometru. Si toate sunt scrise in PicBasicPro. Eu am invatat sa programez in PBP in doua saptamani...este super !Succes ! Link spre comentariu
Vizitator nicaflorin Postat Octombrie 22, 2009 Partajează Postat Octombrie 22, 2009 Am extras dintr-un proiect propriu partea de conversie a temperaturii, pentru DS1820, am atasat-o.Trecerea de la DS1820 la DS18B20 este extrem de simpla, asa ca nu am vrut sa-ti rapesc din placerea de a o incerca.Conversia mea este un extrem de simpla, citeste doar primii doi octeti, restul ii baga-n reset.Conversia se face pasand valoarea de convertit registrului 'conv'. In cazul DS18B20 va trebui sa faci ajustarea (repet, simpla) valorii ce convertit, de la primul octet (ds0, pentru DS1820) la valoarea temperaturii in cazul DS18B20.Bafta!PS: dupa ceva truda am reusit sa fac sa mearga DS-ul sub C. Ar putea fi o alternativa serioasa la Basic. Oricum, codul postat de tine pare a fi facut la modul serios, nu pe genunchi (ca al meu).Era sa uit: e moca, bineinteles. multumesc mutl esti un domn Link spre comentariu
Vizitator nicaflorin Postat Octombrie 22, 2009 Partajează Postat Octombrie 22, 2009 Programul din primul post este modificat de mine. In el gasesti tot ce iti trebuie : citirea senzorului DS18B20 sau/si citirea a doi senzori pe acelasi pin al PIC-ului (one-wire). Renunti la partea de termostat, renunti la citirea si afisarea a doua temperaturi si ai ce ti-ai dorit...doar modifici configuratia pentru 16F84...citind, bineinteles, inainte data-sheet-ul acestuia ! Pe undeva prin forum am pus si codul pentru termometru cu display de Nokia 3310, si codul pentru ceas si termometru. Si toate sunt scrise in PicBasicPro. Eu am invatat sa programez in PBP in doua saptamani...este super !Succes ! multumesc de ajuror salut ploiestiu Link spre comentariu
Vizitator nicaflorin Postat Octombrie 22, 2009 Partajează Postat Octombrie 22, 2009 am rezolvat problema multumesc de ajutor raman dator,,, Link spre comentariu
Vizitator nicaflorin Postat Octombrie 22, 2009 Partajează Postat Octombrie 22, 2009 va mai dau o poza Link spre comentariu
Vizitator nicaflorin Postat Octombrie 22, 2009 Partajează Postat Octombrie 22, 2009 asta Link spre comentariu
Vizitator nicaflorin Postat Octombrie 22, 2009 Partajează Postat Octombrie 22, 2009 trebuie neaparat rezistenta de 4k7, nu pot sa mai trimit poze nu ma lasa pagina zice ca sunt prea mari Link spre comentariu
Vizitator nicaflorin Postat Octombrie 22, 2009 Partajează Postat Octombrie 22, 2009 alta alta incerc Link spre comentariu
Vizitator nicaflorin Postat Octombrie 22, 2009 Partajează Postat Octombrie 22, 2009 ............................................... 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