簡體   English   中英

atmega328 ctc 模式定時器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM