簡體   English   中英

使用 atmega328p 中的定時器 1 溢出中斷閃爍 LED

[英]blinking a led using timer 1 overflow interrupt in atmega328p

我正在嘗試使用 ISR 使 LED 閃爍 3 秒,這里使用了 atmega328p。 我正在嘗試使用 TIMER1(16 BIT) 在 isr 中創建 1 秒延遲,然后將其循環 3 秒。 LED連接到PD7,我不知道為什么它不閃爍,誰能指出錯誤。 我正在使用simulIDE,這是電路, timer_circuit

#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#define SET_BIT(PORT,BIT) PORT |= (1<<BIT)
#define CLR_BIT(PORT,BIT) PORT &= ~(1<<BIT)
unsigned int count = 0;
void timer()
{
  TCCR1A = 0x00; // Normal mode of operation
  TCNT1 = 0xC2F8; // decimal value is 49912
  TCCR1B |= ((1 << CS10) | (1 << CS12));
  TCCR1B &= ~(1 << CS11); //1024 prescaler

  sei(); // Global interrupt
}

int main(void)
{
    SET_BIT(DDRD,PD7);
    timer();
    while(1)
    {
        TIMSK1 |= TOIE1;
        if(count>=3)
        {
            SET_BIT(PORTD,PD7);
            count=0;
        }
    }
    ;
    return 0;
}
ISR(TIMER1_OVF_vect)
{
  count++;
}

此代碼永遠不會關閉 LED...一旦設置了該位,您的代碼就永遠不會清除它...嘗試切換該位而不是設置它

#define toggle_BIT(PORT,BIT) PORT ^= (1<<BIT) //this will flip the bit
...
if(count>=3)
  {
     toggle_BIT(PORTD,PD7);
     count=0;
     TCNT1 = 0xC2F8; // reset counter
  }

更新

  1. 在 count 變量之前使用volatile訪問修飾符告訴編譯器您將從ISR更改它以確保count變量不會在優化中刪除
  2. 當您設置TCCR1B時,您必須將其他位設置為零才能在正常模式下運行
  3. 重新計算8 MHzTCNT1值,這是內部默認頻率

完整代碼

#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#define toggle_BIT(PORT,BIT) PORT ^= (1<<BIT) //this will flip the bit
#define SET_BIT(PORT,BIT) PORT |= (1<<BIT)
#define CLR_BIT(PORT,BIT) PORT &= ~(1<<BIT)

volatile unsigned int count = 0;

void timer()
{
    TCCR1A = 0x00; // Normal mode of operation
    TCNT1 = 64754; // over flow after 1 sec calculated at 8 MHZ
    TCCR1B = ((1 << CS10) | (1 << CS12)); //1024 prescaler
    TIMSK1 |= 1<<TOIE1; // Enable timer1 overflow interrupt
    sei(); // Global interrupt
}

int main(void)
{
    SET_BIT(DDRD,PD7);
    timer();
    while(1)
    {
        
        if(count>=3)
        {
            toggle_BIT(PORTD,PD7);
            count=0;
        }
    }
    
    return 0;
}
ISR(TIMER1_OVF_vect)
{
    count++;
    TCNT1 = 64754; // reset to over flow after 1 sec calculated at 8 MHZ
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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