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.

[ATmega16][c] konstrukcja programu - termometr na DS18B20

ma3-4ysz 09 Paź 2009 00:05 3077 2
  • #1 09 Paź 2009 00:05
    ma3-4ysz
    Poziom 24  

    Witam!
    Sprzęt:
    - ATmega16 (PDIP40), taktowanie - wewnętrzny oscylator 8MHz
    - cyfrowy termometr na magistrali 1-Wire DS18B20 (narazie jeden, później 3 ) podłączony 3-przewodowo,
    - LCD 2x16 na sterowniku HD44780,
    Soft:
    - WinAVR (avr-gcc 3.4.3).
    Zaznaczam, że w tej dziedzinie jestem raczkujący - parę lat już się za to zabieram. Chciał bym zbudować na początek jednopunktowy termometr, później trójpunktowy termometr z prezentacją temperatury na LCD (pomiar co około 10s , z rozdzielczością 0,1*C).
    Proszę o poradę jak zorganizować program odczytujący temperaturę z DS18B20 i wyświetlający ją na LCD: co umieścić w programie głównym, co w przerwaniu, którego licznika użyć i w jakim trybie do wywoływania obsługi przerwania od odczytu? Czy wyświetlanie też robić w przerwaniu? Gdzie w programie ustawiać / kasować kluczowe bity? O czym nie zapomnieć, żeby to mogło działać?
    Czyli nie pytam o gotowy kod tylko jak zabrać się za jego składanie, żeby zrobić to dobrze, możliwie optymalnie czyli zgodnie ze sztuką?
    Zresztą gotowego kodu bez powyższej wiedzy i tak nie ogarnę, a od czegoś trzeba zacząć...

    0 2
  • #2 09 Paź 2009 00:22
    Myrek1
    Poziom 23  

    Jeśli ma to być tylko termometr, to obejdzie się nawet bez timerów. Nie ucz się wykonywać poważny kod w przerwaniach. Tam mają być tylko zasygnalizowane pewne działania, np. ustawienie falgi do odczytu czegoś tam, a dopiero kod w funkcji głównej po napotkaniu flagi to robi. Unika się wykonywania zajmującego cykle podprogramu w przerwaniach ze względu na to, że w tym czasie nie jest wykonywany inny potrzebny kod. Np masz odczyt z 1-wire, trwa to ileś tam mikrosekund (stan 0 lub 1) i raptem wyskoczy Ci przerwanie, które trwa tam ileś czasu. Następuje powrót do programu odczytu z 1-wire i czasy są już inne, co może zaszkodzić. Oczywiście można blokować przerwania, ale nie o to chodzi....

    Ogólnie inicjalizujesz wszystko w funkcji main(), a w pętli głównej robisz odczyt z 1-wire, przetworzenie tego na temperaturę i w 3 funkcji wyświetlenie tego na LCD. I tak w kółko. Możesz w między czasie dać jakiegoś _dalay_ms() albo jeśli chcesz 10s to Timera 16-bitowego i liczysz te 10 sekund na opóźnienie dla przetworzenia temperatury przez czujnik. To najprostszy sposób. Dla 3 czujników robisz 3 odczyty, 3 przetwarzania na temp.
    Ciężko coś tak na sucho napisać. Ściągnij jakiś gotowy kod i zobacz jak wygląda organizacja funkcji. Nauka na własnych błędach to najlepszy rodzaj nauki ;)

    P.S. WinAVR, nie VinAVR ;)

    0
  • #3 09 Paź 2009 10:07
    tmf
    Moderator Mikrokontrolery Projektowanie
  Szukaj w 5mln produktów