所以基本上我试图设置一个ISR(中断子程序)来简单地打开一个灯,但是ISR似乎没有运行。我看了很多微控制器的数据表,想看看我是否做错了什么,但我什么也找不到。
这是我的密码。
#include <asf.h>
int main (void) {
DDRD = 0b10000000;
cli(); // turn off global interrupts
//Timer
TCCR2A |=_BV(WGM21); //CTC mode
TCCR2B |=_BV(CS22)|_BV(CS21); //clk pre-scale 1/256
OCR2A = 0x7d; //125clk cycles = 2ms
TIMSK2 |=_BV(OCIE2A); //enable interrupt on compare matchA
TIFR2 |= _BV(OCF2A); //clear flag
TCNT2 = 0x00; // reset counter
sei(); // enable global interrupts
}
ISR(TIMER2_COMPA_vect) {
PORTD = 0b10000000;
}
最佳答案
在main()函数的末尾应该有一个无止境的循环:
#include <asf.h>
int main (void) {
DDRD = 0b10000000;
cli(); // turn off global interrupts
//Timer
TCCR2A |=_BV(WGM21); //CTC mode
TCCR2B |=_BV(CS22)|_BV(CS21); //clk pre-scale 1/256
OCR2A = 0x7d; //125clk cycles = 2ms
TIMSK2 |=_BV(OCIE2A); //enable interrupt on compare matchA
TIFR2 |= _BV(OCF2A); //clear flag
TCNT2 = 0x00; // reset counter
sei(); // enable global interrupts
while(1);
}
ISR(TIMER2_COMPA_vect) {
PORTD = 0b10000000;
}
没有无休止的循环,你的AVR达到一个未定义的状态!
关于c - 计时器比较匹配的ISR未运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38317349/