[英]atmega328 ctc mode timer
所以我想使用 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/ 16 10^6)* 1024 * x = 10 10^-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;
}
您忘記全局啟用中斷。 在 setup() 末尾添加 sei()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.