TI中文支持网
TI专业的中文技术问题搜集分享网站

红外接收的程序 总是跑飞是怎么回事

代码如下

灯是用来测试的 放在main函数的解码循环中从来没亮过

是哪里出了问题

#include "msp430x14x.h"

typedef unsigned char uchar;
typedef unsigned int uint;

#define CPU_F ((double)8000000)#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#define LED8 P3OUT //P34、P35口接2个LED灯用于测试

uint ir_data[33]; //存放解码数据(16位用户码+8位数据码+8位数据反码)uchar ir_code[4]; //存放解码数据(16进制)uchar disp[8]; //存放显示数据uchar irok=0; //数据接收标志位uchar dataok=0; //数据处理标志位uint new_cap = 0;uint old_cap = 0;uint diff_cap = 0;/*********************函数申明************************/void clk_init(void); //时钟初始化void timera_init(void); //定时器初始化void IR_data_pros(void); //数据处理void code_process(void); //显示数据处理/********************初始化时钟**********************/

void clk_init(void) { uchar i;
BCSCTL1&=~XT2OFF;
BCSCTL2|=SELM1+SELS;
do{
IFG1&=~OFIFG;
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0);
IFG1&=~OFIFG;
}

/********************定时器初始化**********************/void timera_init (void){ P1DIR &=~BIT1; //设置P1.1为输入 P1SEL |= BIT1; //设置P1.1为CCI0A输入

TACTL=TASSEL_2+MC_2+ID_3; //timera_clk=aclk=32768Hz、连续计数模式、8分频 CCTL0=CM_2+SCS+CCIS_0+CAP+CCIE; //下降沿捕获、同步捕获、选择输入为CCI0A、捕获模式、开捕获中断}

/*********************红外数据处理函数**************************/void IR_data_pros (void) { uchar i,j,count=1,value; // count=1 、作用是清除引导码 for(i=0;i<4;i++) { for(j=0;j<8;j++) { value>>=1; if(ir_data[count]>1700) //判断捕获时间是否大于1.7MS value|=0x80; //若 >1.7MS,则为1、若 <1.7MS,则为0 count++; } ir_code[i]=value; //存放用户码和数据码 } dataok=1; //数据处理标志置位}

/*********************数据16进制显示处理************************/void code_process(void) { disp[0]=ir_code[0]/16; disp[1]=ir_code[0]%16; disp[2]=ir_code[1]/16; disp[3]=ir_code[1]%16; disp[4]=ir_code[2]/16; disp[5]=ir_code[2]%16; disp[6]=ir_code[3]/16; disp[7]=ir_code[3]%16;}void main(){
WDTCTL = WDTPW + WDTHOLD; //CLOSE THE DOG
//LCD1602_init(); //LCD1602初始化 clk_init(); //时钟初始化 timera_init(); //定时器初始化 _EINT(); //开总中断开关 while(1)
{
LED8=0x00; //点亮LED
delay_ms(500);
LED8=0xff; //熄灭LED
delay_ms(500);
}
while(1){ if(irok) //数据接收是否完毕? { irok=0; //是、清标志位 IR_data_pros(); //红外数据处理函 } if(dataok) //数据处理是否完毕? { dataok=0; //是、清标志位 //code_process(); //显示16进制数据处理 } LED8=0x00; //点亮LED
delay_ms(500);
LED8=0xff; //熄灭LED
delay_ms(500); //显示解码数据 }}

/********************Timer_A中断服务程序*************************/#pragma vector=TIMERA0_VECTOR__interrupt void timera (void){ static uchar index; if(diff_cap>7000) index=1; //检测引导码 new_cap=TACCR0; diff_cap=new_cap – old_cap; ir_data[index++]=diff_cap; //存捕获的差异值,既是数据 if(index==33) //数据接收完毕 { index=0; irok=1; //数据接收标志置位 } old_cap=new_cap;}

Xutong Han2:

能用仿真器追踪是到哪个位置程序跑飞吗?单步运行看看采集的数据对不对。

 

Shi JianHua:

不一定是跑飞呀,看看是不是一直在中断。我弄过这个。

Lina Lian:

Vicky Kin,

请问你是如何确定程序跑飞的?具体现象是什么?跑到什么地方去了?O(∩_∩)O~

Leon Yan:

回复 Lina Lian:

个人建议:

1. 先把中断关闭,看看顺序循环是否正确;

2. 如果正确,可以在中断中toggle LED,看是否有变化;

3. 最好用仿真器来调试,设置断点,仔细分析。

谢谢。

赞(0)
未经允许不得转载:TI中文支持网 » 红外接收的程序 总是跑飞是怎么回事
分享到: 更多 (0)