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

Pomiar temperatury z dwóch DS1820 na dwóch różnych pinach ATMEGA16

mattsk 03 Maj 2011 16:30 3138 13
REKLAMA
  • #1 9465523
    mattsk
    Poziom 13  
    Witam, mam problem z przerobieniem biblioteki do obsługi DS1820, tak ,aby można było odczytywać temperature z kilku czujników umieszonych na osobnych pinach. Biblioteki pobrane są ze strony http://kursc.dioda.com.pl/.
    W podanym niżej pliku port PC0 do którego przypięty jest czujnik jest przypisany na sztywno. Chciałem zrobić tak:
    #define SET_ONEWIRE_PORT PORTC |= _BV(nr_czujnika)
    i przypisywać nr_czujnika wartości od 0 do 7. Probowałem tak zrobić, ale nie udało się :(. Jakieś pomysły?

    plik ds18b20.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    plik ds18b20.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    plik main.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 9465537
    gts1991
    Użytkownik obserwowany
    Pytanie czemu nie weźniesz spiszesz numer każdego Ds i zapisze go na stałe w uC i będziesz miał na jeden lini 1-wire wszytko?
  • #3 9465799
    misiolowaty
    Poziom 13  
    gts1991 napisał:
    Pytanie czemu nie weźniesz spiszesz numer każdego Ds i zapisze go na stałe w uC i będziesz miał na jeden lini 1-wire wszytko?


    to ma sens i ja bym też tak zrobił :)
  • REKLAMA
  • #5 9467541
    piotrva
    VIP Zasłużony dla elektroda
    Światło w pokoju można wyłączyć wyłącznikiem, a Ty idziesz do elektrowni..
    Poszukaj na google bo przykładów jest na pęczki, a jedna z bibliotek ma też gotową implementację dla wielu linii z tego co pamiętam
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #7 9467581
    Karol966
    Poziom 31  
    Kiedyś przerobiłem na szybko jedną z dostępnych bibliotek na obsługę kilku ds18b20 na różnych liniach:

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


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



    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 13698093
    lukiiiii
    Poziom 29  
    Czy kolega Karol966 może bardziej przybliżyć powyższe kody' C? Który jest który, chodzi mi o to jak nazwać pliki z nimi.

    Zmienna temp jest zmienną globalną czy ostatni kod to main.c?
  • #9 13698120
    Karol966
    Poziom 31  
    Pierwszy od góry 1wire.h (tam brakuje #ifndef ONEWIRE_H...)
    Drugi to oczywiście 1wire.c
    Trzeci to użycie (wtedy jeszcze w main) obecnie używam dodatkowo pilku ds18b20.c w którym między innymi mierzę temperaturę a funkcję przerobiłem na taką, która nie używa zmiennej globalnej (w tym przypadku temp to globalna).
    W tej funkcji wypada zrobić kilka modyfikacji. Wywalić tą zmienną temp (za miast tego wystarczy zrobić return (lsb+(msb*256)); + zmiana deklaracji funkcji z void na uint16_t
    Do tego jeszcze wypada zrobić rozróżnianie znaku temperatury ;)
  • #10 14374383
    guziecpz
    Poziom 11  
    Przecież... kod Karola966 dotyczy czujników podpiętych pod OneWire.

    Tymczasem temat zasadniczy brzmi:
    Jak odczytywać temperaturę z kilku czujników umieszczonych na osobnych pinach.

    Zatem, jak odczytywać?
  • #11 14375323
    Karol966
    Poziom 31  
    guziecpz napisał:
    dotyczy czujników podpiętych pod OneWire
    ,
    guziecpz napisał:
    Jak odczytywać temperaturę z kilku czujników umieszczonych na osobnych pinach.


    Sugerujesz kolego, że nie zrozumiałem tematu i podałem złą pomoc? Sam używam tego właśnie kodu z lekkimi modyfikacjami polegającymi na podaniu portu i pinu jako parametr wywołania funkcji. Teraz można go użyć tylko w obrębie jednego portu. Jednocześnie obsługiwałem do tej pory max 7 czujników rozrzuconych po wszystkich portach procesora. Do tego konwersja wszystkich temperatur trwała ok 800 ms ;)
  • #12 14375678
    guziecpz
    Poziom 11  
    Karol, 966,
    dzięki za odzew. Błąkam się po elektrodzie, rozumiesz, i szukam sposobu na to, jak nie powielając kodu odczytywać temp z dwóch czujników. Trafiłem tutaj i zacząłem próbować odczytać Twój kod. Odniosłem wrażenie, że jest on dostosowany do odczytu dwóch czujników podpiętych pod 1Wire.

    Jeśli tak nie jest, to bądź tak miły i, skoro znalazłeś chwilę, wytłumacz mi w którym miejscu zmieniają się parametry. Inaczej mówiąc, gdzie chcąc adaptować ten kod do moich PD7 i PB0 miałbym wpisać odpowiednie porty i piny.

    Czacha mi już dymi, od dwóch tygodni gryzę się z C, ale powoli... powoli... :D

    Pozdrowienia,
    guziecpz
  • #13 14375710
    Karol966
    Poziom 31  
    Niestety, w Twoim konkretnym przypadku trzeba ten kod dalej zmodyfikować. Możesz w tej postaci obsłużyć czujniki na procie np PD7 i PD0 ale nie na różnych portach. Obecnie, wywołując funkcję Read_DS18B20 podajesz dosłownie numer pinu na którym podłączony jest czujniki dla danego portu, sam port jest zdefiniowany globalnie
    
    #define IW_DDR 	DDRA
    #define IW_PORT	PORTA
    #define IW_PIN	PINA
    
  • #14 14375727
    guziecpz
    Poziom 11  
    Dzięki, rozumiem.

    Kolejne pytanie: czy mi się wydaje, czy program odwołuje się też do ROM-u czujników?
    Wydaje mi się, że chyba nie musi. Tymczasem w kodzie są odwołania do ROM.
REKLAMA