Elektronik_Kraków napisał: Witam
Mam 7 układów DS18B20 i chciałem dokonywać ich odczytu w kolejności.
W przerwaniu od Timer0 ustawiam co 4 sekundy flagę, która ma spowodować wywołanie programu odczytu.
................
Tylko, że wstawienie tego w Case nie ma chyba sensu, bo w momencie wyboru z Case, dane jeszcze nie są obliczone.
Pierwsza uwaga to nie dajesz wymaganego czasu dla układów DS na conversję temperatury mimo że odczyt temp jest dokonywany flagą odmierzaną przez timer co 4 sec.
Tą częśc subrutyny odpowiedzialną za conversję umiesc na samym, końcu, po odczytaniu temperatur ze wszystkich układów w systemie. Wtedy wszystkie będą gotowe do odczytu po 4 sec.
Cytat:
Pomiar_ds:
'********************* konwersja dla wszystkich DS18B20
1wreset
1wwrite &HCC
1wwrite &H44
'Waitms 750
Druga uwaga to w każdej CASE masz kommende:
" 1wwrite &HBE" - co oznacza read scratchpad;
Co z tego że DS odpowiada i wysyła zawartośc scratchpad w której dwa pierwsze bajty to właśnie aktualna temperatura, gdy tymczaem to cię już nie interesuje i przechodzisz do następnej CASE zachowując ten sam patern.
Potrzebujesz w każdej CASE umieścic faktyczny odczyt jak dla np: case1
Cytat:
Case 1 :
1wreset
1wwrite &H55
1wverify Dsid1(1)
1wwrite &HBE
Temp1 = 1Wread(2)
Ta ostatnia commenda oznacza że czytamy tylko dwa pierwsze bajty z scratchpad
i wpisujemy je do zmiennej Temp1 reprezentującą aktualną temperaturę w DS z indexem1. Oczywiście zmienna Temp1 winna byc zwymiarowana aby pomieściła dwa bajty (integer albo word) zależnie jaki sposób przyjmiesz do przeliczania temperatury (z floating point albo alternatywnie bez, który generuje krótszy code ale wymaga badania znaku dla temperatur ujemnych). Przy większej ilości zmiennych tego samego typu praktycznie jest posługiwac się odpowiednio zwymiarowaną array i indexem wtedy wpis byłby do Temp(1).
Odczyt tylko dwóch pierwszych bajtów z scratchpad dokonuje sie wtedy gdy pomijamy sprawdzanie CRC co może byc nieco ryzykowne w otrzymaniu błednych wyników powstałych podczas trasmisji.
Nie wnikam już w czysto techniczną sprawę samego układu (schematu); czy te DSs są podłączone jako slaves czy też z pełnym zasilaniem, czy na czas konversji T dajesz mocne (MOSFET) podciąganie linii D do Vcc zgodnie z zaleceniem producenta (nie widac tego w programie). ? Skoro jest ich aż siedem to prawdopodobnie są umieszczone w dośc dużej odległości od processora; w jaki sposób jest kompensowana ta odległośc?
e marcus