2015-05-13 29 views
0
#define F_CPU 8000000UL 
#include <avr/io.h> 

/* 
* main -- Main program 
*/ 
int main(void) 
{ 
    /* Set OC1A pin to be an output */ 
    DDRD|=(1<<5); 

    /* Set output compare register value */ 
    OCR1A = 4000; 


    /* Set timer counter control registers A and B so that 
    * - mode is - clear counter on compare match 
    * - output compare match action is to toggle pin OC1A 
    * - correct clock prescale value is chosen. 
    * TCCR1C can just stay as default value (0). 
    */ 

    TCCR1A |=(1<<COM0A0) | (1<<WGM12); 
    TCCR1B |= (0<<CS12) | (1<<CS11) | (1<<CS10) | (1<<WGM12) | (1<<WGM12); 

    while(1){ 

    } 
} 

我有一個led的鏈接到OC1A端口,但它永遠不會閃爍,一些幫助將不勝感激。avr-c atmega324a定時器

我已經搜索了數據表,不理解爲了製作LED閃光燈還必須做些什麼,我相信對於任何具有c知識的人來說這將是簡單的。

+0

你完全沒有邏輯,我可以看到實際使LED閃爍(打開和關閉等)。首先讓玩家在使用定時器之前點亮LED。 – rost0031

+0

@ rost0031他試圖使用硬件定時器使LED閃爍。 – duskwuff

+0

好的,我現在看到了。 OP,你確定LED不閃爍太快,你看不到它?嘗試關閉計時器並通過手動切換輸出來查看LED是否點亮。 – rost0031

回答

0

首先,當設置像TCCR1A這樣的寄存器時,您只需簡單地指定想要放入的寄存器的值,而不是將要設置的位與已經存在的位進行分配,因爲您會得到不想要的混合舊的&新的。

然後嘗試改變這一點:

TCCR1A = (1 << COM1A0); //COM1A0 in stead of COM0A0, and WGM12 is not part of TCCR1A 
TCCR1B = (1 << CS11) | (1 << CS10) | (1 << WGM12); //No need to write (0 << x) for bits you don't want set, WGM12 is part of TCCR1B 

如果指示燈閃爍過快,增加OCR1A和/或改變預分頻器(CS 10,11和12)