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

[AVR C Atmega16] - Obsługa dwóch temometrów DS18B20

11111olo 27 Paź 2016 19:15 1656 13
  • #1 16022254
    11111olo
    Poziom 42  
    Witam.
    Napisałem program odczytujący temperaturę z w/w termometru przy użyciu czyjejś biblioteki i ją wyświetlający.
    Wszystko działa jak należy, jednak nie wiem jak skorzystać z tej biblioteki aby odczytać temperaturę z drugiego termometru podłączonego do innego pinu mikrokontrolera.

    Odczyt temperatury w pętli głownej:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Biblioteka konfiguracji pinów ds18b20.h

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    oraz ds18b20.c do do odczytu temperatury

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Drugi termometr jest podłączony do piny D4.
  • #2 16022412
    Eagle
    Poziom 24  
    Dlaczego musisz podłączyć pod drugi pin, zamiast podłączyć wiele pod jeden pin i skorzystać z metody enumeracji ?
  • Pomocny post
    #3 16022869
    piotrva
    VIP Zasłużony dla elektroda
    @Eagle - widać Autor ma jakieś uzasadnienie, czasem lepiej jest podpiąć pod osobne piny choćby dlatego, aby mieć pewność gdzie dany czujnik się znajduje i aby system nie wysypywał się po podmianie nie działającego czujnika.

    @11111olo - biblioteka jest dosyć podstawowa - zasadniczo najlepiej by było napisać od nowa funkcje niskopoziomowe tak, aby jako argument przyjmowały w jakiejś formie zestaw rejestrów do obsługi danego pinu - w tej chwili te operacje są hrdkodowane tam, gdzie źródło funkcji takich jak np.: ONEWIRE_OUT_LONEWIRE().
  • #4 16023187
    11111olo
    Poziom 42  
    piotrva napisał:
    zasadniczo najlepiej by było napisać od nowa funkcje niskopoziomowe tak, aby jako argument przyjmowały w jakiejś formie zestaw rejestrów do obsługi danego pinu

    Masz gdzieś pod ręką jakiś przykład?
    Eagle napisał:
    Dlaczego musisz podłączyć pod drugi pin, zamiast podłączyć wiele pod jeden pin i skorzystać z metody enumeracji ?

    Bo tak musi być ze względu na niezawodność.
  • #5 16023690
    Eagle
    Poziom 24  
    Cytat:
    aby system nie wysypywał się po podmianie nie działającego czujnika.


    Nie bardzo rozumiem jak system miałby się wysypywać po podmianie czujnika, przecież po to robisz enumerację na początku aby uzyskać numer czujnika. Dobrze, że autor nie ma więcej czujników niż pinów uC.

    Cytat:
    Masz gdzieś pod ręką jakiś przykład?


    Poniższe rozwiązanie jest najgorsze z możliwych, ale widzę, że nieco błądzisz i tylko tak możesz sobie z tym poradzić.

    1) skopiuj ds18b20.h i zmień nazwę na ds18b20_1.h
    2) dodaj do wszystkich definicji oraz w deklaracjach i miejscach wywołań postfix "_1"
    przykład :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    3) zrób to samo dla pliku ds18b20.c -> ds18b20_1.c
    4) powtórz kroki 1-3 z postfiksem "_2"
    5) przypisz dla ONEWIRE_PIN_1 i ONEWIRE_PIN_2 odpowiednie piny oraz ustal dalsze niezbędne wartości.
    6) wywołuj z kodu odpowiednia
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 16023720
    11111olo
    Poziom 42  
    Eagle napisał:
    Nie bardzo rozumiem jak system miałby się wysypywać po podmianie czujnika

    Nie będę odchodził od istoty tematu bo to nie ma żadnego znaczenia. Muszą byc dwa termometry podpięte osobno i koniec!

    To co proponujesz to oczywista oczywistość. Dwa razy ta sama biblioteka ale i dwa razy więcej kodu :(
  • #7 16023734
    Eagle
    Poziom 24  
    Cytat:
    Muszą byc dwa termometry podpięte osobno i koniec!


    Twoja sprawa, choć odpowiedź istna pięciolatka, gdy pytam dlaczego jeszcze nie śpi, nie bo nie. Nie sądzisz, że możesz mieć błędne założenia ? Jeśli już koniecznie muszą być dwa osobne piny to, stwórz strukturę z adresami na port, pin_in, pin_out, ddr, nr pinu , wypełnij dwie struktury odpowiednio i przekazuj jako argument - de facto to samo co proponował piotrva. Jeśli jest to na tym samym porcie, to może jako argument wystarczy tylko nr pinu, jednak musisz przepisać to sam. Ja i nie tylko, mam kilka czujników na jednym pinie i wszystko działa od lat bez problemów.
  • #8 16023748
    piotrva
    VIP Zasłużony dla elektroda
    Eagle napisał:
    Nie bardzo rozumiem jak system miałby się wysypywać po podmianie czujnika, przecież po to robisz enumerację na początku aby uzyskać numer czujnika.

    Choćby - załóżmy mamy zapisane czujniki w pamięci EEPROM. O ile padnie jeden - spokojnie możemy wykryć że nie ma czujnika o danym ID i domyślić się, że ten z nowym ID go zastępuje. Niestety jak padną 2 to skąd program ma wiedzieć, że czujnik NOWY1 jest w kuchni a NOWY2 w garażu? a nie na odwrót? Można zrobić w menu cały system ustawiania tego, tylko czasem jest prościej powiedzieć klientowi: "Proszę wpiąć czujnik do gniazda KUCHNIA" zamiast: "Jak wyświetla dziwne temperatury to proszę wejść do menu, kliknąć na ..."
  • #9 16023762
    11111olo
    Poziom 42  
    piotrva napisał:
    prościej powiedzieć klientowi: "Proszę wpiąć czujnik do gniazda KUCHNIA

    To akurat nie jest robione pod klienta ale problemem jest samo przypisanie czujnika które oznaczało by konieczność programowania procesora. Tu nie ma wyświetlacza LCD czy nawet LED więc dodatkowe komplikacje są zbędne.
  • #10 16023769
    Eagle
    Poziom 24  
    Awaria dwóch czujniki w jednym momencie, klient sam serwisuje sprzęt, do tego ilość czujników ograniczona ilością wolnych pinów, ciekawy model. Spodziewałem się czegoś bardziej praktycznego, typu kocioł/piec ma podejmować decyzję na podstawie odczytu temp. i dlatego czujnik jest zdublowany aby nie przerywać dostarczania ciepła w wyniku awarii czujnika. Jak pokazuje życie, są problemy, których nie można rozwiązać w typowy sposób, bo nie.
  • #11 16024106
    11111olo
    Poziom 42  
    To nie będzie pełniło żadnej krytycznej funkcji i chcę tak a nie inaczej zrobić. Czy to źle?

    *********
    EDIT

    Zrobiłem to troszkę inaczej.
    W pliku ds18b20.h dodałem

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W plikuds18b20.c dodałem parametr informujący o wybranym termometrze.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To oczywiście tylko fragment kodu. Identycznie to wygląda w pozostałych funkcjach. Dwa podłączone termometry odczytują się poprawnie.
    Dziękuję za pomoc.
    Na tym mogę zakończyć temat, chyba, że ktoś ma coś jeszcze do dodania.
  • #12 16024205
    Eagle
    Poziom 24  
    Cytat:
    To nie będzie pełniło żadnej krytycznej funkcji i chcę tak a nie inaczej zrobić. Czy to źle?

    Śmiało, rób jak potrafisz. Po prostu chciałem wiedzieć dlaczego, teraz już wiem - "bo tak".
  • #13 16072080
    Sławek-K
    Poziom 15  
    Koledzy z większym doświadczeniem oczywiście podpowiadają na pewno w dobrą stronę , ale najpewniej zapomnieli już swoje pierwsze kroki. Prostota i wydajność kodu itp itd nie idą z łatwością , która przecież jest niezbędna dla początkujących. A myślę , że Autor właśnie na to postawił.
    Ja mam pytanie do autora i nie tylko, dlaczego i w jakim celu jest linia .
    (Co by było bez niej)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 16183718
    11111olo
    Poziom 42  
    Dzięki za pomoc.
REKLAMA