Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[atmega8][c] Przechodzenie i wybudzanie z power-down.

27 Cze 2011 10:06 2253 8
  • Poziom 14  
    Witam.

    Projekt, który realizuje wymaga minimalizacji poboru energii. Stąd tez chcę usypiać procek i w razie potrzeby budzić zewnętrznym przerwaniem INT1.

    Układ się usypia, po wybudzeniu (przerwanie stanem niskim) wykonuje raz pętlę while(1), a następnie łapie zwiechę. jakby było ciągle wyowływane przerwanie. Próbowałem, bezskutecznie, ręcznie ustawiać wszystkie rejestry. Jedynie program w obecnej postaci prowadzi do przejścia w power-down.

    Kod: c
    Zaloguj się, aby zobaczyć kod
    [3.12.2020, webinar] Zagadnienia pomiarowe w nowoczesnej inżynierii materiałowej. Zarejestruj się
  • Poziom 14  
    na INT1 jest przycisk, podciągnięty do Vcc. Nie mogę dać wyzwalania zboczem, bo nota wyraźnie mówi, że można wybudzić jedynie stanem.

    Właśnie wygląda to tak, jakbo po wybudzeniu ciągle wywoływał przerwanie. Gdy usunę z maina cli();, w ogóle nie wykonuje się procedura w while'u. Podejrzewam, że zawisa w przerwaniu. Zablokowanie przerwań pozwala ją wykonać, lecz po zapętleniu i odblokowaniu przerwań, program się zawiesza. Próbowałem, po każdym wybudzeniu przywracać początkowy stan rejestru MCUCR, lecz nic to nie dało...
  • Moderator Mikrokontrolery Projektowanie
    Czego oczekujesz - wróżenia z fusów?
    1. Pokaż cały program, a nie tylko jego wyrywki, bo problem może leżeć nie w wybudzaniu tylko w zupełnie innym miejscu.
    2. pokaż schemat.
  • Poziom 40  
    Cały program może coś da. Powinieneś poza tym w obsłudze przerwania kasować flagę przerwania oraz wyłączać przerwania a nie robić to w programie. Tak jak masz teraz to wydaje mi się że po obsłudze przerwania wyzwalane jest kolejne przerwanie i zanim wykona się kolejna operacja po wybudzeniu procesora znów wykonywana jest instrukcje obsługująca przerwanie i tak w kółko.
  • Moderator Mikrokontrolery Projektowanie
    korrus666 napisał:
    Powinieneś poza tym w obsłudze przerwania kasować flagę przerwania ...

    Nie, ponieważ kasowana jest automatycznie:

    Datasheet napisał:
    When an event on the INT1 pin triggers an interrupt request, INTF1 becomes set (one). If the Ibit in SREG and the INT1 bit in GICR are set (one), the MCU will jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed.

    Tak jak piszesz, jest na przykład w PIC-ach gdzie flagi trzeba kasować programowo. Być może w Atmel-ach też gdzieś tak jest, ale nie w tym przypadku.

    korrus666 napisał:
    Powinieneś poza tym w obsłudze przerwania ... wyłączać przerwania a nie robić to w programie.

    W momencie wejścia w przerwanie przy takiej deklaracji ISR() przerwania blokowane są automatycznie, przed wejściem do funkcji przerwania i zezwalane po jego zakończeniu.

    Więc przy takim kodzie :

    Kod: c
    Zaloguj się, aby zobaczyć kod

    ... w czasie snu, gdy przyjdzie przerwanie na pin INT1, procesor natychmiast wchodzi w funkcję obsługi przerwania automatycznie blokując globalną flagę przerwań do czasu zakończenia funkcji przerwania, gdzie na końcu zezwala na przerwania, a następną instrukcją jest zablokowanie przerwań cli().

    Osobiście nie blokowałbym wszystkich przerwań (bo mogą być wykorzystywane przez inne części programu), a jedynie blokowałbym INT1, zaraz po wyjściu z uśpienia, czyli w funkcji obsługi przerwania.

    Jednak nadal sądzę, że problem problem leży w części kodu której nie pokazałeś i/lub w schemacie.
  • Poziom 14  
    Już śpieszę z wyjaśnieniami.

    Wróżenia z fusów nie oczekuję, lecz w pełni zadowoliłby mnie fragment działającego kodu do usypiania i budzenia atmegi.

    Schematu niestety nie ma. Puki co, układ jest zmontowany na połączeniu pająka z płytkami uniwersalnymi.

    Nie mam niestety nawyku pisania komentarzy. Może to nieco utrudniać interpretację. Oto cały kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Moderator Mikrokontrolery Projektowanie
    Weź pod uwagę, że w trakcie wchodzenia w usypianie wykonywana jest jeszcze kolejna instrukcja, w twoim przypadku cli(). Jak się domyślasz cli w połączeniu z sleep tworzy śmiertelną pułapkę z której procesor może wybudzić tylko reset.
    Swoją drogą, piszesz o oszczędności energii, a używasz staruszka procesora, który bierze energii kilka razy więcej niż nowsze AVR. Zainteresuj się czymś z serii picoPower.
  • Poziom 14  
    W zasadzie to nie wiem dlaczego m8... może dlatego, że mam zapasy, z czasów gdy kosztowały jeszcze po 5zł.

    Jednak zrezygnowałem z usypiania. Zauważyłem, że po wyrzuceniu z maina wywołania TWI i wstawieniu funkcji, wykazującej oznaki życia, wszystko ładnie działało. TWI pierdzieliło sprawę. Dlatego obszedłem ten problem dając mosfeta na zasilanie i procek wraz ze sterowanymi urządzeniami włączany jest tylko na czas pracy. Może nieeleganckie rozwiązanie, ale działa:)

    Dzięki za rady.

    Pozdrawiam.