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()
所以我想使用 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()