AVR 上的定时器逻辑
Timer logic on AVR
我试图理解这段代码,但我无法理解的是中断例程如何在 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++;
}
让输出比较中断定期触发的常用方法是向 OCR1A
添加一个常量。这发生在
OCR1A += (TICKS_PER_MSECOND);
出于某种原因,作者添加了一些额外的逻辑来处理坏运气。可能是周期太短,也可能是其他中断导致OC中断延迟运行.
如果这些情况发生,那么下一次 OC 中断不会比上一次发生 TICKS_PER_MSECOND
,而是 TICKS_PER_MSECOND
加上计数器的整个周期。也就是说,将错过正确的时间,因为 OC 寄存器将在数字通过后设置为数字。
此代码试图纠正这种情况。话虽如此,我不确定它是否正常工作。潜在的问题是 nTemp
是无符号的,因此 <
比较可能不会达到作者的预期。
我试图理解这段代码,但我无法理解的是中断例程如何在 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++;
}
让输出比较中断定期触发的常用方法是向 OCR1A
添加一个常量。这发生在
OCR1A += (TICKS_PER_MSECOND);
出于某种原因,作者添加了一些额外的逻辑来处理坏运气。可能是周期太短,也可能是其他中断导致OC中断延迟运行.
如果这些情况发生,那么下一次 OC 中断不会比上一次发生 TICKS_PER_MSECOND
,而是 TICKS_PER_MSECOND
加上计数器的整个周期。也就是说,将错过正确的时间,因为 OC 寄存器将在数字通过后设置为数字。
此代码试图纠正这种情况。话虽如此,我不确定它是否正常工作。潜在的问题是 nTemp
是无符号的,因此 <
比较可能不会达到作者的预期。