【问题标题】:Atmega328p timer wrong configurationAtmega328p定时器配置错误
【发布时间】:2015-11-05 19:03:02
【问题描述】:

我的 Atmega328p 出现中断问题。我使用的是 Arduino Nano 16 Mhz 5V,所以应该不是硬件问题。 这是我的代码:

#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint16_t counter;

int main(void)
{
    DDRB |= (1<<PB5);

    TCCR1B |= (1 << CS10);          // set prescaler to 1
    TIMSK1 |= (1 << TOIE1);         // set overflow interrupt
    sei();                          // enable interrupts


    while (1)
    {
        // Main loop
    }
}

ISR (TIMER1_OVF_vect)
{
    counter++;
    if (counter > 200)
    {
        counter = 0;
        PORTB ^= _BV(PB5);
    }
}

我想尽可能频繁地中断,但是在这种配置下,二极管每 1 秒闪烁一次 - 这太慢了,如果可能的话,我至少需要每 10us 或更短的时间。它可以是任何其他定时器,我不在乎。

【问题讨论】:

    标签: arduino microcontroller avr


    【解决方案1】:

    定时器 1 是一个 16 位定时器,这意味着在正常模式下它以大约 244Hz 的速率溢出。再加上您仅在每 201 次溢出时翻转 LED 状态并获得 0.6Hz 的闪烁率。如果您想以 100kHz 的速率闪烁,则需要切换到 TOP 为 79 的 CTC/OCRA 模式(模式 4),并改用输出比较中断。或者您可以使用模式 14 或 15 代替,并将 TOP 设置为 159 并将 OC 寄存器设置为适当的值,而完全不必担心中断。

    【讨论】:

    • 你能告诉我正确的代码吗?我是新手,我什么都不懂。如果你为我写代码,我会用数据表检查它,看看是什么。我写了这段代码:pastebin.com/sR8CrZfk 和 led 每隔约 400us 改变一次状态,但我不知道如何把它变成中断((TCNT0 >= 100) 只是为了减慢它,因为我有旧示波器)
    【解决方案2】:

    您最好使用定时器的 CTC 模式,因为它将 OCR 寄存器设置为某个值,使您的中断在 10us 并且从溢出中断更改为比较中断,如下所示:

    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    volatile uint16_t counter;
    
    int main(void)
    {
        DDRB |= (1<<PB5);
        OCR1A = 80-1; // at 16MHz you need 160 cycles to reach 10us pulse...
        TCCR1A = 0; // no output compare and WGM1 to 00
        TCCR1B |= (1 << WGM12)|(1 << CS10); // set prescaler to 1 and CTC mode
        TIMSK1 |= (1 << OCIE1A);         // set compare A interrupt
        sei();                          // enable interrupts
    
    
        while (1)
        {
            // Main loop
        }
    }
    
    ISR (TIMER1_COMPA_vect) // check this too
    { // what was the counter stuff for? it only made things slower...
        PORTB ^= _BV(PB5);
      // keep the ISR as quick as posible, it takes about 1us gettin' in & out
    }
    

    我只是想 OCRA 是否应该是 80,或者我记得应该是 79...

    【讨论】:

    • 由于它在中断时切换,因此您需要将比较值减半(因为您计算的是周期的一半)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2021-01-20
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多