2015-11-05 44 views
0

我的Atmega328p有中斷問題。我使用Arduino Nano 16 Mhz 5V,所以它不應該是一個硬件問題。 這是我的代碼:Atmega328p定時器錯誤配置

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

volatile uint16_t counter; 

int main(void) 
{ 
    DDRB |= (1<<PB5); 

    TCCR1B |= (1 << CS10);   // set prescaler to 1 
    TIMSK1 |= (1 << TOIE1);   // set overflow interrupt 
    sei();       // enable interrupts 


    while (1) 
    { 
     // Main loop 
    } 
} 

ISR (TIMER1_OVF_vect) 
{ 
    counter++; 
    if (counter > 200) 
    { 
     counter = 0; 
     PORTB ^= _BV(PB5); 
    } 
} 

我想有intterupt儘可能多,但這種配置二極管閃爍每1秒 - 這是太慢了,我需要至少每10微秒或更少,如果有可能。它可以是任何其他計時器,我不在乎。

回答

0

定時器1是一個16位定時器,這意味着在正常模式下它會以大約244Hz的速率溢出。再加上你每翻轉一次201就會翻轉LED的狀態,你會得到0.6Hz的閃爍頻率。如果要以100kHz的速率閃爍,則需要用79的TOP切換到CTC/OCRA模式(模式4),然後使用輸出比較中斷。或者你也可以使用模式14或15,並將TOP設置爲159,將OC寄存器設置爲合適的值,而不必擔心中斷。

+0

你能告訴我適當的代碼嗎?我是新手,我不明白一切。如果你爲我寫代碼,我會用數據表檢查它,看看是什麼。我寫這個代碼:http://pastebin.com/sR8CrZfk並且每變化一次400us就會變化狀態,但我不知道如何將它變成中斷((TCNT0> = 100)只是爲了減慢它的速度,因爲我已經老了示波器) – Archont

0

你更好的使用定時器的CTC模式,對於設置OCR註冊爲某個值,讓您的中斷在10微秒,並從溢變化interruot牛逼行吟詩人比較中斷,這樣的事情:

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

volatile uint16_t counter; 

int main(void) 
{ 
    DDRB |= (1<<PB5); 
    OCR1A = 80-1; // at 16MHz you need 160 cycles to reach 10us pulse... 
    TCCR1A = 0; // no output compare and WGM1 to 00 
    TCCR1B |= (1 << WGM12)|(1 << CS10); // set prescaler to 1 and CTC mode 
    TIMSK1 |= (1 << OCIE1A);   // set compare A interrupt 
    sei();       // enable interrupts 


    while (1) 
    { 
     // Main loop 
    } 
} 

ISR (TIMER1_COMPA_vect) // check this too 
{ // what was the counter stuff for? it only made things slower... 
    PORTB ^= _BV(PB5); 
    // keep the ISR as quick as posible, it takes about 1us gettin' in & out 
} 

我只想OCRA應該是80,還是我記得,應該是79 ...

+0

由於它在中斷時切換*,所以需要將比較值減半(因爲您正在計算半個週期)。 –

+0

感謝ignacio,我在OCR 160秒做了20us脈衝 – Ryu