Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Алгоритм Декодирования На Базе Rr10 & Mega8

Непрочитано 06.08.2014, 23:12  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Алгоритм Декодирования На Базе Rr10 & Mega8

Добрый вечер уважаемые форумчане! Подскажите пожалуйста как отсеять шумы на выходе приемника ?
Задача: сделать универсальный декодер команд ду на базе радио.
На ИК лучах система пашет отлично, а вот на радио - не программируется , так как шумы влияют на систему.

Тактовая частота МК равна 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")
                                                         }

Буду всем крайне признателен за любую помощь в этом направлении!
Реклама:
artyomugr вне форума  
 

Метки
atmega8, mega8, rr10
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 14:49.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.