使用定时器中断闪烁 LED(atmega 128)
blinking an led using timer interrupt (atmega 128)
我试图在不使用延迟功能的情况下使 LED 闪烁。
我遇到了使用定时器中断的情况,我试了一下,它编译得很好。但输出固定在 PORTA = 0x01;所以,我相信 ISR 功能不起作用。代码中有什么我遗漏的吗?谢谢
#include <asf.h>
#include <avr/interrupt.h>
volatile unsigned int count=0;
volatile unsigned int tTime=0;
void port_init(void) {
PORTA = 0xff;
}
ISR(TIMER0_OVF_vect)
{
TCNT0 = 206;
count++;
if (count < 625) {
PORTA=0x01;
}
else if ((count > 625) && (count < 1250)) {
PORTA=0x00;
}
else {
count=0;
}
}
int main (void)
{
board_init();
port_init();
TCCR0 = 0x06; //setting dispensing ratio
TCNT0 = 206; //initial value of register
TIMSK = 0x01; //enabling interrupt
SREG=0x80;
DDRA=0xff;
while(1){
}
}
您的 ISR()
函数存在逻辑错误。一旦 count
命中 625,前两个 if/else-if
子句将是 false
(因为 625 既不小于也不大于 625),因此最后的 else
子句将执行并将 count
重置为零。这样做的结果是设置 PORTA=0x00 的 else-if 子句永远不会执行。
要修复,请将第一个 if
从 <
更改为 <=
,如下所示:
if (count <= 625) {
我试图在不使用延迟功能的情况下使 LED 闪烁。 我遇到了使用定时器中断的情况,我试了一下,它编译得很好。但输出固定在 PORTA = 0x01;所以,我相信 ISR 功能不起作用。代码中有什么我遗漏的吗?谢谢
#include <asf.h>
#include <avr/interrupt.h>
volatile unsigned int count=0;
volatile unsigned int tTime=0;
void port_init(void) {
PORTA = 0xff;
}
ISR(TIMER0_OVF_vect)
{
TCNT0 = 206;
count++;
if (count < 625) {
PORTA=0x01;
}
else if ((count > 625) && (count < 1250)) {
PORTA=0x00;
}
else {
count=0;
}
}
int main (void)
{
board_init();
port_init();
TCCR0 = 0x06; //setting dispensing ratio
TCNT0 = 206; //initial value of register
TIMSK = 0x01; //enabling interrupt
SREG=0x80;
DDRA=0xff;
while(1){
}
}
您的 ISR()
函数存在逻辑错误。一旦 count
命中 625,前两个 if/else-if
子句将是 false
(因为 625 既不小于也不大于 625),因此最后的 else
子句将执行并将 count
重置为零。这样做的结果是设置 PORTA=0x00 的 else-if 子句永远不会执行。
要修复,请将第一个 if
从 <
更改为 <=
,如下所示:
if (count <= 625) {