Добрый вечер уважаемые форумчане! Подскажите пожалуйста как отсеять шумы на выходе приемника ?
Задача: сделать универсальный декодер команд ду на базе радио.
На ИК лучах система пашет отлично, а вот на радио - не программируется , так как шумы влияют на систему.
Тактовая частота МК равна 4мГц
Код сейчас такой:
Код:
|
// сам захват поступающих импульсов
void decode_ir_data()
{
tim_system_rc=0x06;
if(start) // если установлен старт бит - начинаем измерять импульсы
{
if(a‹=111)data_ir[a] = timer_ir;
if(a‹112)a++;
timer_ir=0; // обнуляем счетчик
if(a›110)
{
a=112; // сбрасываем счетчик данных массива
tim_stop=1;
z=0;
}
}
if(start==0) // старт бит установлен? нет!
{
if(IR && timer_ir›100) start=0x01; // да!
else timer_stop();
}
if(a==112) { start=0;}
}
void timer_stop()
{
tim_system_rc=0;
if(start) { tim_stop=1;}
start=0;
a=0;
timer_ir=0;
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
LED=1;
if(flags_prog && WR_EN)
{
timer_stop();
}
else
{
decode_ir_data();
}
}
// обучение командам ДУ
case 0:
if (cmd_rc==0) // команда не поступила
{
if(tim_stop==1)
{
#asm("cli")
if(flags_prog && WR_EN==0)
{
for(d=0; d‹111; d++) // delete data
{
com1[d]=0;
}
for(d=0; d‹111; d++)
{
com1[d]= data_ir[d];
}
}
for(d=0;d‹111;d++) // алгоритм определения поступившей команды
{
if (com1[d]›0 && com1[d]‹0xFF )
{
cmd_rc=1;
d=111; // выходим из цикла
timer_led_shou=0;
}
else
{
cmd_rc=0;
}
}
}
}
else // команда поступила
{
if(++timer_led_shou › 20) {timer_led_shou=0; cmd_rc=0; } // выходим в захват команды
timer_led=20;
flags_interrupt=1;
}
if(++timer_led_ch›15) timer_led_ch=21;
else CMD1=1;
if(timer_led_ch›10 && timer_led_ch‹15)CMD1=0;
break;
// распознавание "своей" команды.
if (tim_stop==1)
{
#asm("cli")
cmd.cmd_0=1;
cmd.cmd_1=cmd.cmd_2=cmd.cmd_3=1;
cmd.flags_0=cmd.flags_1=cmd.flags_2=cmd.flags_3=0;
for(d=0; d‹111; d++)
{
com_buff[d] = com1[d];
if (com_buff[d]‹4)cmd.flags_0=1;
if(cmd.flags_0==0)
{
if (((com_buff[d]+3) ‹ data_ir[d]) || ((com_buff[d]-3) › data_ir[d])) // команда 1
cmd.cmd_0=0;
}
com_buff[d] = com2[d];
if (com_buff[d]‹4)cmd.flags_1=1;
if(cmd.flags_1==0)
{
if (((com_buff[d]+3) ‹ data_ir[d]) || ((com_buff[d]-3) › data_ir[d])) // команда 2
cmd.cmd_1=0;
}
com_buff[d] = com3[d];
if (com_buff[d]‹4)cmd.flags_2=1;
if(cmd.flags_2==0)
{
if (((com_buff[d]+3) ‹ data_ir[d]) || ((com_buff[d]-3) › data_ir[d])) // команда 3
cmd.cmd_2=0;
}
com_buff[d] = com4[d];
if (com_buff[d]‹4)cmd.flags_3=1;
if(cmd.flags_3==0)
{
if (((com_buff[d]+3) ‹ data_ir[d]) || ((com_buff[d]-3) › data_ir[d])) // команда 4
cmd.cmd_3=0;
}
data_ir[d]=0; // стираем буфер
}
tim_stop=0;
if(flags_prog) delay_ms(100);
#asm("sei")
} |
Буду всем крайне признателен за любую помощь в этом направлении!