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

Termometr Attiny2313 + DS18S20 + 4 x 7 segmentowy LED

lukaszkny 12 Wrz 2013 15:42 3654 17
REKLAMA
  • #1 12727880
    lukaszkny
    Poziom 11  
    Posty: 75
    Ocena: 4
    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
  • REKLAMA
  • #2 12727965
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    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.
  • REKLAMA
  • #4 12728600
    Rudolf_1
    Poziom 11  
    Posty: 18
    Pomógł: 1
    Ocena: 3
    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?
  • REKLAMA
  • #5 12728839
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    To wszystko jest dokładnie opisane w dokumentacji i notach aplikacyjnych dostępnych u producenta.
  • #6 12730379
    GanzConrad
    Poziom 25  
    Posty: 934
    Pomógł: 67
    Ocena: 203
    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
  • #7 12731098
    lukaszkny
    Poziom 11  
    Posty: 75
    Ocena: 4
    Mam teraz innego rodzaju problem, brakuje mi pamięci na uruchomienie programu.


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 12731156
    lukaszkny
    Poziom 11  
    Posty: 75
    Ocena: 4
    Opytmalizacja ustawiona na -Os
  • REKLAMA
  • #11 12731404
    lukaszkny
    Poziom 11  
    Posty: 75
    Ocena: 4
    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 / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #12 12731435
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    A propos tego if(), to zastąp go tablicą i indeksem lub wskaźnikiem, a sporo zyskasz.
    Poza tym, dlaczego deklarujesz cyf w pętli? Zrób to na początku programu.

    I dodatkowa lektura: http://mikrokontrolery.blogspot.com/2011/04/temperatura-wyswietlacz-konwersja.html
  • #13 12732066
    Rudolf_1
    Poziom 11  
    Posty: 18
    Pomógł: 1
    Ocena: 3
    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.
  • #14 12732122
    lukaszkny
    Poziom 11  
    Posty: 75
    Ocena: 4
    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ć.
  • #15 12734321
    lukaszkny
    Poziom 11  
    Posty: 75
    Ocena: 4
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • #17 12736441
    lukaszkny
    Poziom 11  
    Posty: 75
    Ocena: 4
    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?
  • #18 12738933
    lukaszkny
    Poziom 11  
    Posty: 75
    Ocena: 4
    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.

Podsumowanie tematu

✨ W dyskusji poruszono problem implementacji obsługi czujnika DS18S20 w języku C na mikrokontrolerze ATtiny2313. Użytkownik Łukasz miał trudności z kodowaniem, szczególnie w kontekście komunikacji z czujnikiem oraz zarządzania pamięcią. W odpowiedziach zasugerowano użycie bibliotek, takich jak rklibavr, oraz podano linki do przydatnych zasobów. Użytkownicy wymienili się informacjami na temat identyfikacji czujników DS18B20, a także optymalizacji kodu, aby zredukować zużycie pamięci. Ostatecznie Łukasz rozwiązał problem z odczytem temperatury i planował poprawić jasność wyświetlacza LED.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA