1 Wire.pdf

(587 KB) Pobierz
ep_11_083-086.indd
B A S C O M O W E P O R A D Y
Rubryka ta powstałała z myślą o rozwiązywaniu problemów, jakie najczęściej spotykają programiści. W tym „kąciku”
będziemy się starać w miarę przystępnie przedstawiać rozwiązania tych problemów. Zatem zachęcamy wszystkich
Czytelników do ich zgłaszania.
Bascom i 1-Wire
W tym odcinku zajmiemy się opisem dostępu do układów
dołączonych do magistrali 1Wire z poziomu Bascoma.
Jak pewnie część z Czytelników EP wie, jest to magistrala
zaprojektowana przez firmę Dallas (obecnie Maxim-Dallas).
Magistrala ta używa jednego przewodu do zasilania i przesyłania
danych oraz oczywiście przewodu masy.
Gdy magistrala 1Wire jest wol-
na (czyli nie odbywa się żadna trans-
misja), na linię danych jest podawa-
ne napięcie +5 V, co powoduje na-
ładowanie wewnętrznego kondensato-
ra buforującego zasilanie w układzie
dołączonym do magistrali (uproszczo-
ny schemat blokowy ilustrujący budo-
wę układu DS1990 pokazano na rys.
1 ). Ładunek zgromadzony w konden-
satorze jest wykorzystywany do zasi-
lania układu podczas transmisji. Nie-
które układy z interfejsem 1Wire mają
dodatkowe wyprowadzenie, do które-
go jest podłączane dodatkowe napięcie
zasilające +5 V. Jest to rozwiązanie
stosowane przy transmisjach na duże
odległości, które znacząco skraca czas
przesyłania informacji (np. w DS18B20
z 750 ms do 250 ms).
Przy projektowaniu urządzeń
z użyciem 1Wire trzeba wziąć pod
uwagę kwestie zasilania oraz czasu
odczytu i konwersji parametrów. Naj-
częściej stosuje się metodę zasilania
z tzw. rezystorem pull - up . Do podłą-
czenia układów 1Wire na krótkie od-
ległości (20...30 m) możemy zastoso-
wać zwykły przewód telefoniczny, na-
tomiast dla połączeń dłuższych zdecy-
dowanie korzystniej jest użyć skrętki
(Dallas zaleca UTP kategorii 5, lecz
Fot. 2
Do magistrali 1Wire można pod-
łączyć wiele układów, takich jak np.
czujniki wartości nieelektrycznych (np.
opisany w dalszej części artykułu czuj-
nik temperatury DS1820), potencjome-
try, przekaźniki, a także układy iBut-
ton (czyli układy montowane w meta-
lowych kapsułkach, jak na fot. 2 ).
Do zilustrowania sposobu obsługi
magistrali 1Wire wykorzystamy cieszą-
cy się od lat popularnością termometr
DS1820 oraz jego zmodyfikowaną, uno-
wocześnioną wersję – DS18B20. Układ
DS1820 jest przedstawicielem scalo-
nych termometrów z serii 1Wire, pod-
łączanych do mikrokontrolera za po-
mocą jednej linii I/O. Typowy sposób
podłączenia układu DS1820 do proce-
sora przedstawiono na rys. 3 .
Jak widać, do pracy układu jest
jeszcze potrzebny rezystor „podciąga-
jący” linię danych I/O do plusa za-
silania. Nie jest on co prawda nie-
zbędny, jednak producent zaleca takie
właśnie podłączenie. Z doświadczenia
wynika, że zastosowanie go zdecydo-
wanie polepsza warunki transmisji,
zwykła skrętka, np. alarmowa, tak-
że będzie poprawnie działać). Według
informacji udostępnionych przez au-
tora BASCOM-a procedura przeszuki-
wania magistrali umożliwia znalezie-
nie do około 50 elementów na se-
kundę, a odczytywanie danych z róż-
nych układów powinno być możliwe
dla 13 urządzeń na sekundę. W no-
cie katalogowej DS1990A można zna-
leźć informację, że odczyt numeru se-
ryjnego pastylki nie powinien przekro-
czyć 10 ms.
Rys. 1
Rys. 3
Elektronika Praktyczna 11/2004
83
32852842.026.png 32852842.027.png 32852842.028.png 32852842.029.png 32852842.001.png 32852842.002.png 32852842.003.png 32852842.004.png 32852842.005.png 32852842.006.png 32852842.007.png 32852842.008.png 32852842.009.png
 
B A S C O M O W E P O R A D Y
Rys. 4
nej wartości na stopnie Celsjusza.
Magistralę 1Wire ustawiamy w stan
gotowości do pracy poleceniem 1reset .
Jak można zauważyć, polecenie zaczy-
na się od 1w ... i jest regułą, że wszyst-
kie polecenia dotyczące magistrali 1Wi-
re zaimplementowane w Bascomie za-
czynają się od 1w ....
W zależności od tego, ile ukła-
dów dołączono do magistrali 1Wire,
można zastosować dwa sposoby jej
przeszukiwania. Przy dołączonym jed-
nym układzie można od razu użyć
funkcji 1wsearchfirst (), która zwra-
ca pierwszy znaleziony numer urzą-
dzenia z magistrali 1Wire. Przy dołą-
czonych do magistrali kilku układach
(jak na rys. 5 ) najlepiej użyć zesta-
wu kilku funkcji, a mianowicie: 1wi-
recount (), 1wsearchfirst (), 1wsearch-
next (). Pierwsza z nich zwraca licz-
bę dostępnych układów, co można
wykorzystać do identyfikacji dołączo-
nych układów. Kolejne polecenie po-
daje numer seryjny pierwszego znale-
zionego układu. Ostatnie z wymienio-
nych poleceń podaje numer następne-
go (kolejnego) układu. Wyboru doce-
lowego układu 1Wire realizujemy, za-
pisując kolejno numer funkcji wyboru
zwłaszcza przy współpracy z proceso-
rami AVR. Rezystancja tego rezystora
powinna wynosić około 3,3...4,7 kV,
jednak przy podłączeniu większej licz-
by układów lub podłączeniu ich za
pomocą dłuższych, kilkumetrowych
przewodów, można wartość rezystancji
zmniejszyć do około 1 kV.
Drugim popularnym układem
z rodziny DS1820 jest układ ozna-
czony symbolem DS18B20. Spo-
sób transmisji oraz podłączenia
do mikrokontrolera są identyczne,
a różnice polegają na sposobie od-
czytu temperatury oraz dokładno-
ści. Układ DS1820 zapisuje tempera-
turę z rozdzielczością 9 bitów (zakres
od –55 o C do 125 o C, z rozdzielczością
co 0,5 o C), natomiast DS18B20 zapisu-
je temperaturę z rozdzielczością od 9
do 12 bitów.
Aby odczytać temperaturę z układu
DS1820, należy wykonać kilka czynno-
ści związanych ze specyfiką magistrali
1Wire. Po pierwsze, musimy znać nu-
mer seryjny układu. Numer jest 8-baj-
towy – zapisany na stałe w układzie.
Numer ten ma następującą strukturę
( rys. 4 ):
– Pierwszy odczytany bajt to nu-
mer rodziny (dla DS1820 to 10h, czy-
li 16 dziesiętnie, dla DS18B20 to 28h,
czyli 40 dziesiętnie). Uwaga! Przy po-
łączeniu tylko jednego układu można
pominąć procedurę odczytu i zapisu
nr seryjnego.
– Kolejne 6 bajtów to adres kon-
kretnego egzemplarza układu.
– Ostatni bajt to suma kontrolna,
którą w ramach tego artykułu nie bę-
dziemy się zajmować.
Jeżeli w systemie używamy jednego
układu DS1820, to procedura odczytu
przebiega następująco ( listing 1 ):
– inicjalizacja magistrali,
– odczyt numerów seryjnych ukła-
dów (w przypadku 1 układu ten krok
może być pominięty),
– wybór konkretnego układu
(w przypadku 1 układu ten krok
może być pominięty),
– wysłanie żądania odczytu tempe-
ratury,
– oczekiwanie na konwersję tem-
peratury,
– odczyt pierwszego bajtu danych,
– odczyt drugiego bajtu danych,
– ponowna inicjalizacja magistrali,
– programowa konwersja odczyta-
List. 1. Program przeznaczony do współpracy z JEDNYM czujnikiem DS1820
podłaczonym do magistrali 1Wire
$regfile = „m8def.dat”
$crystal = 4000000
Config 1wire = Portb.0 'konfiguracja pinów
Declare Sub Pomiar
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 'deklaracja symbolu stopień
Dim T(2) As Byte 'tablica dwóch bajtów do przechowywania
'temperatury
Cls
Do
Call Pomiar 'wywołanie procedury pomiar
Cls
Locate 1 , 1 'ustaw kursor
Lcd „Temp=” ;
If T(2) > 0 Then Lcd „-” ; 'wyswietlanie w zależności od znaku temperatury
Lcd T(1) ;
Lcd Chr(0) ; „C”
Loop
End
Sub Pomiar
1wreset 'inicjacja magistrali 1WIRE
If Err = 1 Then 'kontrola błędu - jeśli err=1 wtedy
'nie znaleziono czujnika
Cls
Lcd „Brak DS1820 „ 'poinformuj o tym
Do
1wreset
Loop Until Err = 0 'poczekaj
End If
1wwrite &HCC 'Wybór układu (dla 1 sztuki pomijamy wysyłanie
'numeru)
1wwrite &H44 'Polecenie konwersji temperatury
Waitms 750 'czas konwersji 750 ms
1wreset 'inicjacja magistrali 1WIRE
1wwrite &HCC 'Wybór układu (dla 1 sztuki pomijamy wysyłanie
'numeru)
1wwrite &HBE 'żądanie odczytania temperatury
T(1) = 1wread() 'odczytaj z magistrali 1WIRE 1 bajt
'do 1 elementu tablicy T
T(2) = 1wread() 'odczytaj z magistrali 1WIRE 2 bajt
'do 2 elementu tablicy T
1wreset 'inicjacja magistrali 1WIRE
If T(2) > 0 Then T(1) = 256 - T(1) 'Jeśli t(2)>0 to temperatura jest ujemna
T(1) = T(1) / 2 'oblicz temperaturę zgodnie z danymi noty
'katalogowej
End Sub
Rys. 5
84
Elektronika Praktyczna 11/2004
32852842.010.png 32852842.011.png 32852842.012.png 32852842.013.png 32852842.014.png 32852842.015.png 32852842.016.png 32852842.017.png 32852842.018.png 32852842.019.png 32852842.020.png 32852842.021.png 32852842.022.png 32852842.023.png
 
B A S C O M O W E P O R A D Y
układu (tzw. Match ROM – kod pole-
cenia 55h) oraz numer seryjny ukła-
du odczytany wcześniej:
1wwrite &H55
For I = 1 To 8
1wwrite nr_ukladu(i)
Next I
Przy kilku układach dołączonych do
magistrali należy wywoływać tę funk-
cję zawsze przed kolejnymi czynnościa-
mi (ponieważ dzięki temu żądane ope-
racje przeprowadzimy tylko na wybra-
nym układzie). Kolejny punkt, czyli wy-
słanie żądania odczytu temperatury, wy-
konujemy wysyłając do układu polece-
nie o kodzie 44h.
Następnym ważnym krokiem, któ-
ry często powoduje frustrację użytkow-
ników, jest oczekiwanie na konwer-
sję temperatury. Po wysłaniu bajtu 44h
układ DS1820 musi odczytać i przekon-
wertować dane do postaci dwóch liczb
typu byte . Jeśli czas oczekiwania na
wynik jest zbyt krótki, scalony termo-
metr podaje jako wynik wartość „85”.
W zależności od rozdzielczości oraz
układu konieczne czasy oczekiwania
są różne, najlepiej dobrać je ekspery-
mentalnie. Jako wartość bezpieczną dla
wszystkich układów z rodziny DS18xx
można przyjąć 750 ms.
Po dokonaniu konwersji możemy
przystąpić do odczytu wartości tempe-
ratury. Wykonujemy to w sposób opi-
sany wcześniej – wybieramy konkretny
układ docelowy i następnie wysyłamy
do układu wartość BEh:
List. 2 Procedura konwersji wyniku pomiaru
$regfile = „m8def.dat”
'XTAL
$crystal = 4000000
Config 1wire = Portb.0 'konfiguracja pinu 1Wire
Declare Sub Pomiar 'procedura odczytu
Declare Sub Wyb_uklad
Dim Nr_ukladu1(8) As Byte 'tablica do przechowywania nr 1 układu
Dim Nr_ukladu2(8) As Byte 'tablica do przechowywania nr 2 układu
Dim I As Byte , A As Byte 'zmienne pomocnicze
Dim T(2) As Byte 'tablica przechowująca odczytane z czuj-
nika wartości
Dim Temp As Integer 'temperatura całkowita
Dim Ulamek As Integer 'część ułamkowa
Dim Znak As Byte
Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32 'deklaracje znaków specjalnych
Cls 'kasujemy LCD
Nr_ukladu1(1) = 1wsearchfirst() 'pobieramy nr pierwszego układu
Nr_ukladu2(1) = 1wsearchnext() 'pobieramy nr drugiego układu
Do 'pętla główna
For A = 1 To 2 'odczytujemy po kolei temp z czujników
If A = 1 Then Locate 1 , 1 Else Locate 2 , 1 'jeśli czujnik pierwszy to ustawiamy
'kursor w 1 linii, jeśli 2 to w drugiej
Call Pomiar 'odczytanie temperatury w procedurze
Lcd „T(„ ; A ; „)=” ; 'wyswietlenie nr czujnika
'i temperatury całkowitej
If Znak = 1 Then Lcd „-”;
Lcd Temp ; „.” ;
If Ulamek = 625 Then Lcd „0”;
Lcd Ulamek ; Chr(0) ; „C „ 'wyświetlenie ułamka i symbolu stopień
Next A
Loop 'koniec pętli głównej
Sub Pomiar 'proceduta odczytu
1wreset 'reset magistrali 1wire
If Err = 1 Then 'jezeli uklad dolaczony do magistali nie
odpowiada do err=1 i
Cls 'czysc LCD
Lcd „Brak ukladu” 'wyswietl komunikat
Do
1wreset
Loop Until Err = 0 'petla do-loop w celu wstrzymania
'programu do czasu podlaczenia
'urzadzenia
End If
Call Wyb_uklad 'wywołanie układu
1wwrite &H44 'Polecenie konwersji temperatury
Waitms 750 'czas konwersji zgodnie
'z kartą katalogową
1wreset 'reset magistrali 1wire
Call Wyb_uklad 'wywołanie układu
1wwrite &HBE 'żądanie odczytania temperatury
T(1) = 1wread() 'odczytaj z magistrali 1WIRE 1 bajt
T(2) = 1wread() 'odczytaj z magistrali 1WIRE 2 bajt
1wreset 'reset magistrali 1wire
'Wynik w DS18B20 jest zapisaywany w dwóch bajtach. High=SSSS SHHH, Low = HHHH LLLL,
'gdzie S-znak, H-bity czesci całkowitej pomiaru temperatury w stopniach [C],
'L-bity wyniku po przecinku (L*0,0625 [C]).
'czyli najlepiej trzeba złączyć w jeden bajt bity SHHH oraz HHHH co da temperaturę zapisaną wprost
'na 7 bajtach (H) - jeśli będzie ujemna wtedy S = 1 i należy ją przeliczyć: 255-0HHHHHH
'Dodatkowo należy z bajtu Low usunąć część HHHH i pozostanie 0000LLLL czyli część ułamkowa
'to co pozostanie należy pomnożyć przez 0,0625 s (rozdzielczość maksymalna)
'procedura poniższa jest uniewrsalna i działa dobrze dla każdej ustawionej rozdzielczości czujnika
'od 9 do 12 bitów
Temp = Makeint(t(1) , T(2)) 'łączymy bajty w zmienną typu INTEGER
'(-32,768 Do +32,767)
Temp = Temp / 16 ' pozbywamy się części ułamkowej
If T(2) = &HFF And T(1) > &HF0 Then Znak = 1 'zmienna I jest tu wykorzystana jako
'wskaznik znaku temperatury miedzy
'-1 a 1 stopien
'poniewaz czesc calkowita wynosi 0
'(bez znaku)
T(1) = T(1) And &H0F 'tu obliczamy ułamek - pozbywamy się
'4 najstarszych bitów
Ulamek = T(1) * 625 'mnożymy przez rozdzielczość czujnika
If T(2) > 127 Then Ulamek = 10000 - Ulamek 'jeśli temp ujemna to przeliczamy
'część ułamkową
End Sub
1wwrite &HBE
'żądanie odczytania temperatury
T(1) = 1wread()
'odczytaj z magistrali 1WIRE 1 bajt
T(2) = 1wread()
'odczytaj z magistrali 1WIRE 2 bajt
Po wykonaniu tych czynności nie-
zbędna jest ponowna inicjalizacja magi-
strali poleceniem 1wreset .
Do wykonania pozostało ostatnie za-
danie, czyli konwersja odczytanej war-
tości na stopnie Celsjusza. Jej przebieg
jest uzależniony od typu układu, po-
nieważ – jak wspomnieliśmy wcześniej
– DS1820 udostępnia zapis temperatu-
ry na 9 bajtach, a DS18B20 na 12 baj-
tach. W przypadku DS1820 konwersja
temperatury z dokładnością 1 stopnia
wygląda następująco:
Sub Wyb_uklad
1wwrite &H55 'Wybór układu
For I = 1 To 8
If A = 1 Then 1wwrite Nr_ukladu1(i)
If A = 2 Then 1wwrite Nr_ukladu2(i)
Next I
End Sub
If T(2) > 0 Then T(1) = 256 – T(1)
'Jeśli t(2)=0 to temperatura jest
'ujemna
T(1) = T(1)/2
'tu pozbywamy się ostatniego bitu
'części ułamkowej)
Pozostaje nam tylko wyświetlić tem-
peraturę na wyświetlaczu:
'temperatury
Lcd T(1) ;
Lcd Chr(0) ; „C”
'wyświetlenie znaku stopień Celsjusza
ne, które w testowanym układzie zwięk-
szało rozmiar pamięci programu o po-
nad 500 bajtów, co w wielu przypad-
kach (np. przy zastosowaniu popularne-
go AT90S2313 stanowi ponad 25% jego
pamięci) dyskwalifikuje je.
Przedstawimy także dwie procedury
związane z obsługą czujnika DS18B20.
Tematami, które zazwyczaj są pomija-
ne lub wygłasza się o nich błędne opi-
Niektóre źródła podają inny spo-
sób wyświetlania temperatury odczy-
tanej z czujnika, mianowicie wykorzy-
stuje się polecenie fusing oraz zmien-
ną typu single :
Temperatura = Fusing(temp, „#.&”)
Jest to polecenie wysoce nieefektyw-
Cls
Locate 1 , 1 'ustaw kursor
Lcd „Temp=” ;
If T(2) > 0 Then Lcd „-” ;
'wyświetlanie w zależności od znaku
Elektronika Praktyczna 11/2004
85
32852842.024.png
B A S C O M O W E P O R A D Y
nie, jest zmiana rozdzielczości pomia-
ru oraz obsługa czujników w trybach
niższej rozdzielczości. W nocie katalo-
gowej układu DS18B20 znajduje się in-
formacja, że jeśli wybrano tryb kon-
wersji 12-bitowy, to ułamek jest zapi-
sany na 4 bitach, jeśli 11-bitowy, to
ułamek zapisano na 3 bitach, w przy-
padku 10-bitowego trybu pomiaru uła-
mek zakodowano na 2 bitach, a w
przypadku pomiaru 9-bitowego ułamek
znajduje się na jednym bicie (czyli
3 najmłodsze bity są nieistotne).
Podstawową procedurę konwersji po-
kazano na listingu 2 . Jest to procedura
dosyć często spotykana w różnych pora-
dach (ale często bywa w nich niekom-
pletna informacja, ograniczająca się do
stwierdzenia „Podziel przez 16, zamiast
przez 2, jak dla DS1820”). W przy-
kładzie przedstawiono sposób odczytu
włącznie z usunięciem ograniczeń wpro-
wadzanych poprzez zastosowanie zmien-
nej Integer (problem ze znakiem – przy
temperaturach wyższych niż –1 stopień,
w zakresie od –1 do zera).
Przedstawię jeszcze alternatywny
sposób obliczania i wyświetlania tem-
peratury. Jego zaletą jest fakt, że pro-
gram po kompilacji jest krótszy od tego
w przykładzie o 90 bajtów.
Wynik pomiaru DS18B20 jest zapisy-
wany w dwóch bajtach:
High=SSSS SHHH,
Low = HHHH LLLL,
gdzie:
S – znak,
H – bity części całkowitej pomiaru
temperatury w stopniach [C],
L – bity wyniku po przecinku
(L*0,0625 [C]).
Po odczytaniu danych z DS1820,
należy złączyć w jeden bajt bity SHHH
oraz HHHH, co da wartość temperatury
zapisaną na 7 bitach (H). Jeśli tempera-
tura będzie ujemna, wtedy S = 1 i na-
leży ją przeliczyć zgodnie ze wzorem:
255-0HHHHHH
Dodatkowo z bajtu Low należy usu-
nąć część HHHH tak, że pozostanie
0000LLLL, czyli część ułamkowa. To
co pozostanie, należy pomnożyć przez
0,0625 (rozdzielczość maksymalna):
T(1) = T(2) Or T(1)
'łączymy skonwertowane t(1) i t (2)
'w zmienną T(1)
Ulamek = I * 625
'mnożymy razy maksymalną rozdzielczość
If T(1) > 127 Then
'jeśli t(2) mamy > 127 to znaczy
'że bit znaku jest ustawiony czyli
'liczba jest ujemna
T(1) = 255 – T(1)
'konwertujemy temperaturę ujemną
Ulamek = 10000 – Ulamek
End If
Użytkownikowi pozostaje spraw-
dzić podczas wyświetlania znak wyni-
ku oraz skontrolować, czy część ułam-
kowa nie jest równa 625 – wtedy na-
leży wyświetlić jeszcze przed zmienną
Ulamek znak „0”.
Na listingu 2 pokazano alternatywny
sposób odczytu temperatury z czujnika,
przy wykorzystaniu zmiennej temp typu
integer (co powoduje wygenerowanie
dłuższego kodu wynikowego). Do prze-
chowywania numerów układów wykorzy-
stujemy tablice nr _ ukladu ( 8 ) i nr _ ukladu-
2 ( 8 ). Numer układu, z którego będziemy
czytać dane, przepisujemy z wybranej
tablicy do tablicy Biezacy ( 8 ). W proce-
durze Wybierz _ uklad dokonujemy zapisu
numeru układu do magistrali, natomiast
w pętli głównej w zmiennej A przecho-
wujemy numer indeksu aktualnie od-
czytywanego układu. W celu oszczę-
dzenia pamięci można wykorzystać pa-
mięć EEPROM do przechowywania nu-
merów układów – przykład znajduje się
na stronie EP w dziale Download oraz
na płycie CD-EP11/2004B.
Teraz przedstawimy sposób prze-
stawienia czujnika DS18B20 w tryb
mniejszej rozdzielczości. Wskazane jest
to wtedy, kiedy nie zależy nam na do-
kładności, ale na czasie odczytu i kon-
wersji – w trybie 12-bitowym czas
konwersji jest niemal 8 razy dłuższy
(750 ms) niż w przypadku trybu 9-bi-
towego (100 ms):
konfigurację w trybie 9-bitowym, należy
wykonać komendę 1wwrite (z argumen-
tem 48h), która kopiuje zawartość bitów
konfiguracyjnych do pamięci nieulotnej
EEPROM:
Na koniec przedstawiamy procedurę
odczytu temperatury z czujnika DS1820
z rozdzielczością 0,1 o C. Wykorzystuje-
my w tym celu dane zawarte w sumie
kontrolnej oraz zastrzeżonych zakresach
pamięci. Wykorzystuje ona odczytaną ta-
blicę całej pamięci oraz pewne mody-
fikacje:
Dim T As Integer
'tablica dwóch bajtów
'do przechowywania temperatury
Dim Bd(9) As Byte
'tablica dwóch bajtów
'do przechowywania temperatury
Dim Tmp As Byte
'tablica dwóch bajtów
'do przechowywania temperatury
Dim T1 As Byte
(.................................)
1wwrite &HCC
'Wybór układu (dla 1 sztuki
'pomijamy wysyłanie numeru)
1wwrite &H44
'Polecenie konwersji temperatury
Waitms 750
'czas konwersji 750 ms
1wreset
'inicjacja magistrali 1WIRE
1wwrite &HCC
'przeskocz zapis numeru ID
1wwrite &HBE
'rozkaz odczytu danych
Bd(1) = 1wread(9)
'odczyt danych do tablicy bd
1wreset
'zerowanie magistrali 1wire
'kolejne instrukcje obliczają
'temperaturę z precyzja 0,1 st C
Tmp = Bd(1) And 1
'obliczenie wartości zmiennej tmp
If Tmp = 1 Then Decr Bd(1)
'jeśli tmp=1 to zmniejsz o jeden
'pierwszy element tablicy bd
T = Makeint(bd(1) Bd(2))
'łączy dwa bajty w zmienna integer
T = T * 50
T = T – 25
T1 = Bd(8) – Bd(7)
'obliczenie różnicy zastrzeżonych
'bajtów
T1 = T1 * 100
'obliczenie temperatury
T1 = T1/Bd(8)
T = T + T1
T = T/10
'obliczenie temperatury (zmienna T
'zawiera obliczana temperaturę)
Cls
Lcd „Temp=” ; T
1wreset
Call Wybierz_uklad
1wwrite &H4E
'Polecenie zapisu pamięci
1wwrite &H00
'Zapis dowolnego bajtu
'(pamięć użytkownika)
1wwrite &H00
'Zapis dowolnego bajtu
'(pamięć użytkownika)
1wwrite &B00011111
'Zapis bajtu konfiguracyjnego
'9 bitów
'1wwrite &B00111111
'Zapis bajtu konfiguracyjnego 10 bitów
'1wwrite &B01011111
'Zapis bajtu konfiguracyjnego 11 bitów
'1wwrite &B01111111
'Zapis bajtu konfiguracyjnego 12 bitów
1wreset 'koniec
Po wykonaniu procedury przełączają-
cej układ jest ustawiany w tryb 9-bito-
wy, który utrzymuje się do wyłączenia
zasilania (konfiguracja nie jest zacho-
wywana na stałe). Po ponownym włą-
czeniu zasilania układ startuje w try-
bie 12-bitowym. Aby zapisać na stałe
Chcę podkreślić, że ze względu na
objętość procedury i jej „pamięciożer-
ność” tam, gdzie to jest możliwe nale-
ży stosować czujniki DS18B20. Na stro-
nie EP w dziale Download umieszczono
dodatkowe pliki, w których pokazano
stosowanie różnych procedur odczytu
oraz sposób korzystania z różnych czuj-
ników w jednym programie (DS1820
i DS18B20), sposób korzystania z pa-
mięci EEPROM do przechowywania nu-
merów czujników oraz przykłady wyko-
rzystane w artykule.
Artur Starz, EP
artur.starz@ep.com.pl
I = T(1)
'tu wykorzystujemy zmienną I jako
'zmienną pomocniczą przy wyświetlaniu
'części ułamkowej
I = I And &H0F
'tu pozbywamy się 4 niepotrzebnych
'bitów (część całkowitą) – zostaje
'tylko część ułamkowa
Shift T(1) , Right , 4
'tu pozbywamy się bitów ułamka
'części T(1) ponieważ mamy je już
'odseparowane w I
Shift T(2) , Left , 4
'a tu „wycinamy” niepotrzebne nam
'4 początkowe bity znaku (zostaje
'tylko piąty z nich jako najstarszy
'w części t(2))
86
Elektronika Praktyczna 11/2004
32852842.025.png
Zgłoś jeśli naruszono regulamin