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

Attiny2313 i wybudzanie z power-down poprzez INT1

Miaojao 09 Gru 2010 15:07 2007 7
REKLAMA
  • #1 8846182
    Miaojao
    Poziom 9  
    Witam.


    Mam taki problem. W dokumentacji dokładnie jest napisane że z power down mozna wybudzić poprzez:
    Cytat:
    INT0, INT1 and
    Pin Change

    Przy czym:
    Cytat:
    For INT0, only level interrupt.


    No to sobie skonfigurowałem przerwanie na INT1 które reaguje na jakakolwiek zmianę sygnału. Rejestry mam tak skonfigurowane:
    	GIMSK =0x80;
    	MCUCR =0x34;
    	SREG |=0x80;

    I ku mojemu zdziwieniu po uśpieniu procka to przerwanie nie działa. Nie działa również gdy skonfiguruje je aby reagowało na zbocze. Co ciekawe jak skonfiguruje żeby działało na poziom niski to działa...

    Czy ja cos źle robię czy w dokumentacji jest błąd? Bo napisane jest że INT0 w stanie power-down reaguje tylko na poziom. Ale z tego co zauważyłem to w przypadku INT1 jest podobnie... ale tego nie napisano więc nie wiem.
  • REKLAMA
  • #2 8846575
    ololukiXP
    Poziom 19  
    Cytat:
    Only an
    External Reset, a Watchdog Reset, a Brown-out Reset, USI start condition interrupt, an external
    level interrupt on INT0, or a pin change interrupt can wake up the MCU

    Według dokumentacji wybudzenie mikrokontrolera z trybu power-down możliwe jest jedynie przez przerwanie od niskiego poziomu na INT0, a na jakiekolwiek przerwanie od INT1 procek nie reaguje. Na zmianę stanu na wejściu przerwania procek raczej nie zareaguje, gdyż wymaga to porównania kolejnych "próbek" na tym wejściu, a w trybie power-down generator taktujący nie pracuje.
  • REKLAMA
  • REKLAMA
  • #4 8854777
    asembler
    Poziom 32  
    Może trzeba dać SEI przed uśpieniem procka?
  • Pomocny post
    #5 8855021
    mirekk36
    Poziom 42  
    asembler napisał:
    Może trzeba dać SEI przed uśpieniem procka?


    Przecież włącza SEI tyle że wszystko wg najgorszych praktyk programistycznch.

    SREG |= 0x80;


    ---------------------------------

    W nocie PDF ATtiny2313 wprawdzie napisano w uwadze, że tylko INT0 reaguje na wybudzanie poziomem, ale to słówko tylko (Only) tyczy się poziomu a nie samego przerwania. Powinno być napisane w skrócie może INTx albo wymienione jedno i drugie INT0, INT1 tak jak jest to w notach PDF innych procków AVR (wystarczy zajrzeć do noty ATmega8 i widać że tam już jest mowa o dwóch przerwaniach)

    Reasumując NA PEWNO będzie tak samo się procek wybudzać zarówno przez INT0 oraz INT1 ...... ale T Y L K O poziomem a nie zboczami.

    A przy okazji do autora do włączania wyłączania przerwań używaj jak się należy poleceń:

    sei();
    cli();

    uprzednio inkludując

    #include <avr/interrupts.h>

    zamiast tego bezpośredniego ustawiania bitu w SREG, choć to też zadziała ale wygląda tragicznie jeśli chodzi o czytelność kodu.

    Podobnie ustawianie bitów, warto robić np tak:

    MCUCR |= (1<<ISCxx); jeśli chodzi o ustawianie
    MCUCR &= (1<<ISCxx); zerowanie
  • #6 8855082
    Miaojao
    Poziom 9  
    Ok dziękuję za rady.
    No jest tak jak napisał mirekk36 - wybudzanie INTx działa tylko na poziom niski.

    Jako że chciałem mieć wybudzanie dowolna zmianą to zrobiłem wybudzanie poprzez przerwanie PCINT i zgodnie z dokumentacją działa :)
  • #7 8855120
    ololukiXP
    Poziom 19  
    mirekk36 napisał:
    Podobnie ustawianie bitów, warto robić np tak:

    MCUCR |= (1<<ISCxx); jeśli chodzi o ustawianie
    MCUCR &= (1<<ISCxx); zerowanie


    Przy zerowaniu bitów należy wprowadzić negację bitową (~), w przeciwnym wypadku zerujemy wszystkie bity oprócz podanego
    MCUCR &= ~(1<<ISCxx);
  • REKLAMA
REKLAMA