|
本帖最后由 oldsport 于 2014-6-20 16:41 编辑
一次红外遥控大概60到70个沿变,两个沿变之间最少560us,上下沿都可触发外部中断。一下是程序
外部中断处理:
#pragma vector=PORT1_VECTOR
__interrupt void port1(void)
{
u8 pulse_long,key_temp = 0;
if(P1IFG & BIT5)
{
P1IFG &= ~BIT5;
pulse_long = pulse_measurement(BIT5);
if(pulse_long != 0xff && pulse_long > 0)
key_temp = red_key_scan(pulse_long);
if(0 != key_temp)
red_key_num = key_temp;
}
}
脉冲测量:pulse_long = pulse_measurement(BIT5);
u8 pulse_measurement(u8 pin_num) //BTI0 或者 BIT1 或者 BIT2 等等
{
static u16 time_old = 0,time_now = 0;
static u8 overflow_a_now = 0,pulse_ok = 0;
u16 pulse_temp;
u8 res_temp;
pulse_temp = TAR;
overflow_a_now = overflow_a;
if(P1IES & pin_num) //下降沿
{
if(1 == pulse_ok)
{
time_now = pulse_temp;
pulse_temp = overflow_a_now*65536 - time_old + time_now;
P1IES ^= pin_num;
if(pulse_temp < 255)
res_temp = pulse_temp;
else
res_temp = 0;
pulse_ok = 0;
}
return (res_temp);
}
else //上升沿
{
P1IES ^= pin_num;
time_old = pulse_temp;
pulse_ok = 1;
overflow_a = 0;
return 0xff;
}
}
红外解码:key_temp = red_key_scan(pulse_long);
u8 red_key_scan(u8 pulse_long)
{
static u8 red_state = 0;
static u16 red_control;
static u8 red_full = 0;
u8 pulse_num;
if(pulse_long < 22 )
pulse_num = 0;
if(pulse_long >= 22 )
pulse_num = 1;
if(pulse_long >= 85 )
pulse_num = 2;
switch(red_state)
{
case 0:
if(2 == pulse_num)
{
red_state++;
red_control = 0;
}
break;
case 1:
if(0 == pulse_num || 1 == pulse_num)
{
red_full++;
if(16 == red_full)
{
red_full = 0;
red_state++;
}
}
else
{
red_state = 0;
return 0;
}
break;
case 2:
if(0 == pulse_num || 1 == pulse_num)
{
if(0 == pulse_num)
red_control = red_control>>1;
if(1 == pulse_num)
{
red_control = red_control>>1;
red_control |= 0x8000;
}
red_full++;
if(16 == red_full)
{
red_full = 0;
red_state = 0;
pulse_num = red_control;
return pulse_num;
}
}
else
{
red_state = 0;
return 0;
}
break;
default:break;
}
return 0;
}
ADC打开:次任务20ms执行一次
void adc_sequence_start(u8 start_num) //A0 或者 A5 等等
{
if(start_num == A0) start_num = 0;
else if(start_num == A1) start_num = 1;
else if(start_num == A2) start_num = 2;
else if(start_num == A3) start_num = 3;
else if(start_num == A4) start_num = 4;
else if(start_num == A5) start_num = 5;
else if(start_num == A6) start_num = 6;
else if(start_num == A7) start_num = 7;
ADC12CTL1 |= (start_num * 0x1000) | CONSEQ_1;
ADC12CTL0 |= MSC | ADC12ON; //打开转换器
ADC12CTL0 &= ~ENC;
ADC12CTL0 &= ~ADC12SC;
asm("nop");
ADC12CTL0 |= ENC; // 使能转换
ADC12CTL0 |= ADC12SC; // 开始转换
}
ADC中断服务: 在中断服务中调用
void adc_int_num_0()
{
data0[index0++] = ADC12MEM0;
_EINT(); //打开中断是因为显示的执行太久,会影响红外解码,并且这两行只是为了找问题(无法显示才找到问题),删除了问题依旧
disp_num(10,1,data0[index0 - 1]);
if(index0 == 20)
index0 = 0;
}
问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题,问题是:
在某个时间点上,按下红外遥控,会无法进入ADC中断,大概两秒多一点又恢复正常了。整个系统除了ADC中断无法进去之外一切正常。
请问是为什么呢,我调试两天了,找不到原因啊~~~~~~~~•
|
|