为什么 arduino init() 会中断计时器?

Why does arduino init() break timers?

此程序每 50 000 个时钟周期切换一次 PB7 引脚(带有 ATMega2560 的 Arduino 上的引脚 13)上的 LED。它不使用任何中断。

这在定义为 int main() 时有效,但定义为 void setup() 时 TCNT1 似乎随机上下弹跳而从未达到阈值。如果我们使用例如,这不会改变计时器 4 而不是计时器 1。

int main() {
  // Set pin PB7 to output
  // equivalent to pinMode(LED_BUILTIN,OUTPUT);
  DDRB |= 1 << 7;
  
  // Timer/Counter Control Register for timer 1: set Clock Source to clk/1 no prescaling
  TCCR4B |= (1 << CS10);

  for (;;)
  {
    // TODO if the counter/timer has reached the threshold
    if(TCNT4 >= 50000) {
      // Toggle PB7: if it was high, make it low, and if it was low, make it high
      PORTB ^= (1 << 7); 
      // TODO reset timer
      TCNT4 = 0;
    }
  }
}

如何使用 Arduino 执行此操作?

As seen in Arduino init.c,所有定时器都设置为 8 位 PWM,因此 TCNT1 永远不会超过 255。

如需修复,请致电cbi(TCCR4A, WGM40); 对于定时器 4,请注意这可能会破坏该定时器的 PWM。