Termometr na DS18B20 dla ATmega8 początkujący, pytania


Witam jestem początkujący i gdzieś w internecie znalazłem program termometr na DS18B20 do ATmega8. Program działa, lecz w przyszłości nie chciał bym szukać i wklejać programów lecz sam je pisać a żeby tak się stało musiał bym wiedzieć co dana komenda robi.

    ' generated. Take care that the chip supports all fuse bytes.'program obslugi termometru DS18B20 kompatybilnym z DS1822
$regfile = "m8def.dat"                                      'informuje kompilator o pliku
      'dyrektyw mikrokontrolera
$crystal = 8000000                                          'informuje kompilator
      'o częstotliwości oscylatora
      'taktującego mikrokontroler
Config Pinb.1 = Input
                                      'linia PB1 jako wejściowa
Config Lcd = 16 * 2                                         'konfiguracja typu wyťwietlacza
      'LCD
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2       'konfiguracja linii
      'mikrokontrolera, do ktˇrych
      'do-?czono wyťwietlacz
      'LCD
 
Config 1wire = Portd.1                                      'pod jaki pin jest podłączone wire
Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32          'znak stopnia( zdefiniowanie znaku urzytkownika)
Dim T1 As Single                                            '2,35
Dim T2 As Single
Dim B1 As Byte , B2 As Byte , R As Byte                     '2
Dim Tmp As String * 6                                       'tekst
Dim Znak As String * 1
R = &HFF
Declare Sub 1wr                                             'podprogram setujacy magistrale 1w (program
      'określa jakie parametry powinny być przekazane procedusze )
Cursor Off                                                  'schowaj kuersor
Cls                                                         'czyści wyświetlacz
 
Do
1wr                                                         'podprogram 1wr
1wwrite &HCC                                                'komenda skip ROM 
1wwrite &H44                                                'komenda convert T
Waitms 250
Waitms 250
1wr                                                         'podprogram 1wr
1wwrite &HCC                                                'komenda skip ROM
1wwrite &HBE                                                'komenda read
 
B1 = 1wread()                                               'odczyt z magistrali 1w (termometru)
B2 = 1wread()
 
1wr                                                         'podprogram 1wr
 
If B2 >= 248 Then                                           'w przypadku temperatur ujemnych
B1 = R - B1                                                 'Od 255 Odejmujemy B1
B2 = R - B2                                                 'od 255 odejmujemy B2
Znak = "-"
Else
Znak = "+"
End If
T1 = B1 / 16                                                'Przesuniecie w pawo o 4 bajty
T2 = B2 * 16                                                'przesuniecie w lewo o 4 bajty
T1 = T1 + T2
                                                            'zmienna tmp = t1 w formie 000,00
Tmp = Fusing(t1 , " ###.&&")
Cls
Lcd "odczyt z DS18B20"
Lowerline                                                   'nastepna linia
Lcd "temp:" ; Znak ; Tmp ; Chr(1) ; "C "                    'wyswietl temp znak tmp
 
Waitms 250
Waitms 250
Waitms 250
Waitms 50
Loop
 
Sub 1wr                                                     'podprogram resetujacy magistrale
1wreset
End Sub

Większość kodu że tak powiem rozgryzłem, lecz zastanawiają mnie następujące fragmenty.
1
R = &HFF 
F=15 czyli R=15*16^1+15*16^0=240+15=255 dlaczego akurat 255?
2
 1wr                                                         'podprogram 1wr
Co robi ten program i dlaczego jest włączany aż 3 razy?
3
 1wwrite &HCC                                                'komenda skip ROM 
Wiem że jest to komenda pozwalająca na zaadresowanie wszystkich układów na magistrali jednocześnie i wysłaniu komendy do wszystkich jednocześnie. Lecz ja mam tylko jeden układ więc ona jest nadal potrzebna i nie wystarczy jej użyć raz?
4
 1wwrite &H44                                                'komenda convert T
Ta komenda że tak powiem przerabia odczyt z termometru na temperaturę?
5
 B1 = 1wread()                                               'odczyt z magistrali 1w (termometru)
B2 = 1wread()
Dlaczego są sczytywane dwie zmienne nie wystarczy jedna?
6
 If B2 >= 248 Then                                           'w przypadku temperatur ujemnych   
Dlaczego mniejsze równe 248 a nie od 255?
7
 End If
T1 = B1 / 16                                                'Przesuniecie w pawo o 4 bajty
T2 = B2 * 16                                                'przesuniecie w lewo o 4 bajty
T1 = T1 + T2
Co robią te komendy? dlaczego B1 jest dzielone a B2 jest mnożone przez 16 a nasza temperatura jest sumą tych operacji?




Portret użytkownika matrix

Re: Termometr na DS18B20 dla ATmega8 początkujący, pytania

ściągnij i poczytaj polskiego HELP'a do bascom AVR. nie zrozum mnie źle, ale nie sądzę żeby ktoś miał tyle czasu by wszystko od podstaw Ci tłumaczyć.

Portret użytkownika mirley

Re: Termometr

1. Przypisanie do R wartości 255, potrzebne dalej do zrobienia negacji (ja osobiście korzystam z polecenia Not ale to już inna bajka)

2. po wpisaniu 1wr wykonuje się to (zwykły podprogram):

Sub 1wr                                                     'podprogram resetujacy magistrale
1wreset
End Sub

3.Jest potrzebna, wykonujesz reset czujnika za każdym razem on musi za każdym razem wiedzieć ze ma zostać zaadresowany

4. Poczytaj kartę katalogową DS18B20 i popatrz na jego rejestr wewnętrzy temperatura zapisywana jest na dwóch bajtach

5. Rozkaz mówiący o rozpoczęciu przez czujnik pomiaru temperatury, po zakończeniu gotowy wynik ląduje w rejestrze wewnętrznym

6. Wynika z karty katalogowej, 248 binarnie "11111000" jeśli 5 najstarszych bitów jest 1 lub więcej to znaczy że temperatura jest ujemna bo zostało włączone kodowanie U2 liczb ujemnych (patrz wikipedia) (ja sprawdzam to po najstarszym bicie ale działanie jest takie samo)

7. Wynika z karty katalogowej, temperatura zapisana jest na dwóch bajtach, młodszy zawiera 4 bity po przecinku i 4 bity młodsze wartości całkowitej, natomiast starszy bajt trzeba pomnozyć przez 16 aby jego młodsze bity znalazły się na wyższej pozycji i dodać do drugiej zmiennej. Ja to robię innaczej. Zapisuję całość do zmiennej word klasycznie 256*starszyb bajt + młodszy bajt a potem dzielę przez 16 i uzyskuje temperaturę

Poczytaj moje procedury w kodach źródłowych, tam jest wiele objaśnione

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

Re: Termometr

Dzięki za dokładne objaśnienie, troszkę sobie doczytałem i wszystko stało się jasne. Jeszcze raz dzięki.

Portret użytkownika michal512

DS18B20 * 2

Witam mam jeszcze jedno pytanie do tego programu. Troszkę go przerobiłem z pomocą procedur zawartych w kodach źródłowych na tej stronie i wyszło mi coś takiego.

$regfile = "m8def.dat"                                      'informuje kompilator o pliku
      'dyrektyw mikrokontrolera
$crystal = 8000000                                          'informuje kompilator
      'o częstotliwości oscylatora
      'taktującego mikrokontroler
Config Pinb.1 = Input
                                                             'linia PB1 jako wejściowa
Config Lcd = 16 * 2                                         'konfiguracja typu wyťwietlacza LCD
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2       'konfiguracja linii
                                                             'do których pinów dołączono wyťwietlacz LCD
 
Config 1wire = Portd.1                                      'pod jaki pin jest podłączone wire
 
Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32          'znak stopnia( zdefiniowanie znaku urzytkownika)
 
'Zmienne
 
Dim T1 As Single , T2 As Single
Dim Ds1(8) As Byte , Ds2(8) As Byte
Dim B1 As Byte , B2 As Byte , R As Byte
Dim Tmpds1 As String * 6
Dim Tmpds2 As String * 6
Dim Znak As String * 1
R = &HFF
Declare Sub 1wr                                             'podprogram setujacy magistrale 1w (program
      'określa jakie parametry powinny być przekazane procedusze )
Cursor Off                                                  'schowaj kuersor
Cls                                                         'czyści wyświetlacz
 
Do
   1wr                                                      'podprogram 1wr
   1wwrite &HCC                                             'komenda skip ROM
   1wwrite &H44                                             'komenda convert T
   Waitms 250
   Waitms 250
       ' pierwszy ds18b20
      1wr
      1wwrite &H55
      1wwrite Ds2(1) , 8
      1wwrite &HBE
 
      B1 = 1wread()                                         'odczyt z magistrali 1w (termometru)
      B2 = 1wread()
 
      1wr                                                   'podprogram 1wr
 
      If B2 >= 248 Then                                     'w przypadku temperatur ujemnych
      B1 = R - B1                                           'Od 255 Odejmujemy B1
      B2 = R - B2                                           'od 255 odejmujemy B2
      Znak = "-"
      Else
      Znak = "+"
      End If
      T1 = B1 / 16                                          'Przesuniecie w pawo o 4 bajty
      T2 = B2 * 16                                          'przesuniecie w lewo o 4 bajty
      T1 = T1 + T2
                                                            'zmienna tmp = t1 w formie 000,00
      Tmpds1 = Fusing(t1 , " ###.&&")
 
       'drugi ds18b20
      1wr
      1wwrite &H55
      1wwrite Ds1(1) , 8
      1wwrite &HBE
 
      B1 = 1wread()                                         'odczyt z magistrali 1w (termometru)
      B2 = 1wread()
 
      1wr                                                   'podprogram 1wr
 
      If B2 >= 248 Then                                     'w przypadku temperatur ujemnych
      B1 = R - B1                                           'Od 255 Odejmujemy B1
      B2 = R - B2                                           'od 255 odejmujemy B2
      Znak = "-"
      Else
      Znak = "+"
      End If
      T1 = B1 / 16                                          'Przesuniecie w pawo o 4 bajty
      T2 = B2 * 16                                          'przesuniecie w lewo o 4 bajty
      T1 = T1 + T2
                                                            'zmienna tmp = t1 w formie 000,00
      Tmpds2 = Fusing(t1 , " ###.&&")
Cls
Lcd "DS 1" ; Znak ; Tmpds1 ; Chr(1) ; "C "
Lowerline                                                   'nastepna linia
Lcd "DS 2" ; Znak ; Tmpds2 ; Chr(1) ; "C "
 
Waitms 250
Waitms 250
Waitms 250
Waitms 50
Loop
 
Sub 1wr                                                     'podprogram resetujacy magistrale
1wreset
End Sub

To by miał być program obsługujący dwa DS18B20 podłączone do magistrali 1wr naraz. Niby się kompiluje i symulacja też przebiega zgodnie z planem, lecz będzie to działać na gotowej płytce z ATmega8, czy popełniłem jakiś błąd?

Portret użytkownika mirley

Re: termometr

Nie mam w głowie kompilatora ani testera sprzętowego...... po co mnie pytasz czy to będzie działać. Uruchom program na procesorze, ustaw mu fusebity na wewnętrzny oscylator 8MHZ lub kwarc 8Mhz jeśli masz takowy podłączony. Wtedy jeśli coś nie pójdzie to pytaj. Aha... rezystor 4,7k ma być podłaczony od wyjścia magistrali 1wire do +5V

Jeszcze jedno:

Dim Ds1(8) As Byte , Ds2(8) As Byte

Deklarujesz dwia tablice numerów seryjnych ds18b20 a nie przypisałeś wartości do tych tablic (albo nie zauważyłem) bez tego żaden z ds nie ruszy bo masz dwa podłączone naraz. Musisz albo wyszukiwnie zrobić (sam tego nigdy nie robiłem) albo przypisać na sztywno numery, albo narazie olać dwa czujniki i zrobić 1 z wykorzystaniem polecenia skip rom (tak jak przy konwersji temperatury) także w przypadku odczytu (może być tylko jeden czujnik podłączony)

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Re: termometr

Nie chodziło mi o sprawdzenie sprzętowe tylko bardziej o sprawdzenie kodu czy czegoś w nim nie brakuje i czy jakiegoś banalnego błędu nie popełniłem, ale moja wina trochę źle się wyraziłem.
A te numery przypisywane na sztywno to one od czegoś zależą czy się wpisuje obojętnie jakie grunt aby się różniły od siebie?

Portret użytkownika mirley

Re: DS18B20

Jak byle jakie numery? Każdy ds18B20 podobne jak kazdy inny układ działający na 1wire ma swój unikalny 64-bitowy numer seryjny. Numer ten zapisany jest w pamięci układu i odczytywany specjalną komendą

Tutaj masz wszystko napisane: http://mirley.firlej.org/obsluga_ds18x20

W najprostszym przypadku podłączasz do procesora jeden czujnik i odczytujesz numer seryjny, wyswietlając go na LCD itp. Przepisujesz ten numer na kartkę i potem zapisujesz do tablicy jako wartośc stała. Tak samo wpinasz drugi czujnik i zapisujesz go do drugiej tablicy

Potem w praktyce robi sie to z automatycznym szukaniem czujników i zapisywaniem ich numerów seryjnych do ramu lub rejestruje się jednorazowo po jednym czujniku i specjalnie napisany program zapisuje ich numery seryjne do eeprom.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

Re: DS18B20

Czytałem to tylko że nie zwróciłem uwagi na komendę 1wwrite &H33, teraz wszystko się poskładało w jedną całość:) Czyli taki prosty programik do odczytu numerów seryjnych może wyglądać tak?

$regfile = "m8def.dat"                                      'informuje kompilator o pliku
      'dyrektyw mikrokontrolera
$crystal = 8000000                                          'informuje kompilator
      'o częstotliwości oscylatora
      'taktującego mikrokontroler
Config Pinb.1 = Input
                                                             'linia PB1 jako wejściowa
Config Lcd = 16 * 2                                         'konfiguracja typu wyťwietlacza LCD
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2       'konfiguracja linii
                                                             'do których pinów dołączono wyťwietlacz LCD
 
Config 1wire = Portd.1
 
Dim Ds(8) As Byte
 
1wreset
1wwrite &H33
Ds(1) = 1wread(8):
 
 
Do
 
Cls
Lcd Ds(1) ; Ds(2) ; Ds(3) ; Ds(4)
Lowerline
Lcd Ds(5) ; Ds(6) ; Ds(7) ; Ds(8)
 
loop

Czy o czymś zapomniałem?

Portret użytkownika mirley

Re: Odczyt DS

Wydaje się dobrze tylko po drugim poleceniu Lcd, tuz przed loop dodaj jeszcze np "wait 2" żeby lcd nie wyświetlał tego z max częstotliwością procka, bo prawdopodobnie nic nie zobaczysz wtedy na wyswietlaczu.

Poza tym uruchamiaj i sprawdzaj

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

Re: Odczyt

Ok dzięki za pomoc. Zaplecze programowe już mam zostało tylko wykonanie. Jeszcze raz dzięki za pomoc i cierpliwość.

Portret użytkownika michal512

Re program

Witam, programik do odczytu numerów seryjnych działa. Zrobiłem małe udogodnienie powstawiałem ";" aby było lepiej widać poszczególne numery.
Program do sczytywania temperatury z 2 DS18B20 po wstawieniu numerów seryjnych na sztywno również działa.Jeszcze raz dzięki za pomoc.

Portret użytkownika michal512

długość

Witam ostatnio nasunęło mi się takie pytanko. Jaką się przyjmuje maksymalną długości przewodu łączącego mikrokontroler z DS18B20 i jaki jest minimalny przekrój żyły tego przewodu? Może być do tego celu wykorzystany przewód telefoniczny? Przeważnie są one zakończone RJ-11, ale mi chodzi o sam przewód.

Portret użytkownika mirley

Re: DS18B20

Przewód telefoniczny na 100 pewnie będzie działał, zależy to od tego ile jest ds'ów będzie na linii, jakie są zakłócenia elektromagnetyczne itp. Dallas mówi nawet o 600m zasięgu ale nie znam założeń jakie muszą być do tego spełnione. Przekrój przewodu raczej nie sprawi kłopotu, nawet jak dasz najcieńszy jaki masz

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

Re: DS18B20

Na aż takie odległości to nie mam zamiaru się rzucać:) W moim przypadku to maksymalnie 20m i 11 czujników z czego tylko 4 podłączone na samym końcu a reszta na około 4m, oraz możliwość omijania innych przewodów i urządzeń elektrycznych. A przewód telefoniczny to najlepsze (najtańsze i najłatwiej dostępne) rozwiązanie czy lepiej zastosować jakiś inny przewód?

Portret użytkownika mirley

Re: DS18B20

Ja bym dał przewód domofonowy bo ma on skręcone kable... przewód dwuparowy będzie miał 4 druty.... zrobisz sobie sygnał skręcony z masą i zasilanie osobno

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Re: DS18B20

Chyba tak zrobię mniejsze zakłócenia i odporniejszy na uszkodzenia mechaniczne. Dzięki za pomoc w wyborze.

Portret użytkownika gosc

Schemat

Ma może ktoś schemat do tego+ wsad do procka?