马老师,请问我的程序为什么总是运行不到其中的一个地方?
马老师你好!看书看了一段时间,之前都是按照书上的例子做实验,现在想自己写个程序看看,于是我想做红外解码的实验。我的思路是用外部中断的电平变化模式,结合T/C1计算电平时间的长短进行解码.实验还没有成功,实验结果总是显示误码。然后我把驱动喇叭响的语句放到程序不同的地方,用来检测程序能否运行到这些地方,结果发现读按键码的地方总是到不了,能帮我看看问题出在哪里吗?即是这里:
if((buf&buf)==0X00) && ((buf|buf)==0xff) ) //原码反码判断数据是否有错
{
DDRA|=0X04;
PORTA&=0XFB; //喇叭响,表示程序能运行到这里(在测试时用,测试完删除) ////函数功能:红外接收
////硬件连接:红外接收的IRDAT与INT1连,PC口语LED连接,PA2与喇叭链接,(k20按键)也与INT1连
////实验现象:开始灯全亮,如果能进入红外接收中断喇叭响,根据按键的不同用LED显示键码。如按K20能进入中断证明红外接收有问题
////内部时钟:4MHZ
////头文件
#include <avr/interrupt.h>
#include <avr/io.h>
static unsigned char state=0,first_in=1,stemp=0,bit=0,byte=0,press_key_0k,buf;
static unsigned int time1,time2;
//****************************红外接收中断服务函数********************************
SIGNAL (INT1_vect) //当INT出现下降沿跳变是,进入中断
{
cli();
switch (state)
{
case 0: //引导码判断 9MS=36000个计数周期
if (first_in==1) //当第一次进入中断时
{
TCCR1A&=0XFC; //T/C1普通模式,无分频
TCCR1B&=0XE1;
TCCR1B|=0X01;
time1=TCNT1;
first_in=2;
}
else //第二次进入中断
{
time2=TCNT1;
if ( ((time2-time1)<30000) | ((65535-time1+time2)<30000) ) //抗干扰
{
state=0;
}
else
{
state=1;
}
first_in=1;
}
break;
case 1: //time2-time=4.5ms间隔时间等待后,之后读数据,到case2
time1=TCNT1; //但time2-time1=2.25ms,为按键还没放开,不读数据,到case0
if ( ((time1-time2)<13500) | ((65535-time2+time1)<13500) ) //取3.375MS做判断,为13500个计数周期
{
state=2;
press_key_0k=0;
}
else
{
state=2;
press_key_0k=1;
}
break;
case 2: //0.56ms低电平等待后
if (press_key_0k) state=0;
else
{
time1=TCNT1;
state=3;
}
break;
case 3: //0或1的判断
time2=TCNT1;
if ( ((time2-time1)>4480) | ((65535-time1+time2)>4480) ) //时间较长者为1
{
stemp|=(1<<bit);
bit++;
}
else
{
stemp&=(~(1<<bit));
bit++;
}
if (bit==8)
{
bit=0;
buf=stemp;
byte++;
}
if (byte>=4)
{
if((buf&buf)==0X00) && ((buf|buf)==0xff) ) //原码反码判断数据是否有错
{
DDRA|=0X04;
PORTA&=0XFB; //喇叭响,表示程序能运行到这里(在测试时用,测试完删除)
PORTC=buf;
}
else
{
PORTC=0XF0; //用于检测错误码,测试完删除
}
byte=0;
state=0;
}
else
{
state=2;
}
break;
}
sei();
}
//*****************************主函数*********************************************
int main (void)
{
///////////端口初始化
DDRC=0XFF; //PC口为LED输出
PORTD|=0X08; //PD3是能内部上拉
DDRD&=0XF7; //PD3(int1)接红外输入
///////////外部中断1初始化
MCUCR&=0XF7; //电平变化沿触发
MCUCR|=0X04;
GICR|=0X80; //中断是能
GIFR&=0X80;
sei(); //开中断,允许接收红外信号
while (1)
;
} http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_246443.GIF
(原文件名:未命名.GIF)
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_246444.GIF
(原文件名:未命名1.GIF)
页:
[1]