logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Termometr DS1820 z mikrokontrolerem AVR

zasoby 05 Kwi 2005 14:39 21448 21
  • Proste rozwiązanie termometru od -55C do +125C z rozdzielczością 1C z wyświetlaczem LED o wspólnej anodzie. Jako czujnik zastosowany popularny DS1820. PortB mikrokontrolera zapewnia zasilanie poszczególnych segmentów wyświetlacza. Przyciski S1-S4 są opcjonalne.
    Na schemacie jest błąd, czujnik (wyprowadzenie 2 czujnika DS1820) powinien zostać podłączony do PD6 zamiast PD1 mikrokontrolera. Natomiast diodę (która i tak jest opcjonalna) podłączoną na schemacie do PD6 można przepiąć do PD1. Oprogramowanie napisano w języku C i skompilowano za pomocą CodeVision AVR. Można podłączyć kilka czujników do linii zmieniając tylko ID czujników.

    artykuł źródłowy
    http://chaokhun.kmitl.ac.th/~kswichit/avrthermo/avrthermo.html
    mikrokontroler można zaprogramować jak zaprezentowano:
    http://www.elektroda.net/mikrokontrolery/avr_az

    Fajne? Ranking DIY
    O autorze
    zasoby
    Poziom 23  
    Offline 
    zasoby napisał 784 postów o ocenie 432, pomógł 4 razy. Jest z nami od 2002 roku.
  • #2 1380752
    Konto nie istnieje
    Poziom 1  
  • #3 1381800
    DmZ
    Poziom 18  
    zasada powinna być taka sama. może znajdziesz coś w "mikrokontrolery avr w praktyce" dolińskiego. jest tam rozdział o transmisji szeregowej przez 1wire. z przykladami. czytałem, nie jest to szczególnie skompikowane (ale to jeszcze nie moj poziom bo teraz dopiero bawie się w RS'a).
  • #4 1382446
    lechoo
    Poziom 39  
    Program do tego termometru jest trochę brzydko napisany - multipleksowanie wyświetlacza lepiej zrobić w przerwaniach. Pozatym niezbyt elegancko wygląda wyłączanie wyświetlacza na czas pomiaru temperatury... Kiedyś wrzuciłem na elektrodę mój projekt zegara z termometrem (na DS1820 i 89C2051, wyświetlacz 20cm), powinien być w dziale prace dyplomowe - zapraszam do zapoznania się z tym projektem.
  • #5 1382905
    Konto nie istnieje
    Poziom 1  
  • #6 1382955
    warth
    Poziom 13  
    tak, trzeba zmienić kod, bo DS1820 podaje wynik z rozdzielczością 9 bitów natomiast DS18B20 standardowo ma ustawione, żeby zwracał postać 12 bitową... co prawda można mu przestawić tak, żeby zwracał wynik w postaci 9 bitów i zostanie to przez niego zapamietane, ale (jeśli się nie bylę) i tak inaczej się to troszkę przelicza na postać czytelną dla ludzia... /ps. zachęcam do przeczytania data sheet'u
  • #7 1383042
    Masteq
    Poziom 18  
    dgajew At90S2313 w wersji smd na allegro kosztuje od 2,75 do 4zl w zaleznosci od ilosci sztuk. Teraz Atmega8L mozna kupic za 6,91 :) Tzreba dobrze szukac :)
  • #8 1383336
    Konto nie istnieje
    Poziom 1  
  • #9 1385848
    Dariusz Goliński
    Poziom 22  
    A może potrafił by ktoś do tego dorzucić przkażnik i zrobić z tego termostat z regulowaną kisterezą ?

    Dodano po 59 [sekundy]:

    Sorki za literówkę oczywiście chodzi mi o histerezę.
  • #10 1419156
    Konto nie istnieje
    Konto nie istnieje  
  • #11 1419542
    DmZ
    Poziom 18  
    cześć. mam pytanie czy ktoś ma gotowe przykłady kodu w C użycia ds18b20? przeszukałem całą elektrode i akurat w C tego nie ma.

    działam na atmega8
    pozdrawiam
  • #12 1420008
    despertador
    Poziom 12  
    Kiedyś znalazłem coś takiego może się przyda

    UWAGA PODPROGRAMY NAPISANE SA DLA PROCESORA Z KWARCEM 24Mhz
    TERM linia portu obsługujaca DS-a
    ;*************************************************************************
    ; GRUPA PODPROGRAMOW ZWIAZANYCH Z POMIAREM TEMPERATURY
    ;*************************************************************************
    IOBAJT: PUSH 2 ;WYSLIJ ZAWARTOSC Acc LUB
    PUSH 3 ;CZYTAJ DO Acc (WTEDY WARTOSC POCZ Acc=0FFH)
    MOV R3,#8
    BILLIT: RRC A
    ACALL IOBIT
    DJNZ R3,BILLIT
    RRC A
    POP 3
    POP 2
    RET
    ;--------------------------------------------------------------
    IOBIT: CLR TERM ;WCZYTUJE LUB WYPROWADZA 1 BIT
    DB 0,0,0,0 ;2 uS
    MOV TERM,C
    MOV R2,#8
    DJNZ R2,$ ;8 uS
    MOV C,TERM
    MOV R2,#52
    DJNZ R2,$ ;52 uS
    SETB TERM
    RET
    ;-------------------------------------------------------------------------
    START_PTE: LCALL RESETDS ;ROZKAZ POMIARU TEMPERATURY
    MOV A,#0CCH ;0CCH POMIN NUMER SERYJNY
    LCALL IOBAJT
    MOV A,#44H ;44H
    LCALL IOBAJT ;WYKONAJ POMIAR TEMPERATURY
    RET
    ;***************************************************************
    RESETDS: PUSH ACC ; R E S E T DS1820 (CY = 1 DS NIE ODPOWIADA)
    PUSH B ;*********************************
    CLR TERM ;UJEMNY IMPULS RESET
    MOV B,#0 ;CZAS IMPULSU RESET
    CZ1: DB 0,0
    DJNZ B,CZ1 ;CZEKAJ ZE STANEM 0 PONAD 480uS
    SETB TERM ;UKLAD ODPOWIADA TEZ STANEM NISKIM
    SETB C ;BRAK STANU NISKIEGO SWIADCZY O BRAKU DS18B20
    MOV B,#35 ;LICZNIK PETLI
    CZ2: JNB TERM,CZ3 ;BRAK ODPOWIEDZI Z UKLADU
    DJNZ B,CZ2
    SJMP CZ6 ;UKLAD NIE ODPOWIADA
    ;-----------------------------
    CZ3: MOV B,#240 ;PRESENCE PULSE
    CZ4: JB TERM,CZ5
    DJNZ B,CZ4
    SJMP CZ6
    CZ5: CLR CY ;PRAWIDLOWY RESET
    CZ6: POP B
    POP ACC
    RET
    ;*************************************************************************
    CZYT_TEM: MOV A,#0CCH ;ODCZYTUJE ZMIERZONA TEMPERATURE
    LCALL IOBAJT ;0CCH POMIN NUMER SERYJNY
    ;---------------------------
    MOV A,#0BEH ;0BEH
    LCALL IOBAJT ;CZYTAJ REJESTRY WEWNETRZNE
    MOV R4,#9
    ;---------------------------
    READ_DS: MOV R0,#BUFOR_NA_TEMPERATURE ;WCZYTUJE DO BUFORA
    ADS2: MOV A,#255
    LCALL IOBAJT
    MOV @R0,A
    INC R0
    DJNZ R4,ADS2
    RET
    ;-----------------------------------------------------------------------
  • #13 1420624
    Konto nie istnieje
    Poziom 1  
  • #14 3392137
    adziej
    Poziom 12  
    moze pytanie jest glupie, ale jaka funkcje maja pelnic te cztery przelaczniki?
    dzieki za wyrozumialosc...
  • #15 3392235
    Decado
    Poziom 21  
    Hmm dołączam się do pytania kolegi
    A tak pozatym to zrobie to na lcd zmienie program i zamieszcze na forum.
  • #16 3392472
    Konto nie istnieje
    Poziom 1  
  • #17 3392477
    karel21
    Poziom 28  
    Masm pytanie ,jak zgrać Dallas18B20 zATTINY 12L (pewnie ma za małą pojembność)ale z Atmega8L-8PI,mam tego kilka sztuk i nie wiem ja k je wykorzystać, najlepiej byłoby chyba jako czujniki temperatury.Pomóż jak możesz, chodzi o program.Czy to co Podałeś będzie pasowało do mojego Atmega?
  • #18 3393157
    adziej
    Poziom 12  
    hej Decado! daj znac jak wrzucisz to na forum (i gdzie to wrzucisz)
    a moze moglibyscie mi pomoc, bo mam do zrobienia dokladnie takie cos jak tu zostalo przedstawione, tylko kilka czujnikow mam zamontowac. na czym polega zmiana ID i jak to sprzetowo rozwiazac?
    dzieki wielkie
    NAJLEPSZEGO W NOWYM ROKU
  • #19 7309362
    szymonweeia
    Poziom 10  
    Witam czy mogłby ktos operujący CodeVision AVR zamiescic tu pliki ds1820.h ds1820.c 1wire.h 1wire.c z biblioteki tego programu bo ja programuje pod AVRStudio i mam problemy z odpaleniek modu z pierwszego postu :)
  • #20 10980598
    swibno
    Poziom 11  
    Podłączę się pod stary temat dotyczący DS1820. Chciałem odczytać plik thermo.c z pierwszego postu ale jest zapisany w innym kodowaniu i nie mogłem go przeanalizować. Postanowiłem napisać kod samemu od początku na podstawie specyfikacji DS1820. [ATmega32][DS1820][AVRStudio6][C]. Niestety powoli mi to idzie.
    Po kilku dniach doszedłem do czegoś takiego:
    Termometr DS1820 z mikrokontrolerem AVR

    Następuje zerowanie czujnika, po czym odpowiada on impulsem obecności. Następnie próbuję wysłać komendę Skip_ROM do czujnika 0xCC co przedstawione jest na rysunku powyżej. I tu zaczynają się moje problemy. Nie wiem czy impuls został dobrze wysłany na magistralę. Sugerowałem się czasami podanymi w nocie katalogowej. Następnie chciałem wysłać komendę Convert_T 0x44. Nie jestem pewny co dalej i jak można sprawdzić czy wysłany bajt został dobrze zinterpretowany przez czujnik. Jaka jest dalsza kolejność działań aby poprawnie odczytać temperaturę i zapisać do zmiennej u_int8-t. Proszę o pomoc.
  • #21 10980953
    Jaś Wędrowniczek
    Poziom 10  
    Witam,

    Kolego swibno, jeżeli doszedłeś do wysyłania komendy konwersji 0x44, to następnie musisz odczekać, zgodnie z datasheetem do DS1820, 500 ms i przystąpić do odczytania scratchpada. Odbywa się to poprzez wysłanie do czujnika wartości 0xBE - po jej wysłaniu czujnik powinien odesłać zawartość swoich rejestrów. Widzę, że wykorzystujesz oscyloskop, więc będziesz mógł sprawdzić czy DS1820 tak się zachowuje. Komendę odczytu scratchpada możesz wysłać wcześniej, jednak czas 500 ms to czas, jaki czujnik potrzebuje na odczytanie nowej temperatury i zmianę w zależności od niej swoich rejestrów. Jeśli zignorujesz podany czas, to będziesz w stanie odczytać temperaturę, jednak będzie do wartość odpowiadająca temperaturze 85 stopni Celsjusza - to wartość domyślna, z jaką DS startuje :)

    Pozdrawiam,
    Piotr.
  • #22 10983425
    swibno
    Poziom 11  
    Dziękuję za podpowiedz. Informacje pomogły szybciej rozwiązać problem. Okazało się że dane były dobrze zapisywane i odczytywane z magistrali. Problem był w kolejności działań algorytmu odczytu temperatury. Bardzo pomocna okazała się również tabela 5 na stronie 23/27 noty katalogowej "Example: Temperature conversion and interpolation (external power supply and only one DS1820 assumed)." którą wcześniej przeoczyłem.
REKLAMA