Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Termometr Attiny2313 + DS18S20 + 4 x 7 segmentowy LED

lukaszkny 12 Wrz 2013 15:42 3147 17
  • #1 12 Wrz 2013 15:42
    lukaszkny
    Poziom 11  

    Witam,

    Potrzebuje pomocy w napisaniu obsługi czujnika DS18S20 w języku C. Sterowanie wyświetlaczem zrozumiałem i wiem jak je zrobić, ale napisanie kodu do czujnika to czarna magia.

    Próbowałem z biblioteką rklibavr ale były problemy z bibliotekami.

    Czujnik mam podpięty do wyjścia PB5 (nóżka 17). Pomiędzy DQ, a zasilanie wpięty jest rezystor 4,7kΩ.

    Może to być gotowy kod, tylko najlepiej opisany bo chciał by zrozumieć co i jak.

    Pozdrawiam,
    Łukasz

    P.S. Programuje w AVR Studio 4

    0 17
  • #2 12 Wrz 2013 16:12
    michcior
    Poziom 30  

    A ta noga pracuje jako "otwarty dren"? Jeśli nie, to trzeba podczas pracy włączać i wyłączać funkcję wejściową pinu. Mam taki kod na PIC18.
    Najłatwiej jest gdy podłączy się DSa do portu szeregowego, wtedy zależności czasowe załatwia sam UART. Tylko w takim wypadku do DQ trzeba podłączyć również wejście UART czyli RX.

    0
  • #4 12 Wrz 2013 19:16
    Rudolf_1
    Poziom 10  

    Witam,

    podepnę się do dyskusji. W jaki sposób identyfikowane są wszystkie DS18B20? Dla wyjaśnienia: mam (będę miał bo dopiero zaczynam budowę) kilka termometrów DS i chcę je przypisać do konkretnych obiektów stąd pytanie w jaki sposób następuje detekcja poszczególnych DS'ów. Od najmniejszej wartości kodu ROM, czy decyduje długość kabla, czy może za każdym razem jest to przypadek?

    0
  • #5 12 Wrz 2013 20:06
    BlueDraco
    Specjalista - Mikrokontrolery

    To wszystko jest dokładnie opisane w dokumentacji i notach aplikacyjnych dostępnych u producenta.

    0
  • #6 13 Wrz 2013 09:36
    GanzConrad
    Poziom 21  

    kolego, DS18b20 w tej dziedzinie jest jak stacyjka w samochodzie. Wszyscy to przechodzili i jeśli nic nie znajdujesz to po prostu źle szukasz. Nie jest to czyjaś upierdliwość tylko zwykłe zmęczenie materiału. Poza tym sporo z nas pisało te procedury od zera, więc jak również to zrobisz to hameryki nie odkryjesz ;-)
    poszukaj biblioteki kolegi Peter Dannegger
    poza tym:
    http://www.1-wire.rms.biz.pl/
    http://mikrokontrolery.blogspot.com/2011/04/temperatura-pomiar.html
    http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=8

    0
  • #7 13 Wrz 2013 13:32
    lukaszkny
    Poziom 11  

    Mam teraz innego rodzaju problem, brakuje mi pamięci na uruchomienie programu.


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 13 Wrz 2013 13:49
    lukaszkny
    Poziom 11  

    Opytmalizacja ustawiona na -Os

    0
  • #11 13 Wrz 2013 15:09
    lukaszkny
    Poziom 11  

    Dodam, że pamięci zaczyna brakować, gdy chcę wykonać instrukcje if. Jeśli daje ją w komentarz to program używa 20.2%, a z nią 131% i data 206%.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #13 13 Wrz 2013 18:27
    Rudolf_1
    Poziom 10  

    Rudolf_1 napisał:
    Witam,

    podepnę się do dyskusji. W jaki sposób identyfikowane są wszystkie DS18B20? Dla wyjaśnienia: mam (będę miał bo dopiero zaczynam budowę) kilka termometrów DS i chcę je przypisać do konkretnych obiektów stąd pytanie w jaki sposób następuje detekcja poszczególnych DS'ów. Od najmniejszej wartości kodu ROM, czy decyduje długość kabla, czy może za każdym razem jest to przypadek?


    Pomimo WIELU wskazówek nie wyczytałem nic co by choć trochę naprowadziło mnie na trop rozwiązania problemu.

    "Sekwencja inicjalizacji umożliwia układowi master wykrycie podłączonych do niej układów slave. Po czasie koniecznym do pełnej inicjalizacji układów podrzędnych możliwe staje się przeprowadzenie normalnej transmisji danych."

    Widziałem kilka listingów programów ale tam jest "ręcznie" przypisywany adres do nazwy "obiektu". Jeżeli nie da się inaczej, to nie ma problemu - napiszę sobie procedurę detekcji na zasadzie włączeń i wyłączeń układu z podpiętym za każdym razem innym DS'em. Moje pytanie jest takie: czy nie można tego zrobić prościej (czyli znać algorytm nadawania kolejnych numerów kolejnym slavom)? Z góry dziękuję za oświecenie.

    0
  • #14 13 Wrz 2013 18:41
    lukaszkny
    Poziom 11  

    Udało coś się uruchomić. Tylko teraz mam pytanie z innej beczki. Jeśli czujkę ma na kablu, to kabe powinien być 2 żyłowy czy 3?

    Bo z tymi schematami co mam to już się trochę pogubiłem, bo według schematów które mam to nóżki 1 i 3 złączyć razem i wpiąć pod GND, a 2 pod nóżkę mikroprocesora i Vcc z rezystorem.

    Jak teraz popatrzyłem na inne schematy, to jest coś raczej nie tak.


    Dobra już znalazłem co i jak. Może tak być.

    0
  • #15 14 Wrz 2013 12:05
    lukaszkny
    Poziom 11  

    Teraz mam problem z odczytem temperatury.
    DSTempToStr(text, ds18b20_pad[0], ds18b20_pad[1]);

    Jeśli dobrze rozumiem to:
    ds18b20_pad[0] - mniej znaczący bit ?
    ds18b20_pad[1] - bardziej znaczący bit ?


    Funkcja sprawdzająca zmienną text, pokazała że na text[3] jest kropka, a na text[6] jest 0. Więc raczej źle coś konwertuje, bo po podpięciu drugiego czujnika jest to samo.


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #17 14 Wrz 2013 21:10
    lukaszkny
    Poziom 11  

    Wczytałem się w specyfikacje DS18b20, i już wiem które to bajty są odpowiedzialne za temperaturę.

    Czy taki zapis char* tab = ds18b20_pad[1]; zwróci mi poszczególne bity?

    Czy wyprowadzenie z mikroprocesora powinno byś ustawione jako wejściowe czy wyjściowe? A jak wyjściowe to stan niski czy wysoki?

    0
  • #18 15 Wrz 2013 16:27
    lukaszkny
    Poziom 11  

    Problem rozwiązany program działa. Tu jest jeszcze ciekawa strona: Link.

    Teraz jeszcze tylko muszę popracować nad jasnością wyświetlacza, bo za małe napięcie wychodzi na zasilanie.

    0