Sari la conținut
ELFORUM - Forumul electronistilor

cumpar un program pentru pic 16f84 termometru ds18b20 in asm


Vizitator nicaflorin

Postări Recomandate

Vizitator nicaflorin

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
  • Răspunsuri 11
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • sofian

    1

  • kit

    1

  • fratello

    1

Top autori în acest subiect

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

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

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

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări