AVR CTC模式:输出比较B匹配中断不起作用

时间:2018-11-24 16:54:46

标签: timer avr

我正在使用一本名为“制造: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)
    {

    }
}

但这不是在拨动销,为什么?

1 个答案:

答案 0 :(得分:1)

您使用哪个微控制器?

我可以发现的一个问题是OCR1A缺少初始化计数器的初始化值,该初始化值设置了计数器的顶部,因此您的计数器永远不会计数到比较值,因为默认情况下OCR1A为零。 >

所以也许您应该写OCR1A而不是OCR1B

一个提示:
较新的avr内核通过简单地写到引脚寄存器来支持引脚切换(请参见数据手册的I / O端口部分)。这样可以节省一些读取和xor的周期。因此PORTC ^= (1 << 0);等同于PINC = (1<<0);