搜索
bottom↓
回复: 2

马老师,请问我的程序为什么总是运行不到其中的一个地方?

[复制链接]

出0入0汤圆

发表于 2008-4-7 23:23:19 | 显示全部楼层 |阅读模式
马老师你好!看书看了一段时间,之前都是按照书上的例子做实验,现在想自己写个程序看看,于是我想做红外解码的实验。我的思路是用外部中断的电平变化模式,结合T/C1计算电平时间的长短进行解码.实验还没有成功,实验结果总是显示误码。然后我把驱动喇叭响的语句放到程序不同的地方,用来检测程序能否运行到这些地方,结果发现读按键码的地方总是到不了,能帮我看看问题出在哪里吗?
即是这里:

                        if  ((buf[2]&buf[3])==0X00) && ((buf[2]|buf[3])==0xff) )        //原码反码判断数据是否有错
                                {
DDRA|=0X04;
PORTA&=0XFB;                //喇叭响,表示程序能运行到这里(在测试时用,测试完删除)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2008-4-7 23:23:48 | 显示全部楼层
////函数功能:红外接收
////硬件连接:红外接收的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[4];
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[byte]=stemp;
                        byte++;       
                        }
                if (byte>=4)       
                        {

                        if  ((buf[2]&buf[3])==0X00) && ((buf[2]|buf[3])==0xff) )        //原码反码判断数据是否有错
                                {
DDRA|=0X04;
PORTA&=0XFB;                //喇叭响,表示程序能运行到这里(在测试时用,测试完删除)       
                                PORTC=buf[2];
                                }
                        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)
;
}

出0入0汤圆

 楼主| 发表于 2008-4-7 23:52:15 | 显示全部楼层

(原文件名:未命名.GIF)


(原文件名:未命名1.GIF)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 23:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表