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

[ATtiny13][c] int0 - problem w obsługą przerwania

J_D 07 Lis 2010 19:31 1213 4
  • #1 8715036
    J_D
    Poziom 10  
    Witam,
    najprawdopodobniej za długo siedzę nad blachym tematem i niedowidzę problemu.
    Nie wiem dlaczego program w pętli głównej nie wchodzi do warunku if (RC5_detected == 1) po obsłużeniu przerwanie zewnętrzengo. Przerwanie jest wykonywane poprawnie więc RC5_detected jest napewno ustawiane.

    Moją ideą jest ustawienie zmiennej w przerwaniu i późniejsze działanie w pętli głównej programu.

    Oto mój kawałek kodu, co robię nie tak?
    #include <avr/io.h>               
    #include <avr/interrupt.h>        
    #include <util/delay.h>
    
    #define		Yellow_ON	PORTB &= ~(1<<PB3);   	// bit na 0	- PB0
    #define		Yellow_OFF	PORTB |= (1<<PB3);   	// bit na 1
    
    unsigned char  RC5_detected;
    
    int main(void)
    {
    													
    GIMSK	|= (1<<INT0);		// External Interrupt Request
    MCUCR 	|= (1 << ISC01);	// The falling edge of INT0 generates an interrupt request.
    
    DDRB 	= (1<<DDB0) | (1<< DDB2) | (1<<DDB3);		// Logical one = output, PB1 - input
    PORTB 	= (1<<PB0) | (1<<PB2) | (1<<PB3);							// PB3 set high (LED OFF)
    sei ();
    
    while (1)
    {
    	if (RC5_detected == 1) 
    	{
    		Yellow_ON;
    		RC5_detected = 0;
    	}
    
    }// end while
    return 0;
    }// end main
    
    /********************************************************************************************
    								External Interrupt INT0 handling
    PIN status change
    *********************************************************************************************/
    
    ISR (SIG_INTERRUPT0)
    
    {
    	RC5_detected = 1;
    	PORTB ^= (1<<PB0);
    }
    
  • #5 8715108
    J_D
    Poziom 10  
    O rany. Zupelnie mnie przyćmiło. Oczywiście volatile musi być!
    Dzięki za przypomnienie.
REKLAMA