【发布时间】: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