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

wybudzanie atmega8 z trybu power-down z użyciem watchdoga

wojtektorr 04 Lut 2014 17:15 2673 11
REKLAMA
  • #1 13261223
    wojtektorr
    Poziom 14  
    Witam posiadam odbiornik IR z zasilaniem bateryjnym i w celu zmiejszenia poboru energii chciałbym usypiać procesor. Nie mam doświadczenia z trybem oszczędności ani watchdogiem. Gdzieś coś poszperałem i skleciłem taką obsługę przerwania dla watchdoga:

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


    Konfiguracja Watchdoga :

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


    W przerwaniu fukcja detect odbiera dane z nadajnika IR. Chciałbym uzyskać efekt taki że co 20 s funkcja detect jest uruchamiana i jesli nic nie odbiera idzie nadal spać a jeśli odbiera to jest aktywny przez 10 s i znow idzie spac. Nie bardzo wiem jak to ugryźć, proszę o pomoc.
  • REKLAMA
  • #2 13261242
    dondu
    Moderator na urlopie...
    Nie sprawdzałem programu ponieważ moim zdaniem powinieneś (o ile to możliwe) tak zaprojektować układ, by sygnał z odbiornika podczerwieni wybudzał mikrokontroler za pomocą przerwania INT wyzwalanego stanem niskim (AVR).
  • #3 13261384
    wojtektorr
    Poziom 14  
    Tak byłoby najlepiej ale układ już polutowany i muszę się ograniczyc do czasowego usypiania na sztywno np. tak: czeka 10s na dane przychodzace z IR jesli nic nie ma to idzie spac na 20s i tak w kółko. Jak zrealizować takie odmierzanie czasu skoro kiedy jest w trybie power-down timery nie działają?
  • #4 13261566
    excray
    Poziom 41  
    A odbiornik IR ile pobiera prądu?
  • REKLAMA
  • #5 13261704
    wojtektorr
    Poziom 14  
    TSOP332 pobiera ok 1,5 mA
    Według tego opisu chciałem wykonać http://donalmorrissey.blogspot.com/2010/04/sleeping-arduino-part-5-wake-up-via.html
    wybudzanie i jak widać w obsłudze przerwania watchdoga można sprawdzić czy jest coś "do roboty" ale w pdf atmegi nigdzie nei widze takiego rejestru do ustawianie zezwolenia przerwania WDT_vect. W tym procesorze nie można tego wykonać?
  • REKLAMA
  • #6 13263242
    pbuhne
    Poziom 15  
    ATMEGA8 nie posiada WDT_vect, takie przerwanie wystepuje natomiast w ATMEGA88.
  • #7 13263887
    excray
    Poziom 41  
    Nie rozumiem w ogóle jak to ma działać. Będziesz "świecił" pilotem w IR przez 20s? W oparciu o MCUCSR i bit WDRF można wykryć i zareagować na reset ze strony WD niemniej cały obecny algorytm jest mocno niedoskonały. Równie dobrze można wlutować w miejsce A8 np. Atmegę48/88/168 i skorzystać z PCINT.
  • #8 13264134
    Eagle
    Poziom 24  
    wojtektorr napisał:
    Tak byłoby najlepiej ale układ już polutowany(...)


    Przelutuj układ, podłącz odbiornik do przerwania zewnętrznego, wprowadź uC w power down. Przerwanie go obudzi gdy coś pojawi się na IR, zanalizujesz i uśpisz ponownie. Bo jeśli masz zasilanie bateryjne i przez noc nie pojawi się żaden sygnał albo przez kilka dni, uC nie obudzi się. Przy zastosowaniu WD i algorytmu jaki podałeś będzie działał z "pełną mocą" przez 30% czasu podłączenia, więc długo na baterii nie podziała. Kolejne jak chcesz wykryć sygnał który będzie nadawany w czasie gdy uC będzie spał ? Jak napisał excray musiałbyś mieć sygnał IR w najgorszym przypadku ponad 20sek.
    Resumując nie idź w tym przypadku drogą z WD.
  • REKLAMA
  • #9 13266178
    wojtektorr
    Poziom 14  
    Rozumiem doskonale ale zrobiłem coś innego, mianowicie przy resecie watchdoga zmienne sie resetują ale można zdefiniować zmienna w ten sposób :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Stan zmiennej jest zapamiętywany nawet po resecie watchdoga. Dlatego można zliczac cykre uruchomienia resetu.

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


    Należałoby tu usprawnić dodając timer odliczajacy dany okres przez jaki chcemy odbierac dane aby watchdog w momencie odbierania danych nie resetowal nam nadal procesora. Po zakończeniu tego czasu znów go uruchamiamy. Potrzebuje pomocy w jeszcze jednej sprawie, mianowicie o czymś zapominam i program nie chce wchodzić w przerwanie od timera konfiguracja następująca:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    no i obsługa przerwania:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Próbowałem takżę z konfiguracja Timera1 i takżę nie wchodzi do przerwania. O co tu może chodzić?
  • #10 13268744
    Eagle
    Poziom 24  
    Aleś się uparł na WD.

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


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


    Skąd pewność, że nie wchodzi do przerwania ? Może zamienne, które zmieniasz w przerwaniu, używasz gdzieś bez volatile. Generalnie na podstawie fragmentu kodu, który pokazałeś nie wiele można wnioskować.
  • #11 13270975
    wojtektorr
    Poziom 14  
    delay w przerwaniu wrzuciłem tylko w celu sprawdzenia czy timer poprawnie skonfigurowany i czy wchodzi do obsługi przerwania. Przy następnym projekcie wymagajacym oszczedzania energii na pewno zrobie na zewnetrznym przerwaniu :) Dzięki wszystkim za pomoc. Temat zamknięty.
  • #12 13271066
    Tomasz Gumny
    Poziom 28  
    Zobacz, jak to zostało zrobione w AVT5343.
REKLAMA