atmega328 ctc模式定时器

atmega328 ctc mode timer

所以我想使用 CTC 模式在 atmega328p µC 上制作一个定时器。这个想法是,当中断函数被调用时,每 10 毫秒,在该函数中我应该将变量 millisekunden 增加 10。一旦它达到 1000,它应该被打印出来。 可以在此处找到数据表:https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf 使用寄存器,我可以将模式更改为 CTC 模式,并在定时器上设置正确的预分频器。 它是 16Mhz CPU。所以公式是:T_clock * Prescaler * OCR0A = time(单位是秒) 所以我计算了:(1/ 1610^6) * 1024 * x = 1010^-3(我想要 10 毫秒)。 那么 x 就是 155。 使用 CS00 和 CS02 位,我将预分频器设置为 1024。然后按照公式所述将 OCR0A 设置为 155。通过设置位 WGM01 启用 CTC 模式。最后一件事是我在中断函数中增加了变量 millisekunden。由于某种原因,它不想工作。谁能帮帮我?

   #include "Arduino.h"

volatile unsigned long int millisekunden;
unsigned long int last_msg;
char buffer[128];

void setup() {

  TCCR0A |= (1 << WGM01);                // CTC Modus
  TCCR0B |= (1 << CS02) | (1 << CS00);  // Prescaler 1024
  
  OCR0A = 155;

  // Compare Interrupt
  TIMSK0 |= (1 << OCIE0A);

  Serial.begin(9600);
}

void loop() {
  if (millisekunden - last_msg >= 1000) {
    sprintf(buffer, "t=[%lu]", millisekunden);

    Serial.println(buffer);
    last_msg = millisekunden;
  }


}

// Timer-Interrupt-Routine
ISR(TIMER0_COMPA_vect) {
  millisekunden = millisekunden + 10;
}


  

您忘记全局启用中断。在 setup()

末尾添加 sei()