Problem z DS18B20

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Problem z DS18B20

Post autor: Kulpina » 10 lis 2008, 12:42

Robie termometr na układzie ds18B20 i jest problem. Z układu odczytuje się 1111 1111 zamiast 85°C (0101 0101). Kod programu:

Kod: Zaznacz cały

Czytajtemp:
If Tempkonwersja = 0 Then
   Tempkonwersja = 1
   '1wreset                                                  
   '1wwrite &HCC                                             
   '1wwrite &H44                                             
 Else
   Tempkonwersja = 0
   1wreset                                                  
   1wwrite &HCC                                             
   1wwrite &HBE                                             
   Odczyt(1) = 1wread(2)                                    
   Odczyt(2) = Odczyt(2) And &B00001111
   Odczyt(1) = Odczyt(1) And &B11110000
   Temp = Odczyt(2) + Odczyt(1)
End If
Return
Specjalnie zaremowałem tą część odpowiedzialną za konwersje temperatury, bo wtedy powinienem uzyskać 85°C.
Nie interesuje mnie ułamkowa część temperatury, bo wynik wyświetlam na wyświetlaczy 7 segmentowym więc zajęła by ona za dużo miejsca. pozatym to jest termometr pokojowy wiec dokładnośc do 1/16 stopnie nie będzie potrzebna :mrgreen:

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Post autor: RcTomek » 10 lis 2008, 17:08

Źle do tego podszedłeś. Nałożyłeś maskę na bajty a potem je arytmetycznie dodałeś do siebie.
Bajt LSB przesuń o 4 miejsca w prawo, MSB o 4 miejsca w lewo i zsumuj je logicznie (OR). Powinienieś otrzymać poprawny wynik ;)

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 12 lis 2008, 13:18

Hmmm zaraz to sprawdze, ale obawiam sie na wstępie, ze to nic nie da. Sprawdzałem też co znajduje sie w zmiennych odczyt(1) odczyt(2) (ustawiłem, zeby na wyświetlaczu sie pokazała ich zawartość) i w nich też jest 255 :mrgreen: Zastanawiam się, czy to nie coś od strony sprzętowej? Rezystor podciągający nóżke danych mam 4,7kohm pozatym tyle, nie trzeba żadnych elementów wiecej?

[ Dodano: 2008-11-12, 13:25 ]
Wpisałem tak jak mówiłeś kod programu:

Kod: Zaznacz cały

Shift Odczyt(2) , Right , 4
Shift Odczyt(1) , Left , 4
Temp = Odczyt(2) Or Odczyt(1) 
To o to chodziło? Bo może coś źle zrobiłem, ale wynik ten sam, znaczy sie nie wiem czy czymś sie różni, ale jest dalej błędny :mrgreen:

snow
Użytkownik
Posty: 794
Rejestracja: 16 sty 2007, 3:44
Lokalizacja: lubelskie
Kontakt:

Post autor: snow » 12 lis 2008, 14:05

Wg. datasheeta DS potrzebuje 750ms na konwersję wyniku.

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Post autor: RcTomek » 12 lis 2008, 23:31

snow pisze:Wg. datasheeta DS potrzebuje 750ms na konwersję wyniku.
Narazie ma być sam odczyt, bez konwersji.

-> Kulpina
tak, mniej więcej chodziło mi o coś takiego (nie wiem jak dokładnie działają te polecenia bascomowe, piszę w asm).
Sprawdź stronę sprzętową i wklej najlepiej cały listing. Może masz jakiś błąd w procedurze wyświetlającej. Aha... i te polecenia shift powinny być odwrotnie - MSB w lewo, LSB w prawo.

Awatar użytkownika
bsw
Użytkownik
Posty: 100
Rejestracja: 14 kwie 2008, 13:13
Lokalizacja: Małopolska
Kontakt:

Post autor: bsw » 13 lis 2008, 14:22

1. Czas na konwersję jest niezbędny - bez niego nie ma co czytać - właśnie wtedy czujnik przeprowadza pomiar temperatury.
2. W trakcie pomiaru zużywa dużo pradu - jeśli zasilasz czujnik pasożytniczo musisz zasilić na 750ms czujnik pełnym napięciem (bez rezystora) Można to uzyskać właczając wewnętrzny pull-up procka.

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 13 lis 2008, 14:45

1. Czas na konwersję jest niezbędny - bez niego nie ma co czytać - właśnie wtedy czujnik przeprowadza pomiar temperatury.
Jest jeśli chcemy mierzyć temperature. Ja na razie chce odczytać temperature, a bez konwersji w czujniku zapisaną temperaturą jest 85 stopni.
2. W trakcie pomiaru zużywa dużo pradu - jeśli zasilasz czujnik pasożytniczo musisz zasilić na 750ms czujnik pełnym napięciem (bez rezystora) Można to uzyskać właczając wewnętrzny pull-up procka.
Czujnik podłączony do +5V i gnd + rezystor podciągający nóżgę sygnałową to +5V (4,7kohm)
Ddevil pisze:Może masz jakiś błąd w procedurze wyświetlającej. Aha... i te polecenia shift powinny być odwrotnie - MSB w lewo, LSB w prawo.
Błędu w procedurze wyświetlającej raczej nie mam, bo próbowałem juz programowo ustawiac różna temperatury zanim jeszcze czujnik podłączyłem (wpisywałem na poczatku programu do zmiennej tam jakąś liczbe) i wyświetlaczło dobrze. Chodzi o to, że z tego czujnika czyta samiusieńkie jedynki (&B11111111) zupełnie nic innego i nie wiem co zrobić :mrgreen:

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Post autor: RcTomek » 13 lis 2008, 22:37

Upewnij się na 100%, czy sprzętowo jest wszystko ok. Jeżeli masz taką możliwość, to podmień ten DS na inny. Możesz go też podpiąć do innej końcówki mikrokontrolera. Podmień rezystor na np. 3.3k, choć jest małe prawdopodobieństwo, aby miało to jakieś znaczenie.
Jeśli hardware jest na pewno w porządku, to problem możę być tylko po stronie softu (błędna konfiguracja I/O, nieodpowiednie typy zmiennych lub błędy logiczne). Wklej najlepiej cały kod programu.

P.S. Czym taktujesz uC?

Romanes
-
Posty: 8
Rejestracja: 17 lis 2005, 9:35
Lokalizacja: Opole
Kontakt:

Post autor: Romanes » 31 gru 2008, 18:13

Cześć! Miałem podobny problem :roll: - rozwiązanie tkwiło w konfiguracji pinu do którego podpięty jest DS, - miałem ustawione jako wejscie'0' a powinno być wyjście '1'

ODPOWIEDZ