Witam.
Dopiero zaczynam programować uC AVR. Zaczynam od ATmega8L, ostatnio mam problem z przerwaniem zewnętrznym INT0, układ wchodzi w stan uśpienia ale nie można go wybudzić. W czasie normalnej pracy przerwanie działa i zmienia licznik. Ogólne prawidłowe działanie programu powinno być takie, że dioda zapala się 10 krotnie po czym uC wchodzi w stan uśpienia. Przerwaniem mamy wybudzić i przywrócić licznik. Poniżej przedstawiam mój kod, nie mogę doszukać się błędu. Prosiłbym po pomoc.
Dopiero zaczynam programować uC AVR. Zaczynam od ATmega8L, ostatnio mam problem z przerwaniem zewnętrznym INT0, układ wchodzi w stan uśpienia ale nie można go wybudzić. W czasie normalnej pracy przerwanie działa i zmienia licznik. Ogólne prawidłowe działanie programu powinno być takie, że dioda zapala się 10 krotnie po czym uC wchodzi w stan uśpienia. Przerwaniem mamy wybudzić i przywrócić licznik. Poniżej przedstawiam mój kod, nie mogę doszukać się błędu. Prosiłbym po pomoc.
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 1000000L
#include <avr/sleep.h>
volatile int8_t licznik = 20;
void spij(){
MCUCR |= (1<<SE) | (1<<SM1);
sleep_mode();
}
ISR(INT0_vect){
MCUCR &= 0b00001111;
licznik=20;
}
ISR(TIMER1_COMPA_vect){
if(licznik>0){
licznik--;
PORTC^=0x01;
} else {
PORTC &= ~_BV(1);
spij();
}
}
ISR(BADISR_vect){}
int main(void)
{
DDRC=0xFF;
PORTC=0;
GICR = _BV(INT0);
MCUCR |= _BV(ISC01);
DDRD &= ~_BV(PD2);
PORTD |= _BV(PD2);
DDRD |= _BV(PD6);
PORTD &= ~_BV(PD6);
PORTC |= _BV(2);
//ustawienia Timera1
OCR1AH = 0xF4;
OCR1AL = 0x24;
TCCR1A = 0;
TCCR1B |= _BV(CS11) | _BV(WGM12);
TIMSK |= _BV(OCIE1A);
sei();
while(1)
{
//TODO:: Please write your application code
}
}
![[AVR] Power-down - problem z wybudzaniem procesora [AVR] Power-down - problem z wybudzaniem procesora](https://obrazki.elektroda.pl/3169323400_1333790390.jpg)