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

[ATmega16][C] - Usypianie/wybudzanie mikrokontrolera, tryb Power Save

maciek_w11 23 Paź 2015 22:23 1023 5
REKLAMA
  • #1 15091431
    maciek_w11
    Poziom 9  
    Witam
    Po kilkugodzinnym programowaniu połączonym ze studiowaniem dokumentacji atmegi w końcu udało mi się wybudzić ją z trybu uśpienia. Zaraz po tym napisałem program, który ma za pomocą jednego przycisku podpiętego do INT2 usypia i budzi procka. Przycisk łączy pin INT2 z masą a między pinem INT2 a masą znajduje się kondensator 100nF w celu eliminacji drgań styków.

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


    Usypianie działa, wybudzić się nie chce. Jeśli w przerwaniu zostawię samo sleep_disable(); procek się budzi. Wygląda to tak, jakby zmienna power cały czas miała wartość 1. Specjalnie pozbyłem się całej reszty kodu i odłączyłem od procka wszystko poza elementami potrzebnymi do funkcjonowania procka i przyciskiem do obsługi przerwania, żeby wyeliminować możliwe powody. Analizowałem kod sporo czasu i nie mam pojęcia skąd bierze się taka reakcja procka.

    Byłbym bardzo wdzięczny za wszelkie wskazówki, z góry dzięki za pomoc.

    BTW, w dokumentacji wykres wskazuje, że w tym trybie procek powinien pobierać ok 13uA. Mi pobiera ok 2,2mA. To kwestia tego, że muszę wyłączyć ręcznie jakieś układy, czy coś jest nie tak?
  • REKLAMA
  • #2 15091512
    excray
    Poziom 41  
    Dopisz "volatile" przy deklaracji zmiennej.
  • REKLAMA
  • REKLAMA
  • #4 15091602
    maciek_w11
    Poziom 9  
    @excray
    Nic to nie zmienia.

    Swoją drogą, gdy nadam zmiennej power wartość 0 i uśpię procka zaraz po funkcji sei() to procek po wciśnięciu przycisku budzi się, po ponownym wciśnięciu się usypia a dalej nie reaguje. Tak jakby tylko w przypadku usypiania w przerwaniu zmienna power nie zmieniała wartości.
  • REKLAMA
  • Pomocny post
    #5 15091637
    excray
    Poziom 41  
    Uśpiłeś procesor w przerwaniu. W przerwaniu jak wiadomo są blokowane przerwania więc kolejne przerwanie wybudzające już nie wystąpi. Stąd Twój problem. sleep_cpu nie może znajdować się w obsłudze przerwania.
  • #6 15093472
    maciek_w11
    Poziom 9  
    @excray
    No rzeczywiście, nie wpadłem na to. Działa, dzięki wielkie.
REKLAMA