我正在使用一本名为“制造:AVR编程”的书来学习AVR编程。我试图了解Timer外围设备。接下来的程序要做的是使用中断以一定间隔切换引脚
#include <avr/io.h>
#include <avr/interrupt.h>
// initialize timer, interrupt and variable
void timer1_init()
{
// set up timer with prescaler = 64 and CTC mode
TCCR1B |= (1 << WGM12)|(1 << CS11)|(1 << CS10);
TIMSK1 |= (1 << OCIE1B); // Output Compare B Match Interrupt Enable
// initialize counter
TCNT1 = 0;
// initialize compare value
OCR1B = 7812;
sei();
}
ISR(TIMER1_COMPB_vect) {
PORTC ^= (1 << 0);
}
int main(void)
{
// connect led to pin PC0
DDRC = 0XFF;
// initialize timer
timer1_init();
// loop forever
while(1)
{
}
}
但这不是在拨动销,为什么?
答案 0 :(得分:1)
您使用哪个微控制器?
我可以发现的一个问题是OCR1A
缺少初始化计数器的初始化值,该初始化值设置了计数器的顶部,因此您的计数器永远不会计数到比较值,因为默认情况下OCR1A
为零。 >
所以也许您应该写OCR1A
而不是OCR1B
。
一个提示:
较新的avr内核通过简单地写到引脚寄存器来支持引脚切换(请参见数据手册的I / O端口部分)。这样可以节省一些读取和xor
的周期。因此PORTC ^= (1 << 0);
等同于PINC = (1<<0);