Pomiar temperatury przy pomocy Ds18B20 na kilku portach

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!
endurasek
-
Posty: 4
Rejestracja: 12 wrz 2013, 17:28
Lokalizacja: tg

Pomiar temperatury przy pomocy Ds18B20 na kilku portach

Post autor: endurasek » 18 wrz 2013, 5:53

Witam

poszukuje jakiegoś przykładowego programu do obsługi czujnika temperatury Ds18b20 na kliku portach uP atmega 8. Chodzi mi w jaki sposób przełączać piny uP aby odczytywać temperaturę np z 4 nóżek układu pod które jest podpiety czujnik temperatury .

Awatar użytkownika
Artyliusz
Użytkownik
Posty: 306
Rejestracja: 06 sty 2013, 14:10
Lokalizacja: Z Polski
Kontakt:

Post autor: Artyliusz » 18 wrz 2013, 12:18

Cała idea tych DS18B20 i podobnych cyfrowych czujnikach polega na OneWire. To znaczy, że kilka tych czujników podłączasz do jednej tylko nóżki mikrokontrolera na jednej linii danych. Więc nie wiem czemu chcesz pod 4 nóżki podłączać je.
Raczej jest sporo przykładów w Internecie zarówno programów i schematów.

P.S. ATmega8 to mikrokontroler, a nie mikroprocesor. Trochę różne rzeczy to są.

endurasek
-
Posty: 4
Rejestracja: 12 wrz 2013, 17:28
Lokalizacja: tg

Post autor: endurasek » 18 wrz 2013, 17:15

Idea jest fajna z tym 1wire ale chodzi mi o prostą wymianę czujnika w danym miejscu bez konieczności ingerowania w program.

keruseykaryu

Post autor: keruseykaryu » 18 wrz 2013, 18:15

Idea jest fajna z tym 1wire ale chodzi mi o prostą wymianę czujnika w danym miejscu bez konieczności ingerowania w program.
Po co chcesz ingerować w program? Niech se program najpierw je wszystkie wyszuka na linii, a potem się będziesz odwoływał po numerach seryjnych.
Możesz sobie całą tabelę zapamiętać w EEPROM i sprawdzać który podmieniłeś. Bo chyba nie będziesz ich wszystkich wymieniał naraz?

endurasek
-
Posty: 4
Rejestracja: 12 wrz 2013, 17:28
Lokalizacja: tg

Post autor: endurasek » 18 wrz 2013, 18:30

Tak właśnie mam. Ale program jest rozbudowany i dużo miejsca zajmuje. Bardziej mi zależy na odseparowaniu jednego czujnika od pozostałych trzech.

keruseykaryu

Post autor: keruseykaryu » 18 wrz 2013, 21:01

endurasek pisze:Ale program jest rozbudowany i dużo miejsca zajmuje.
Myślisz, że jak zrobisz cztery magistrale na kilku pinach to się program znacznie pomniejszy?

simrowit
-
Posty: 29
Rejestracja: 11 kwie 2012, 20:41
Lokalizacja: Żywiec

Post autor: simrowit » 23 wrz 2013, 16:47

Nie napisałeś o jaki język programowania chodzi. W bascom robi się to dosyć prosto:

var2 = 1WREAD( [ bytes] )

var2 = 1WREAD( bytes , port , pin)

Oczywiście w tym momencie całą idee 1WIRE diabli biorą, ale faktycznie wymiana czujnika w danym urządzeniu jest prosta, bo wystarczy wymienić czujnik i tyle, przecież urządzenie nie zawsze obsługuje doświadczony, oblatany programista-elektronik.
Program też wówczas będzie prostszy bo nie trzeba tworzyć obsługi wprowadzania numeru seryjnego czujnika do eeprom a to też troche miejsca zajmuje szczególnie jesli to Bascom:)

simrowit
-
Posty: 29
Rejestracja: 11 kwie 2012, 20:41
Lokalizacja: Żywiec

Post autor: simrowit » 23 wrz 2013, 16:48

Nie napisałeś o jaki język programowania chodzi. W bascom robi się to dosyć prosto:

var2 = 1WREAD( [ bytes] )

var2 = 1WREAD( bytes , port , pin)

Oczywiście w tym momencie całą idee 1WIRE diabli biorą, ale faktycznie wymiana czujnika w danym urządzeniu jest prosta, bo wystarczy wymienić czujnik i tyle, przecież urządzenie nie zawsze obsługuje doświadczony, oblatany programista-elektronik.
Program też wówczas będzie prostszy bo nie trzeba tworzyć obsługi wprowadzania numeru seryjnego czujnika do eeprom a to też troche miejsca zajmuje szczególnie jesli to Bascom:)

Awatar użytkownika
matrix
Użytkownik
Posty: 1803
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 23 wrz 2013, 16:51

A rejestracja czujników to co?
Najpierw rejestracja dopiero odczyt temperatury.

simrowit
-
Posty: 29
Rejestracja: 11 kwie 2012, 20:41
Lokalizacja: Żywiec

Post autor: simrowit » 23 wrz 2013, 16:57

Przecież nie bedę koledze całego programu pisał, jeśli wybierze Bascom w pliku pomocy jest cały przykład jak to zrobić, nie ma sensu tu używać CTRL+V.

Awatar użytkownika
kayron
Użytkownik
Posty: 2090
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 23 wrz 2013, 17:45

Oj, zamieszanko. Ale po koli.
1. co kolega rozumie przez stwierdzenie, prosta wymiana na inny czujnik ? Wymiana na nowy, czy zamiana miejscami ?
2. na jednej linii jest to faktycznie prostsze rozwiązanie, niż na 4 osobnych.
3. dobry program w przypadku DSów, musi być i tak samo uczący się (kalibrujący), w przeciwnym razie cała idea ich stosowania traci sens.

simrowit
-
Posty: 29
Rejestracja: 11 kwie 2012, 20:41
Lokalizacja: Żywiec

Post autor: simrowit » 23 wrz 2013, 18:13

No właśnie wszystko zależy co się chce osiągnąć.

Kolega endurasek pisał, że z powodu ograniczenia pamięci programu szuka takiego rozwiązania jak w temacie, zgadzam się i wcześniej już też o tym napisałem że w tym momencie idea 1Wire traci sens, ale teraz zapominamy o tym że te czujniki są na magistrali 1wire, kolega chce je podpiąć do 4 róznych pinów, no problem, podpinamy, klient nasz pan.

W sensie elektrycznym podłączenie wielu czujników do jednej szyny jest jak najbardziej rozwiązaniem idealnym, trzeba to tylko oprogramować odpowiednio i tu wracamy do punktu wyjścia, problem z rozmiarem programu. Widać sprzęt jest w tym temacie ograniczeniem, więc jeśli by się udało to w ten sposób zmieścić w pamięci programu, to takie rozwiązanie nie jest ani lepsze ani gorsze od innych, jest to jedna z możliwości komunikacji, która producent DS-ów też przewidział.

simrowit
-
Posty: 29
Rejestracja: 11 kwie 2012, 20:41
Lokalizacja: Żywiec

Post autor: simrowit » 23 wrz 2013, 19:12

No ok, użyje CTRL-V:) takie coś działa u mnie, nie jest to moje dzieło, mam nadzieję, że autor wybaczy:)

Kod: Zaznacz cały

Sub Odcz_temp

  1wreset Pina , 0                                          'reset
  1wwrite &HCC , 1 , Pina , 0                               'jedna kostka, więc wykorzystujemy  
                                                                  'rozkaz SKIP ROM
  1wwrite &H44 , 1 , Pina , 0                               'dokonaj konwersji
  Waitms 750                                                'przeczekaj czas konwersji

  1wreset Pina , 0                                          'reset
  1wwrite &HCC , 1 , Pina , 0                               'rozkaz adresowy SKIP ROM
  1wwrite &HBE , 1 , Pina , 0                               'rozkaz funkcyjny - polecenie odczytu 
                                                                         'DS18x20
  Odczyt(1) = 1wread(2 , Pina , 0)                          'odczytaj dwa pierwsze bajty
  T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu 
                                                                    'Integer
  Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
  T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt

  T1 = T * 0.0625                                           'wyraz w stopniach Celsjusza, wynik wpisz do                         
                                                               'zmiennej Single

End Sub

Awatar użytkownika
kayron
Użytkownik
Posty: 2090
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 23 wrz 2013, 19:39

Inaczej. jak dobrze pamiętam, aby odczytać poprawnie adres jednego DSa, na magistrali musi być dokładnie jeden, bo inaczej na zapytanie odpowiedzą wszystkie naraz i będzie lipa.
Więc lepiej wykorzystać dwa piny, jeden do obsługi wielu DSów i jeden do uczenia, wprowadzania nowego DSa do systemu, i o takie rozwiązanie chodzi chyba koledze.
problemem natomiast jest BASCOM, który marnuje zasoby CPU na lewo i prawo, zamulając go przy okazji. Napisanie w nim zoptymalizowanego programu bez drążenia samego środowiska, tu i uwdzie z wstawkami ASM, to rzecz prawie nieosiągalna.

simrowit
-
Posty: 29
Rejestracja: 11 kwie 2012, 20:41
Lokalizacja: Żywiec

Post autor: simrowit » 23 wrz 2013, 20:07

W podanym przykładzie numer seryjny czujnika jest pomijany (1 czujnik - 1 pin) więc nie ma potrzeby rejestracji czujników, odpada część kodu poświęcona temu problemowi.

Do linii może być podpięte wiele DS-ów i poprawnie odczytamy ich serial, w Bascomie służą do tego polecania :

1WSEARCHFIRST, 1WSEARCHNEXT.

Oczywiście Bascom bardzo nie szanuje zasobów ale i tu znowu powiem, że nie jest ani gorszy ani lepszy, ma swoje wady i zalety, swoich zwolenników i przeciwników, natomiast podaje przykład w Bascomie chociaż faktycznie kolega endurasek nie podał w jakim języku pisze swój program.

Co do wykorzystania dwóch pinów, świetny pomysł, bardzo by to uprościło rejestrację czujnika. Z menu wybieramy miejsce pomiaru, podłączmy czujnik do "linii serwisowej", zczytujemy jego ID , a później podpinamy do magistrali roboczej gdzie mierzy już to co ma mierzyć i to też jest OK.

ODPOWIEDZ