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

ATMEGA32 - Jak obudzić mikrokontroler z trybu oszczędzania energii?

PiotrLotnik 19 Paź 2005 23:10 1545 10
REKLAMA
  • #1 1912464
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Witam.
    Męczę się już drugi dzień z trybami oszczędności energi :(
    Uśpić M32 to ja już umiem na wszystkie możliwe sposoby ale obudzić potem go już nie potrafie:(

    Sprawa może była by prostsza ale mam do dyspozycji tylko budziki w positaci TIMER(0,1,2)

    Program pisze w BASCOM AVR i to co dotej pory nakombinowałem nie nadaje się do pokazania :) wiec jak ktoś ma jakieś doświadczenie niech coś mi podeśle.

    Pozdrawiam
  • REKLAMA
  • #2 1912649
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    Jeżeli "masz do budzenia" tylko Timery to polecenie-tryb POWERDOWN odpada, ponieważ wybudzić można tylko poprzez układu WATCHDOG, zewnętrzny sygnał reset lub za pomocą zewnętrznego sygnału przerwania.
    Tryb IDLE nadaje się. Usypiasz poleceniem IDLE a budzisz dowoolnym przerwaniem.
    Pozdrawiam.
  • REKLAMA
  • #3 1913085
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    Ok.
    Bez problemowo usypiam go poleceniem IDLE i budze TIMER0, jednak zależy mi na tym aby układ spał przez dłuższy czas niż jedno przepełnienie licznika Timer0.
    Próbuje jakoś sensownie usypiać go kilkakrotnia w ten sposób:

    $regfile = "m32def.dat"
    $crystal = 1000000
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Tim0_wakeup
    Enable Timer0
    Enable Interrupts

    Do
    'Jakiś program
    .
    .
    .
    Do
    Start Timer0
    Idle
    Tim0_wakeup:
    Stop Timer0
    Timer0 = 0

    Incr Pamiec
    Loop Until Pamiec = 5 ' Ma się usypiać 5 razy

    'Dalsza część programu wykonywana po przebudzeniu
    .
    .
    Loop

    Niestety po pierwszym razie program się zawiesza :(
  • REKLAMA
  • Pomocny post
    #4 1913185
    K_o_n_r_a_d
    Poziom 23  
    Posty: 318
    Pomógł: 86
    Ocena: 9
    PiotrLotnik napisał:
    $regfile = "m32def.dat"
    $crystal = 1000000
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Tim0_wakeup
    Enable Timer0
    Enable Interrupts
    
    Do
    'Jakiś program
    .
    .
    .      
    Do
    Start Timer0
       Idle
    Tim0_wakeup:
       Stop Timer0
       Timer0 = 0
    
    Incr Pamiec
    Loop Until Pamiec = 5            ' Ma się usypiać 5 razy
    'Dalsza część programu wykonywana po przebudzeniu
    .
    .
    Loop
    

    Niestety po pierwszym razie program się zawiesza :(

    Coś bardzo komplikujesz ten trogram. Stos Ci się zapycha bo nie używasz polecenia return.
    Ja bym zrbił tak (chcemy aby "spał 5 razy"):
    $regfile = "m32def.dat"
    $crystal = 1000000
    dim licznik_przerwan as byte
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Tim0_wakeup
    Enable Timer0
    Enable Interrupts
    
    Do
       ...
    
       licznik_przerwan=0
       start timer0
       do
          idle
       loop until licznik_przerwan>4
       stop timer0
    
       ...
    Loop:end
    
    Tim0_wakeup:
       licznik_przerwan=licznik_przerwan+1
    return
    
    A może lepiej do wybudzania użyć WATCHDOGA i usypiać poprzez przejście w tryb POWERDOWN (wtedy uK praktycznie nie pobiera prądu w przeciwieństwie do IDLE)?
  • #5 1913277
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    ok. Wielkie dzieki, faktycznie musial mi sie stos zalewac:)
    Teraz wszystko działa tylko jak tu go uśić na 24h tym sposobem.

    Co do POWERDOWN to w tej wersji programu odpada bo po resecie WATCHDOG program by sie zaczynał od nowa (a na początku mam takie ładne powitanie przygotowane).
    Może gdyby program uzależnił od jakiejś zmiennej przechowywanej w pamięci EEPROM i od niej uzależnił wykonywanie programu.
    np.

    Dim xx as eram byte


    On xx goto powitanie , glowny_program

    powitanie:
    .
    .
    .
    xx = 1 ' po resecie program bedzie pomijał powitanie

    Glowny_program:
    .
    .
    .
    END

    Tylko trzeba jeszcze dorobić jakiś dodatkowy reset pamięcie EEPROM bo po normalnym resecie też nie będzie wykonywane POWITANIE

    Pozdrawiam
  • #6 1913703
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    PiotrLotnik napisał:

    ...
    Co do POWERDOWN to w tej wersji programu odpada bo po resecie WATCHDOG program by sie zaczynał od nowa (a na początku mam takie ładne powitanie przygotowane).
    ...

    To bierz manuala w łapki i poczytaj o rejestrze MCUCSR.

    Piotrek
  • #7 1914261
    PiotrLotnik
    Poziom 15  
    Posty: 207
    Pomógł: 2
    Ocena: 2
    ZUMEK możesz napisać na ten temat troche więcej, najlepiej wszystko co wiesz :)

    Przyznaje, żę moja wiedza jest w większości oparta na Helpie z Bescoma a tam mało jest na ten temat.
    Przejrzałem pdf i doczytałem się tyle, że ten rejest jest odpowiedzialny za reset, tylko nie wiem jak to poustawiać żeby działało sensownie i czegoś nie sp...

    Pozdrawiam
  • #8 1914901
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Odczytując zawartość tego rejestru , możesz stwierdzić co było przyczyną restartu procka.Jeśli 3-ci bit jest ustawiony , to oznacza że Watchdog "zrestartnął" proca.Zerujesz ten bit , nie "witasz gośc"i i ... możesz znów proca usypiać.Jeśli jest ustawiony bit nr 0 , to znaczy , że procek ruszył po włączeniu zasilania , więc możesz "powitać szanowne towarzystwo" i ... to wszystko jest przecież jasno opisane w dokumentacji.

    Piotrek
  • REKLAMA
  • #9 2403365
    titp
    Poziom 12  
    Posty: 22
    Ocena: 3
    korzystając z rozpoczetego ważkiego tematu , spytam czy można uśpić mikrokotroler 'powerdown'-em i wybudzić go jednym i tym samym przyciskiem pisząc w bascomie avr ? Za wszelkie informacje , może nawet przykłady serdecznie dziękuję.
  • #10 2403681
    Adas1983
    Poziom 11  
    Posty: 27
    titp napisał:
    korzystając z rozpoczetego ważkiego tematu , spytam czy można uśpić mikrokotroler 'powerdown'-em i wybudzić go jednym i tym samym przyciskiem pisząc w bascomie avr ? Za wszelkie informacje , może nawet przykłady serdecznie dziękuję.

    Tak jak już to wcześniej napisano z trybu POWERDOWN można budzić zewnętrznym przerwaniem a to przerwanie odpowiednio skonfigurowane może pochodzić od przycisku.
    Pozdrawiam.
  • #11 2404968
    titp
    Poziom 12  
    Posty: 22
    Ocena: 3
    Dziekuje za odpowiedź.Problem w tym że obudzić umniem ,tylko że nie zawsze przy uśpieniu 'przycisk wy' on usypia.nieraz Wchodzi w jakiś stan w którym jest jeszcze większy pobór prądu - nie wiem czym to jest spowodowane?,
    $regfile = "m8def.dat"
    $crystal = 1000000

    Dim I As Byte
    Dim E As Byte
    Config Pinb.1 = Output
    Config Pind.2 = Input
    Config Pind.1 = Input
    Set Portd.2
    Set Portd.1
    Wy Alias Pind.1
    Wl Alias Pind.2

    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
    Enable Interrupts
    Enable Int0
    Config Int0 = Low Level


    Do
    Debounce Wy , 0 , Pr1 , Sub
    '- jakiś program z pentlą
    Loop
    End

    Pr1:
    Powerdown
    Return


    - a poza tym nie mam praktycznego pomysłu na jeden przycisk .Np.włączenie urządzenia przyciśnij na dwie sekundy wyłącz przyciśnij na 1 sekundę ten sam przycisk .Za podpowiedzi z góry serdecznie dziękuję.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemów z wybudzaniem mikrokontrolera ATMEGA32 z trybów oszczędzania energii, szczególnie z trybu IDLE i POWERDOWN, przy użyciu wyłącznie timerów (Timer0, Timer1, Timer2) jako źródeł przerwań. W trybie POWERDOWN wybudzenie jest możliwe tylko przez watchdog, zewnętrzny reset lub zewnętrzne przerwanie, co wyklucza timery jako budziki. Zalecane jest stosowanie trybu IDLE, który pozwala na wybudzenie dowolnym przerwaniem, w tym timerem. Problem z zawieszaniem programu podczas wielokrotnego usypiania rozwiązano przez poprawne użycie polecenia return w procedurze obsługi przerwania oraz licznika przerwań. Poruszono także kwestię długotrwałego usypiania (np. 24h) i sugestię wykorzystania pamięci EEPROM do zapamiętania stanu programu po resecie watchdog, aby uniknąć powtarzania powitania. Omówiono rejestr MCUCSR jako narzędzie do rozpoznawania przyczyny resetu (np. reset watchdog). W dalszej części dyskusji pojawiło się pytanie o możliwość usypiania i wybudzania mikrokontrolera jednym przyciskiem w BASCOM AVR, gdzie tryb POWERDOWN można wybudzić zewnętrznym przerwaniem, które może być generowane przez przycisk. Zwrócono uwagę na problemy z nieprawidłowym zachowaniem mikrokontrolera po wybudzeniu przyciskiem, powodującym zwiększony pobór prądu, oraz na potrzebę implementacji debouncingu i rozróżniania długości przyciśnięcia przycisku do sterowania włączaniem i wyłączaniem urządzenia.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA