Timer AVR上的定时器逻辑

Timer AVR上的定时器逻辑,timer,logic,avr,Timer,Logic,Avr,我正在试图理解这段代码,但我无法理解的是OCR1A更新时中断例程是如何工作的。我正在使用AVR系列控制器来运行这段代码 void TimerInit(void) { DISABLE_TIMER_INT; // Disable timer interrupt m_nGlobalTime = 0; // Reset system time OCR1A += TICKS_PER_MSECOND; // Set first clo

我正在试图理解这段代码,但我无法理解的是OCR1A更新时中断例程是如何工作的。我正在使用AVR系列控制器来运行这段代码

 void TimerInit(void)
    {
        DISABLE_TIMER_INT;  // Disable timer interrupt

        m_nGlobalTime = 0;  // Reset system time

        OCR1A  += TICKS_PER_MSECOND;    // Set first clock period

        TCCR1A  = 0;// Set TimerMode to Normal
        TCCR1B |= (1 << CS10);// ClckIo, no pre-scaler; set TimerMode

        ENABLE_INTERRUPTS;
        ENABLE_TIMER_INT;// Enable send timer interrupt (1 ms)
    }



    ISR( TIMER1_COMPA_vect) {
        uint16_t nTemp; 

        nTemp = TCNT1;  // Get current time
        nTemp -= OCR1A; // Subtract interrupt time

        if (nTemp < (TICKS_PER_MSECOND / 2))// If more than half period left    
        {
            OCR1A += (TICKS_PER_MSECOND);// Add Offset to OCR1A relative
        } 
        else
        {
            OCR1A = TCNT1 + (TICKS_PER_MSECOND);// Set OCR1A to 1 ms absolute
        }

        m_nGlobalTime++;                                                            
    }
void TimerInit(void)
{
禁用计时器\u INT;//禁用计时器中断
m_nGlobalTime=0;//重置系统时间
OCR1A+=TICKS_PER_MSECOND;//设置第一个时钟周期
TCCR1A=0;//将TimerMode设置为正常

TCCR1B |=(1获得定期触发的输出比较中断的通常方法是向
OCR1A
添加一个常量

OCR1A += (TICKS_PER_MSECOND);
出于某种原因,作者添加了一些额外的逻辑来处理厄运。可能是周期太短,或者是OC中断可能由于其他中断运行而延迟

如果发生这些情况,则下一次OC中断不会比上一次延迟
TICKS\u PER\u MSECOND
,而是
TICKS\u PER\u MSECOND
加上整个计数器周期。也就是说,将错过正确的时间,因为OC寄存器将在经过该数字后设置为一个数字


这段代码试图纠正这种情况。也就是说,我不确定它是否正常工作。潜在的问题是
nTemp
是无符号的,所以
我只是把这段代码放在MSP430上,它工作得很好,我能够生成一个等间隔中断。但让我困惑的是设置的绝对计时器间隔ting,间隔将被经过的时间偏移。