ATmega32u4 Timer 3 переполнение не работает - PullRequest
0 голосов
/ 15 марта 2019

Я столкнулся с проблемой использования ATmega32u4, где я успешно могу использовать переполнения таймера 1, но когда я пытаюсь переназначить код для таймера 3, он не работает.

Следующий код включает и выключает светодиод (на выводе b7) при переполнении таймера 1 (16 бит).Это работает.

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

int main (void) { 

    DDRB |= (1<<7);; //PortB Output 
    PORTB = 0x00; //PortB All LEDs off

    TCCR1B |= (1<<CS10) | (1<<CS12); //Set Prescaler to 1024

    TIMSK1 |= (1<<TOIE1); //Enable Timer Overflowinterrupt 
    sei(); //Enable Interrupts 

    while(1); 

    return 0; 
} 

ISR(TIMER1_OVF_vect) 
{ 

    PORTB ^= (1<<7); //toggle LED

}

Этот следующий код предназначен для выполнения тех же функций с использованием таймера 3, но не работает.

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

int main (void) { 

    DDRB |= (1<<7);; //PortB Output 
    PORTB = 0x00; 

    TCCR3B |= (1<<CS30) | (1<<CS32); //Set prescaler to 1024

    TIMSK3 |= (1<<TOIE3); //Enable Timer Overflowinterrupt 
    sei(); //Enable Interrupts 

    while(1); 

    return 0; 
} 

ISR(TIMER3_OVF_vect) 
{ 

    PORTB ^= (1<<7);

}

Этот последний кодовый блок был использован для проверки того, чтоЗначение счетчика таймера 3 увеличивалось (без прерываний), что и есть.(Я использую другой светодиод в этом тесте)

#include <avr/io.h>

int main()
{

    // Prescaler of 1024
    TCCR3B |= (1<<CS32)|(1<<CS30);

    // Initialize Counter
    TCNT3 = 0;

    // Initialize LED
    DDRE |= (1 << 6); // LED0

    // Infinite Loop
    while (1)
    {
        // Flash every 0.016 secs
        // COUNTER = 0.016 / (PRE SCALER / CPU FREQ)
        // 250
        if( TCNT3 >= 250 )
        {
            // Toggle LED
            PORTE ^= (1 << 6); // If output use PORT, If input use PIN

            TCNT3 = 0;
        }
    }
    return 0;
}

Исходя из этого, я предполагаю, что я делаю что-то не так при вызове прерывания, я просто не уверен, что

1 Ответ

0 голосов
/ 15 марта 2019

Я не уверен, используете ли вы LilyPad или Leonardo.

Я предполагаю из кода выше, что это LilyPad. Измените TCCR3B на 256 и посмотрите, исправит ли это проблему для вас.

       TCCR3B = 0x0C; // prescaler = 256
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...