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 2 1wr 'podprogram 1wr 3 1wwrite &HCC 'komenda skip ROM 4 1wwrite &H44 'komenda convert T 5 B1 = 1wread() 'odczyt z magistrali 1w (termometru) B2 = 1wread() 6 If B2 >= 248 Then 'w przypadku temperatur ujemnych 7 End If T1 = B1 / 16 'Przesuniecie w pawo o 4 bajty T2 = B2 * 16 'przesuniecie w lewo o 4 bajty T1 = T1 + T2
|
|||
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ć.
Moja strona w powijakach
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):
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.
Re: Termometr
Dzięki za dokładne objaśnienie, troszkę sobie doczytałem i wszystko stało się jasne. Jeszcze raz dzięki.
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.
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?
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:
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.
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?
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.
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?
Czy o czymś zapomniałem?
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.
Re: Odczyt
Ok dzięki za pomoc. Zaplecze programowe już mam zostało tylko wykonanie. Jeszcze raz dzięki za pomoc i cierpliwość.
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.
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.
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.
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?
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.
Re: DS18B20
Chyba tak zrobię mniejsze zakłócenia i odporniejszy na uszkodzenia mechaniczne. Dzięki za pomoc w wyborze.
Schemat
Ma może ktoś schemat do tego+ wsad do procka?