我的问题是这段代码不起作用。ISR正在运作..。我在其他代码中测试了它的闪烁。
但是,要将x++放在ISR中,并在main()函数中读取X,它从不闪烁。。。
我对asm不太熟悉,我认为这是编译器的光学化,所以我把变量设置为易失性,但它不起作用。
#define F_CPU 16000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
volatile static uint8_t x = 1;
ISR( TIMER0_OVF_vect )
{
x++;
reti();
}
int main(void)
{
/* Replace with your application code */
DDRB = DDRB | 0B00100000 ; // pinMode(13,OUTPUT);
TCCR0A = 0;
TCCR0B = (1 << CS00 ) | (1 << CS02 ); //1024 prescaler
TIMSK0 |= 1 << TOIE0 ;
sei();
while (1)
{
if (x >= 61) //never happens ?
{
PORTB ^= 0B00100000;
x=0;
}
}
}发布于 2018-04-05 10:16:32
对于普通的ISR,您的编译器生成一些“样板”代码,例如包括保存和恢复CPU寄存器,并包围您在ISR主体中编写的代码。当你宣布你的ISR“裸体”时,这种情况不会发生。
与您的代码一样,ISR并不是裸露的,这个样板代码是存在的,但是您仍然使用reti(),它会立即离开ISR。因此,您的ISR将执行“序言”部分,而不会执行“结尾”部分,这可能会导致各种问题,例如,干扰注册内容。
顺便说一句,尾声样板中的最后一条指令是reti。只有在你写裸体ISR的时候才使用reti()。
https://stackoverflow.com/questions/49669412
复制相似问题