поругайте алгоритм

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
cahek80
Держит паяльник хвостом
Сообщения: 903
Зарегистрирован: Сб сен 11, 2010 17:32:42

поругайте алгоритм

Сообщение cahek80 »

Доброго времени суток.
Поскольку большинство увиденных мною исходников декодирования сигнала RC5 были завязаны с таймером и прерыванием INT0, решил написать свой алгоритм обработки ИК-приемника.

Приемник RC5, код запускается по таймеру (не меньше 4кгц), принимает команду с пульта и возвращает в глобальную переменную. RC5_Receiver - вывод, куда повесили ИК-приемник.
irCode, cod - unsigned long (было сделано с запасом), остальные переменные - char

Код: Выделить всё

    if (!RC5_Receiver)
    {
      prevState = 1;
      i = 0;
      biit = 1;
      cod = 1;
      
      while(!RC5_Receiver) {};// синхронизация с началом импульса

      while (i < 30)
      {
        delta = 0;
        state = RC5_Receiver;
        while(state == prevState && delta < 35)
        {
          delta++;
          delay_us(100);
          state = RC5_Receiver;
        }

        if(!((delta > 5 && delta < 11) || (delta > 12 && delta < 26))) break;

        if (delta > 12)
        {
          // комбинации 1-0 или 0-1 в коде, в зависимости от состояния линии
          if(state == 1) biit = 0; else biit = 1;
          i++;
          cod = cod << 1;
          cod = cod | biit;
        }
        else
        {
          if(state == 0)
          {
            i++;
            cod = cod << 1;
            cod = cod | biit;
          }
        }
        prevState = state;
      }

      if (i<13) cod = 0;

      irCode = cod;
    }
Не нужно дергать спящего тигра за усы! Не высыпается 3-ий день!
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: поругайте алгоритм

Сообщение ploop »

Если запускать по таймеру, значит 99,999% времени крутить код впустую? Уж лучше по прерыванию...
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: поругайте алгоритм

Сообщение Мастер Ломастер »

ну сколько можно об одном и том же... Есть же алгоритм БЕЗ ПРЕРЫВАНИЙ И БЕЗ ТАЙМЕРОВ от ARV, есть решения Леонида Ивановича С ПРЕРЫВАНИЯМИ И ТАЙМЕРАМИ, возможны и другие варианты... может, лучше поиском воспользоваться?!
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: поругайте алгоритм

Сообщение ploop »

Дык... автор вроде не просил ничего, просто своим кодом решил поделиться... :)
Реклама
Эиком - электронные компоненты и радиодетали
cahek80
Держит паяльник хвостом
Сообщения: 903
Зарегистрирован: Сб сен 11, 2010 17:32:42

Re: поругайте алгоритм

Сообщение cahek80 »

Мастер Ломастер писал(а):ну сколько можно об одном и том же... Есть же алгоритм БЕЗ ПРЕРЫВАНИЙ И БЕЗ ТАЙМЕРОВ от ARV, есть решения Леонида Ивановича С ПРЕРЫВАНИЯМИ И ТАЙМЕРАМИ, возможны и другие варианты... может, лучше поиском воспользоваться?!
я в свое время не нашел, поэтому и пришлось городить свой :(
сейчас поищу.
Не нужно дергать спящего тигра за усы! Не высыпается 3-ий день!
Реклама
cahek80
Держит паяльник хвостом
Сообщения: 903
Зарегистрирован: Сб сен 11, 2010 17:32:42

Re: поругайте алгоритм

Сообщение cahek80 »

Нашел алгоритмы от ARV, признаюсь честно, в свое время основой лег как раз его код, но добиться получения кодов, данных в таблице с сайта http://www.sbprojects.com/knowledge/ir/rc5.php мне удалось только проанализировав и переписав по своему алгоритм. Посему и решил посоветоваться насколько он корректен и оптимален.
Не нужно дергать спящего тигра за усы! Не высыпается 3-ий день!
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: поругайте алгоритм

Сообщение ploop »

Посмотри мою тему, может пригодится, я недавно тоже раскуривал алгоритмы пультов: http://radiokot.ru/forum/viewtopic.php?f=20&t=53875
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: поругайте алгоритм

Сообщение Мастер Ломастер »

cahek80 писал(а):Нашел алгоритмы от ARV, признаюсь честно, в свое время основой лег как раз его код, но добиться получения кодов, данных в таблице с сайта http://www.sbprojects.com/knowledge/ir/rc5.php мне удалось только проанализировав и переписав по своему алгоритм. Посему и решил посоветоваться насколько он корректен и оптимален.
ARV давеча опубликовал простенький алгоритмик, который должен вам понравиться.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: поругайте алгоритм

Сообщение ploop »

А что делать, если частота пульта поплывёт? Это не редкость.
Считаю единственно верным решением синхронизироваться по каждому импульсу (по прерываниям), или, если следовать алгоритму ARV, проводить опрос как минимум в два раза чаще, что тоже вызовет сложности...
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: поругайте алгоритм

Сообщение Мастер Ломастер »

я, конечно, не могу судить чужие алгоритмы, но вроде как в пультах стоят керамические резонаторы, котрые достаточно стабильны... так что сильно частота не уплывет - если пульт работает по стандарту RC5, он просто обязан выдавать интервалы четко.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: поругайте алгоритм

Сообщение ploop »

Дело в том, что предложенный мною алгоритм может работать с любым пультом, а не только RC5. И не сложнее, кстати :)

А как аппаратные декодеры работают? Если у них синхронизация по первому импульсу, а дальше только детектор фазы - то да, такое решение можно назвать достаточно надёжным...

А что плывут - это точно, чел проводил замеры, выкладывал осциллограммы, два одинаковых пульта сильно отличались по частоте, правда не помню, по какому протоколу работали.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: поругайте алгоритм

Сообщение Мастер Ломастер »

ploop писал(а):Дело в том, что предложенный мною алгоритм может работать с любым пультом, а не только RC5. И не сложнее, кстати :)
лучшее - враг хорошего :) ваш алгоритм в тини13 впишется? ;)
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: поругайте алгоритм

Сообщение ploop »

Да туда 20 таких впишется, при том счетчик может честно работать в PWM-режиме (если он нужен), правда частоту придётся подобрать. Вот только настраивать придётся на макетке с другим МК, т.к. некуда выкидывать отладочную информацию - нет UART'а

Нужно всего лишь настроить другой МК на тактирование, на котором будет работать тинька, настроить счетчик и сосканить нужные кнопки. Либо сканить уже непосредственно с тиньки, если удастся впихнуть туда алгоритм обучения.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: поругайте алгоритм

Сообщение ploop »

Вот, собственно, весь код, который еще хорошо соптимизируется (я уже вижу как, но надо испытывать). После того, как поднимется флаг "CAPT" в codeH и codeL будет код кнопки. Время от времени надо просто анализировать флаг и забрать кнопку. Это весь алгоритм, всё внутри прерывания.

Код: Выделить всё

; Внешнее прерывание
INT_0:
  pushf
  mov prev,cur
  in cur,TCNT0             ; Запоминаем текущее состояние 
  dec offset
  brne ext_int
  inc offset
  mov r16,cur
  sub r16,prev        ; в r16 разница показаний 

  subi r16,border     ; проверим, с какой стороны границы
  rol codeL           ; сдвигаем данные (в C будет 1, если border > R16)
  rol codeH           ; и сдвинется в приёмники
  inc bptr            ; 
  cpi bptr,buf_size
  breq ext_int_0

ext_int:
  popf
reti

ext_int_0:

  sbr flags,(1<<CAPT)
  popf
reti
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: поругайте алгоритм

Сообщение Леонид Иванович »

Мастер Ломастер писал(а):вроде как в пультах стоят керамические резонаторы, котрые достаточно стабильны... так что сильно частота не уплывет - если пульт работает по стандарту RC5, он просто обязан выдавать интервалы четко.
Проблема еще заключается и в том, что на выходе фотоприемника ширина импульса сильно зависит от уровня сигнала. Когда пульт находится в руках, уровень может меняться даже во время одной посылки. Поэтому привязавшись к одному фронту, можно не попасть в другие. Лучше пересинхронизироваться по началу каждого импульса. Что касается кода RC-5, так сам Philips устанавливает для него точность формирования временных интервалов ±25%.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: поругайте алгоритм

Сообщение Мастер Ломастер »

ну... даже при беглом осмотре вашего кода видно, что это далеко не весь код - где-то должна быть инициализация переменных, таймера и т.п., само "забирание" кода... да к тому же код на ассемблере по определению будет оптимальнее сишного. но если его пытаться внедрить в сишную программу, он обрастет "ракушками" и с минимализмом может быть покончено...

но сам алгоритм пока не очень понятен - какой-то подозрительный он... что-то тут не так :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: поругайте алгоритм

Сообщение Мастер Ломастер »

Ничегонеработает писал(а):Поэтому привязавшись к одному фронту, можно не попасть в другие. Лучше пересинхронизироваться по началу каждого импульса. Что касается кода RC-5, так сам Philips устанавливает для него точность формирования временных интервалов ±25%.
можно и по морде, но чаще - впендюриваю © п-к Ржевский :)))
если я верно понимаю, то для гарантии попадания в нужный момент достаточно изменить значение константы START_DELAY...
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: поругайте алгоритм

Сообщение ploop »

Разумеется, инициализация и всё остальное есть. Но она в любом случае будет.
Да могу весь код дать, только он сделан чисто для разработки алгоритма (там срач), который скоро буду использовать в большом проекте.
да к тому же код на ассемблере по определению будет оптимальнее сишного.
Как говорится, на чём могём :)
но сам алгоритм пока не очень понятен - какой-то подозрительный он... что-то тут не так
Словесное описание тут: http://radiokot.ru/forum/viewtopic.php?f=20&t=53875
И еще - он сейчас работает на макетке как есть, сын мой игрался четырьмя светодиодами неделю :) Не сбоит, проверено.
cahek80
Держит паяльник хвостом
Сообщения: 903
Зарегистрирован: Сб сен 11, 2010 17:32:42

Re: поругайте алгоритм

Сообщение cahek80 »

хм, не ожидал такой дискуссии даже ))
Мастер Ломастер интересный алгоритм однако, причем довольно компактный.
хотя, в моем случае особо компактности можно не стремиться, при PIC18F4550 )))
Не нужно дергать спящего тигра за усы! Не высыпается 3-ий день!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»