下面的程序是本人之前在51单片机写过并且调试成功的红外遥控解码程序改编而来,本人用的是AVR的M16单片机,可是调试怎么也不能成功,我使用的是外部中断2,我一步一步的测试,已经可以确定进入了中断,也经过了前导码,但是每次都会在计算高电平时间那里,出现计时过长跳出去的,无论我把延时弄成多长时间,感觉那里一直都是高定平,然后跳出。把计算过长那段程序删除了,但是也是调试不成功。求高手帮帮忙啊
void inter_init()
{
DDRB&=~BIT(2);//设置为带上拉输入
PORTB|=BIT(2);
GICR|=(0<<INT2);//清除中断2使能
MCUCSR|=(0<<ISC2);//中断2为下降沿触发
GIFR|=(1<<INTF2);//写1清除外部中断标志位
GICR|=(1<<INT2);//从新使能,使能外部中断2
SREG|=BIT(7);//开全局中断
}
void delay_ir(uint x)
{ //0.14ms延时8MHZ晶振
uint i;
while(x--)
for (i = 0; i<155; i++);
}
void exter2_IR()
{
uchar IRcode[4];//红外解码数据
uchar j,i,byte;
uint time=0;
DDRB&=~BIT(2);//设置为带上拉输入
PORTB|=BIT(2);
GICR&=~(1<<INT2);//关闭外部中断2
if(PINB&BIT(2))//如果出现高电平,接收出错
{
GICR|=(1<<INT2);//打开中断2
return;
}
while(!(PINB&BIT(2))); //9MS引导码,等待变为高电平
while(PINB&BIT(2)); //4.5ms结果码,等待变为低电平
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
while(!(PINB&BIT(2)));//0.565ms的低电平,等待高电平
while(PINB&BIT(2)) //计算高电平的时间
{
delay_ir(1);
time++;
if(time>=30)//计时过长,自动离开
{
GICR|=(1<<INT2);
return;
}
}
byte>>=1;
if(time>6)
byte=byte|0x80;
else
byte=byte;
time=0;
}
IRcode[j]=byte;
}
GICR|=(1<<INT2);//从新打开外部中断2
}
|