Zawarte fragmenty programów dotyczą czujników DS18S20 i DS18B20. Procedury obsługi tych układów nie różnia się od siebie w prostych zastosowaniach, poza sposobem obliczania temperatury na podstawie odczytanych wartości z rejestrów czujników.
Język Bascom AVR
Odczyt 8 bajtów numeru seryjnego DS18S20 lub DS18B20 gdy na magistrali jest tylko jeden układ. Numer seryjny zostanie zapisany do zmiennej tablicowej Ds:
Config 1wire = Pind.7
Dim Ds(8) As Byte
1wreset
1wwrite &H33
Ds(1) = 1wread(8):
Uruchomienie konwersji temperatury przez wszystkie czujniki podłączone do magistrali 1-wire. Po wydaniu rozkazu konwersji należy odczekać pewien czas (max 750ms) przed przystąpieniem do odczytu temperatury:
Config 1wire = Pind.7
1wreset
1wwrite &HCC
1wwrite &H44
Odczyt zawartości dwóch pierwszych rejestrów układu DS18x20, zawierających informację o wartości temperatury w przypadku gdy na magistrali jest tylko jeden czujnik.
…
1wreset
1wwrite &HCC
1wwrite &HBE
Lsb = 1wread():
Msb = 1wread():
1wreset
Dla większej ilości czujników podłączonych do jednej magistrali odczytujemy dane z jednego układu wykorzystując jego numer seryjny odczytany wcześniej i zapisany do zmiennej tablicowej Ds(8 bajtów).
…
1wreset
1wwrite &H55
1wwrite Ds(1) , 8
1wwrite &HBE
Lsb = 1wread():
Msb = 1wread():
1wreset
Po odczytaniu bajtów Msb i Lsb wykonujemy oblicznia temperatury.
Układ DS18S20:
Dim Temp As Single
…
If Msb = 0 Then
Temp = Lsb / 2
Else
Lsb = Not Lsb
Lsb = Lsb +1
Temp = Lsb/2
Temp = Temp * (-1)
End If
Układ DS18B20:
Dim Temp As Single
Dim Tempa As Integer
…
Tempa = Msb * 256
Tempa = Tempa + Lsb
If Msb.7 = 0 Then
Temp = Tempa / 16
Else
Tempa = Not Tempa
Tempa = Tempa +1
Temp = Tempa / 16
Temp = Temp * (-1)
End If
Poniżej przedstawiony jest cały prosty program testowy do obsługi dwóch czujników (DS18S20 i DS18B20) podłączonych na jednej magistrali. Całość została uruchomiona na Płytce Testowej opisanej w dziale projekty. Wskazania temperatury wyświetlane są na wyświetlaczu LCD
'***********************************************
'Konfiguracja AVR
'***********************************************
$regfile = „m162def.dat”
$crystal = 16000000
$baud = 2400
Config Porta = 255
Porta = 255
Config Portb = 255
Portb = 255
Config Portc = 255
Portc = 255
Config Portd = 255
Portd = 255
Config Porte = 255
Porte = 255
'Config Scl = Portd.6
'Config Sda = Portd.7
'I2cinit
Config 1wire = Pind.7
Config Lcdpin = Pin , Db4 = Porta.5 , Db5 = Porta.4 , Db6 = Porta.3 , Db7 = Porta.2 , E = Porta.0 , Rs = Porta.1
Config Lcd = 20 * 2
Cls
Cursor Off Noblink
'Config Int0 = Falling
'Enable Int0 : On Int0 Przerw_zewn
'Config Timer0 = Timer , Prescale = 64
'Enable Timer0 : On Timer0 Przerwanie1
'Config Timer1 = Timer , Prescale = 8
'Enable Timer1 : On Timer1 Przerwanie2
Enable Interrupts
'///////////////////////////////////////////////
'***********************************************
'Zmienne
'***********************************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Tempa As Single
Dim Ds1(8) As Byte , Ds2(8) As Byte
Dim Tekst1 As String * 10
Dim Tekst2 As String * 10
'///////////////////////////////////////////////
Lcd „test DS18B20”
Wait 1
'Numery wpisane na sztywno
Ds2(1) = 40
Ds2(2) = 55
Ds2(3) = 181
Ds2(4) = 1
Ds2(5) = 1
Ds2(6) = 0
Ds2(7) = 0
Ds2(8) = 207
Ds1(1) = 16
Ds1(2) = 171
Ds1(3) = 224
Ds1(4) = 167
Ds1(5) = 0
Ds1(6) = 8
Ds1(7) = 0
Ds1(8) = 220
Do
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 250
Waitms 250
1wreset
1wwrite &H55
1wwrite Ds2(1) , 8
1wwrite &HBE
Lsb = 1wread():
Msb = 1wread():
Tempa = Msb * 256
Tempa = Tempa + Lsb
Tempa = Tempa / 16
Tekst1 = Fusing(tempa , „#.##”)
1wreset
1wwrite &H55
1wwrite Ds1(1) , 8
1wwrite &HBE
Lsb = 1wread():
Msb = 1wread():
Tempa = Lsb / 2
Tekst2 = Fusing(tempa , „#.#”)
Cls
Lcd „DS18B20= ” ; Tekst1
Lowerline
Lcd „DS18S20= ” ; Tekst2
Loop
End
Materiał nadesłał użytkownik : Elektron