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

[AVR][C] Przerwania zewnętrzne w AT90S2313

J_D 03 Sty 2009 22:29 1433 2
REKLAMA
  • #1 5945473
    J_D
    Poziom 10  
    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?

    #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
  • REKLAMA
  • #3 5945573
    J_D
    Poziom 10  
    Rzeczywiście. A przed minutą czytałem o deklaracji w przypadku przrwań na forum.
    Wilkie dzięki! Działa :)
REKLAMA