我在使用ATmega32u4时遇到了问题,在这里我可以成功使用定时器1溢出,但是当我尝试将代码重新用于定时器3时,它不起作用。
以下代码在定时器1(16位)溢出时打开和关闭LED(在b7引脚上)。可以。
#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的计数值是否正在增加(不涉及中断)。 (我在此测试中使用了其他LED)
#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;
}
据此,我假设我在调用中断时做错了什么,我不确定是什么
答案 0 :(得分:0)
我不确定您是使用LilyPad还是Leonardo。
我从上面的代码中假设它是LilyPad。将TCCR3B更改为256,然后查看它是否可以为您解决问题。
TCCR3B = 0x0C; // prescaler = 256