【问题标题】:atmega328 ctc mode timeratmega328 ctc 模式定时器
【发布时间】:2021-12-15 18:17:05
【问题描述】:

所以我想使用 CTC Modus 在 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。通过设置 BIT 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;
}


  

【问题讨论】:

    标签: c++ c microcontroller


    【解决方案1】:

    您忘记全局启用中断。在 setup() 末尾添加 sei()

    【讨论】:

    • 还是不行;(
    • @stribor - 请不要接受不适合您的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多