 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
stursc Član

Pridružen-a: Tor 08 Jun 2004 14:29 Prispevkov: 323 Aktiv.: 1.36
|
Objavljeno: Sre Sep 10, 2008 8:38 am Naslov sporočila: |
|
|
@robika
Bom pripravil kodo (delujočo) in ti poslal - malo potrpljenja
Kaj pa jaz hočem doseči z tem branjem pa očitno ne razumeš.
Hočem med obratovanjem ugotavljat prisotnost oziroma pravilno branje temperatrnega senzorja.
LP, stursc |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3360 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Čet Sep 11, 2008 11:10 am Naslov sporočila: |
|
|
stursc je napisal/a: |
@robika
Hočem med obratovanjem ugotavljat prisotnost oziroma pravilno branje temperatrnega senzorja.
|
Pozdravljen Srečko?
Ali ne bi bila v ta namen dovolj CRC8 preverka?
Prilagam primer, kjer je vgrajena crc8 preverka.
Imam občutek, da želiš ti nekaj drugega, saj s termometri imaš veliko izkušenj in to prav gotovo poznaš.
Koda: |
Const Program = "DS18x20-test"
'(
Dallasovi termometri DS1820, DS18B20 in DS18S20 so zelo priljubljeni, ker so prijazni
in dajo temperaturo kar v stopinja, ni potrebna kalibracija.
1wire ukazi so prijazni, ko jih enkrat razumeš, in logični.
Nerodno pa je to, da DS18B20 termometri dajejo rezultat v drugačnem formatu kot
ostala dva tipa. Človek nepričakovano naleti na problem, ko hoče prebrati temperaturo,
ker take nedoslednosti od Dallas ni pričakoval.
Zato sem naredil podprogram DS18X20, ki sam ugotovi od katerega termometra je informacija
in jo ustrezno predela v stopinje Celzija.
Za slučajne napake in celo morebitno škodo ne odgovarjam. Uporaba je svobodna, a
na vašo lastno odgovornost.
Podprogram sem imenoval Centigradi, ker daje rezultat v spremenljivko tipa integer
v desetinkah stopinje, torej bo v njej število 50 kar pomeni 5 stopinj Celzija.
Vhodna informacija je 9-bajtno polje, v katerega ste prebrali ram iz termometra
')
$regfile = "m32def.dat"
$crystal = 11059200
$baud = 19200
$hwstack = 64
$swstack = 64
$framesize = 64
'splošne delovne spremenljivke - v vseh programih jih običajno definiram tako:
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim L As Byte
Dim M As Byte
Dim W As Integer
' SWUART Output za pisanje PC Portd.2
Open "comd.2:9600,8,n,1" For Output As #2
Print #2 , Program ; " Reset."
' Definiramo pin za 1wire
Config Portc.7 = Output
Config 1wire = Portc.7
' Polje Termometer(9) uporabljamo tako za identifikacijo termometra
' kot tudi, da vanj beremo podatke iz termometra:
Dim Termometer(9) As Byte
' v sledeči spremenljivki dobim iz podprograma rezultat v desetinkah stopinje C
Dim Temperatura As Integer
' temperaturo pretvorim v spremenljivko tipa Single, da je lažje izpisati
Dim Tsingle As Single
Do
' vsem termometrom na 1wire bus-u damo ukaz, pretvori temperaturo v ram
1wreset
1wwrite &HCC 'skip ROM
1wwrite &H44 'convert temperature
1wreset
Wait 1
' Identifikacijo prvega termometra prenesemo v polje
For I = 1 To 8
Termometer(i) = Lookup(i , Termid1)
Next
' Beremo podatke prvega termometra v polje Termometer(9)
1wreset 'reset
1wwrite &H55 'match ROM
1wwrite Termometer(1) , 8
1wwrite &HBE 'READ Scratchpad
Termometer(1) = 1wread(9)
1wreset
' Prebrano prikažemo na ekranu PC-a:
For J = 1 To 9
Print #2 , Hex(termometer(j));
Next
Print #2 , " ";
If Crc8(termometer(1) , 9) = 0 Then
Print #2 , "CRC8 OK ";
Else
Print #2 , "CRC8 NOT OK ";
End If
' kličemo podprogram za prevod prebranega v stopinje C
Gosub Ds18x20
' rezultat dobim v spremenljivki Temperatura
Tsingle = Temperatura / 10
Print #2 , "T1=" ; Tsingle ; "C"
' In še enako za drugi termometer: -------------------------
' Identifikacijo drugega termometra prenesemo v polje
For I = 1 To 8
Termometer(i) = Lookup(i , Termid1)
Next
' Beremo podatke drugega termometra v polje Termometer(9)
1wreset 'reset
1wwrite &H55 'match ROM
1wwrite Termometer(1) , 8
1wwrite &HBE 'READ Scratchpad
Termometer(1) = 1wread(9)
1wreset
' Prebrano prikažemo na ekranu PC-a:
For J = 1 To 9
Print #2 , Hex(termometer(j));
Next
Print #2 , " ";
If Crc8(termometer(1) , 9) = 0 Then
Print #2 , "CRC8 OK ";
Else
Print #2 , "CRC8 NOT OK ";
End If
' kličemo podprogram za prevod prebranega v stopinje C
Gosub Ds18x20
' rezultat dobim v spremenljivki Temperatura
Tsingle = Temperatura / 10
Print #2 , "T2=" ; Tsingle ; "C"
' In nazaj v zanko
Loop
' Podprogram, zaradi katerega to objavljam in ki neodvisno od tipa termometra
' da pravilni rezultat v stopinjah je sledeč:
Ds18x20:
' vhodni podatki so v Termometer(9) tipa bajt,
' izhod v Temperatura tipa Integer v desetinkah stopinje C
Temperatura = Makeint(termometer(1) , Termometer(2))
If Termometer(5) = &H7F Then
' za termometer DS18B20
Temperatura = Temperatura * 10
Temperatura = Temperatura / 16
Else
' za ostala dva tipa termometrov
Temperatura = Temperatura * 5
End If
Return
' Identifikaciji termometrov z dodanim bajtom 00 izpred za enostavno prenašanje
' z lookup ukazom:
Termid1:
Data &H00 , &H28 , &H1B , &HDB , &H53 , &H00 , &H00 , &H00 , &HC3
Termid2:
Data &H00 , &H10 , &H13 , &HC5 , &H4C , &H01 , &H08 , &H00 , &H26
Close #2[quote][/quote] |
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
stursc Član

Pridružen-a: Tor 08 Jun 2004 14:29 Prispevkov: 323 Aktiv.: 1.36
|
Objavljeno: Pet Sep 12, 2008 12:33 pm Naslov sporočila: |
|
|
Vilko, bom na mail poslal moj test in razlago
LP, stursc |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 494 dni
Powered by phpBB © 2001, 2005 phpBB Group
|