Has*_*tar 1 c microcontroller avr isr atmelstudio
我有这个代码不起作用的问题.. ISR正在工作..我在其他代码中测试了它的闪烁..
但是要将x ++放在ISR中并在main()函数中读取X,它永远不会闪烁...
我不熟悉asm我认为这是编译器optomization所以我把变量挥发,但它没有工作..
#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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
对于正常的ISR,编译器会生成一些"样板"代码,例如包括保存和恢复CPU寄存器以及围绕您自己在ISR主体中编写的代码.当您声明ISR"裸露"时,不会发生这种情况.
在你的代码中,ISR并不是赤裸裸的,这个样板代码存在,但你仍然使用reti()
,它会立即离开ISR.因此,您的ISR将执行"序言"部分,但绝不会是"结尾"部分,这可能会导致各种问题,例如弄乱寄存器内容.
顺便说一句,结尾样板文件中的最后一条指令是reti
反正的.只有reti()
在你写过赤裸的ISR 时才使用.