我目前正在开发一个MCU单元,它将响应外部中断以执行特定任务。 我正在使用的控制器:ATmega8A。
外部中断定义如下:
PORTD |= 0x04; //Activate pull up resistor of PD2
GICR |= (1 << INT0); //Enable INT0
MCUCR |= (1<<ISC00); //INT0 is executed on every edge
ISR:
ISR (INT0_vect)
{
/* interrupt code here */
v = 1; //sets interrupt variable v to 1
}
我目前正在测试外部中断的行为。每当检测到外部中断时,应执行特定的代码块。 任何逻辑变化都会将中断应用于INT0。
ISR (INT0_vect)
{
/* interrupt code here */
v = 1; //sets interrupt variable v to 1
}
int main(void)
{
USART_Init();
I2C_init();
//int a; //test variable
PORTD |= 0x04; //Activate pull up resistor of PD2
GICR |= (1 << INT0); //Enable INT0
MCUCR |= (1<<ISC00); //INT0 is executed on every edge
sei();
unsigned char a;
a = USART_Receive();
while(1)
{
//TODO:: Please write your application code
do
{
} while (v == 0); //Wait for interrupt
v = 0;
_delay_ms(10000);
//Communication protocol between MCU unit and GUI software application
//Block 1
USART_Transmit(0xFF); //Header start command
USART_Transmit(0x00);
USART_Transmit(0x08);
USART_Transmit(0x00);
USART_Transmit(0x09);
USART_Transmit(0x02);
USART_Transmit(0x04);
USART_Transmit(0x05);
USART_Transmit(0x06);
USART_Transmit(0x00);
USART_Transmit(0xFE); //Header finish command
do
{
} while (v == 0); //Wait for interrupt
v = 0;
_delay_ms(10000);
//Block 2
USART_Transmit(0xFF); //Header start command
USART_Transmit(0x00);
USART_Transmit(0x01);
USART_Transmit(0x00);
USART_Transmit(0x01);
USART_Transmit(0x01);
USART_Transmit(0x01);
USART_Transmit(0x01);
USART_Transmit(0x01);
USART_Transmit(0x01);
USART_Transmit(0xFE); //Header finish command
}
return 0;
}
测试代码,我可以说中断被识别并且代码正常运行。但是,似乎存在一些小错误或逻辑错误。 当第一个中断发生时(块1之前),应该执行块1。现在,如果发生第二次中断,则应执行第二个块。
我可以在预先编写的GUI应用程序中看到此执行序列,但是,大多数情况下,块1(应用中断时)会多次执行,而不是块2。
它应始终遵循以下顺序:块1而不是块2,依此类推。我认为这是一个时间问题。但是我无法调试这个问题。
我也想知道C中是否有代码告诉程序等待外部中断信号而不是继续程序?
非常感谢您提前。