Poddałem się. Czy ktoś mi pomoże znależc przyczynę dlaczego w pętli while(1) warunek if(interrupt_counter > 0) jest negatywny i stan na PORTB nie zostanie zmieniony?
Jeśli PORTB^=0xF0 umieszczę bezpośrednio w obsłudze przerwania to wszystko działa.
Do INT0 (PD2) jest podłączony switch ściągający do GND. Oczekuję obsługi przerwania po jego naciśnięciu.
Gdzie robię błąd?
Pozdrawiam
J_D
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned char interrupt_counter = 0;
SIGNAL (SIG_INTERRUPT0)
{
interrupt_counter++;
}
int main ()
{
DDRB = 0xFF; //PORTB - output
DDRD = 0x00; //PORTD - input
PORTD = 0xFF; //Pullup - default "1"
PORTB = 0xFF; //LEDS OFF
GIMSK = 0x40; // General Interrupt Mask Register Bit 7 and 6 resposible for INT1 and INT0 request
// 0100 0000 -> 0x40 - means INT0 enable
MCUCR = 0x0E; // MCU control Register - configuration of external interrupts
// 0000 1110 - Bit 0 i 1 =0b10 -> falling edge, Bit 2 and 3 = 0b11 -> rasing edge
sei ();
while (1)
{
if(interrupt_counter > 0)
{
PORTB^=0xF0; // INT0 handling - Change PORTB status
interrupt_counter = 0;
}
else PORTB^=0x0F;
_delay_ms(300);
}
}
Jeśli PORTB^=0xF0 umieszczę bezpośrednio w obsłudze przerwania to wszystko działa.
Do INT0 (PD2) jest podłączony switch ściągający do GND. Oczekuję obsługi przerwania po jego naciśnięciu.
Gdzie robię błąd?
Pozdrawiam
J_D