Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 18.07.2010, 03:07  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Компактный декодер протокола RС5

Доброго времени суток.

Очередной камень преткновения с которым я столкнулся это создание компактного декодера протокола RC5. Конкретнее моя цель это сделать единую само подстраивающуюся под временную длину пакета функцию.

Ну в общем получил я грандиозный облом ))))

Код который есть на данный момент:

PHP код:

//Чип к примеру тинька 2313 на 4мгц

#define IR_PORT    PIND.3
#define RECORD_PIN PIND.4
#define LED_RED    PORTD.5


// Переменные для определения таймингов передачи
unsigned long int IR_Clock=0IR_C_Delay=0;
//Переменная которая переключает таймер из режима счета таймингов в режим  обратного 
//отсчета для использования заданных временных интервалов 
char clock_count_mode=0;      // operation flags

//Собственно адрес и данные кода снятые из пакета
char irADDRESSirDATA;
//Сохраняем на флеш данные если надо
eeprom unsigned int saved_ADDRESS=0xFFsaved_DATA=0xFF;


//Таймер переполняем примерно 500к раз в секунду
//Главное тут избыточность тиков чтобы четко выявить длину значимого бита.
interrupt [TIM0_OVFvoid timer0_ovf_isr(void)
{
TCNT0=0x01;

if (
clock_count_mode)  
   
IR_Clock++; //В режиме определения таймингов инкриментируем
 
else
   
IR_C_Delay--; //когда используем задержки декрементируем
}


char get_IR_data(void)
{
   
unsigned long int SynchroDelay_Half=0//Тайминг "половинки" бита
                     
SynchroDelay=0;  // Тайминг целого бита 
   
char IR_COMMAND_bits_count=6,  
        
IR_ADDRESS_bits_count=5//Длина в битах пакета команд и длинна в битах пакета адреса
  
   
irADDRESS=0irDATA=0;  //Обнуляем переменные в которые будет вывод 
   
if (!IR_PORT//Данные от датчика идут ИНВЕРСНО
          

       
//Если у нас пришел 0 от датчика тогда начинаем считать тайминги первого старт бита
            
clock_count_mode=1//врубим режим счета
            
IR_Clock=0//снулим счетную переменную
            
while (!IR_PORT// пока у нас ноль от датчика
             //И пока счет синхро импульса не превысит 120 мили секунд (предохранитель от зависания)
              
if (IR_Clock › 60000) {clock_count_mode=0; return 0;};  // плюсуем таймером переменную тайминга
            
clock_count_mode=0//выключим режим счета
            
SynchroDelay_Half=IR_Clock;  //Для протокола RC5 наш тайминг является половиной "бита" данных
            // Это мы подразумеваем согласно документу
            //    http://www.sbprojects.com/knowledge/ir/rc5.htm        
            
LED_RED=1//Врубим для подтверждения начала приема светодиод
          
} else 
             {  
//Предохранительный выход из функции
               
clock_count_mode=0; return 0;
             };
        
         
//Зададим время которое нужно чтобы перепрыгивать сразу на значащий импульс от датчика 
         
SynchroDelay=SynchroDelay_Half*2;
         
         
//А теперь возьмем и пропустим Второй старт бит S2, бит "нажатия клавиш" T
         
IR_C_Delay=(SynchroDelay*3)+(SynchroDelay_Half/2); // И отступим еше примерно половину "полбита" 
         //чтобы попасть четко в значащее место
         
while(IR_C_Delay); //Понеслась задержка
         // Начнем чтение адреса
         
while (IR_ADDRESS_bits_count--)
          {
            
irADDRESS|=!IR_PORT//Данные принимаются инверсно поэтому 
"НЕ"каем
            irADDRESS
‹‹=1//Смещаем биты влево
            
IR_C_Delay=SynchroDelay//Задерживаем ровно до следующего значащего места
            
while(IR_C_Delay);//Понеслась задержка      
          

         
// Начнем чтение данных все как и раньше          
         
while (IR_COMMAND_bits_count--)
          { 
            
irDATA|=!IR_PORT;
            
irDATA‹‹=1
            
IR_C_Delay=SynchroDelay
            while(
IR_C_Delay);      
          }   
        
// заканчиваем прием
         
LED_RED=0//Всем спасибо, все свободны, гасим светодиод                 
         
return 1;  //Дочитали данные до конца, возвращаем единицу.
}
  
 
void main(void)
{
//--------Инициализация и всякие потроха-----------

PORTD=0b11000;
DDRD=0b100000;



while (
1)
      {
//Тут дан пример кода который может быть использован для управления какой либо одной нагрузкой 
//с возможностью обучения на кнопку любого пульта. 
      
if(get_IR_data())
         {
           if ((
saved_ADDRESS==irADDRESS)&&(saved_DATA==irDATA)&&(RECORD_PIN))
            {
               
//Сюда пишем вызов вашей функции если код совпал
            
}
           if (!
RECORD_PIN// Если коротнем этот пин на ноль
            
{  //То начнем "обучение"
              
saved_ADDRESS=irADDRESS// Сохраним адрес
              
saved_DATA=irDATA// и данные на eeprom
              
delay_ms(1000); // Покурим секунду чтобы не создавать мусора              
            
}
         
         }
      }



Так вот сейчас все это дело реагирует на любую кнопку. куда ни пни срабатывает (((( Обучение увы не приводит к результатам.

Гляньте пожалуйста свежим взглядом и укажите где я напортачил.
А если виноват не код а пульт.....
Реклама:
__________________
Найди путь или проложи сам!
MasterMushi вне форума  
Непрочитано 19.07.2010, 09:16  
MisterDi
Почётный гражданин KAZUS.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Компактный декодер протокола RС5

Вопрос, а что испльзуется в качестве ИК-приемника? Если модуль от ДУ - это одно, если просто ИК-датчик (например от мыши), то может быть контроллер ловит модуляцию? 35-43кГц
__________________
misterdi<@>i.ua
MisterDi вне форума  
Непрочитано 19.07.2010, 11:22  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Компактный декодер протокола RС5

Сообщение от MasterMushi Посмотреть сообщение
Гляньте пожалуйста свежим взглядом и укажите где я напортачил.
А может в алгоритме ошибся?
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
picavr вне форума  
Непрочитано 19.07.2010, 16:51  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Компактный декодер протокола RС5

MisterDi, Пульт и приемник на 36кгц


picavr, Обычно используют алгоритм "разделяющий" в пакете данных длинные (смежные) и короткие импульсы, уже из них выковыривают данные. Я решил просто замерить длину половины бита и потом только отступать сразу на импульсы которые показывали бы значение.
__________________
Найди путь или проложи сам!
MasterMushi вне форума  
Непрочитано 19.07.2010, 17:19  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Компактный декодер протокола RС5

Интересная программа.
Ну вот например -
Код:
//Таймер переполняем примерно 500к раз в секунду
//Главное тут избыточность тиков чтобы четко выявить длину значимого бита.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x01;
...
И
Цитата:
Чип к примеру тинька 2313 на 4мгц
Чтоб получить 500000! прерываний за секунду 4МГц явно недостаточно. 8 тактов - это вход и выход в/из прерывания. Без сохранения SREG и осмысленных действий.
Кроме того TCNT0=0x01; - значит следующее прерывание будет через 255 тактов. Реально еще больше, ведь на момент входа в прерывание TCNT0 уже до какого то значения досчитает. Так что делать 32-х битный счетчик unsigned long int IR_Clock=0 нет необходимости - при 15000 прерываний в секунду и 16 битная переменная переполнится только через 4 секунды. Перед замером длительности импульса неплохо обеспечить гарантированно измерение с начала, т.е. неплохо подождать стартового перепада. Иначе результат может быть далеким от ожидаемого.
ЗЫ. Что за компилятор? Он точно не требует volatile для переменных изменяемых в прерывании и контролируемых в основном цикле? И вообще доступ к таким переменным в основном цикле должен быть из критической секции, иначе возможны странные глюки - считали половину переменной,прерывание с ее изменением, считали вторую половину. Что считано? Да и алгоритм стоит переработать - упрощения не видно, а загрузка процессора на время приема 100%.
kison вне форума  
Сказали "Спасибо" kison
MasterMushi (19.07.2010)
Непрочитано 19.07.2010, 18:03  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Компактный декодер протокола RС5

Использую CV AVR. Он не требует объявление Violatile потому как при оптимизации если видит переменную хоть где нибудь в программе, он ее автоматом прописывает как обязательно присутствующую
__________________
Найди путь или проложи сам!
MasterMushi вне форума  
 

Закладки
Опции темы

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

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

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


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot