|
RC5, алгоритм декодирования |
|
|
|
Sep 29 2006, 19:32
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
Решил разобраться сам как оно работает на простом проекте - "ИК выключатель освещения" Сразу скажу огромное спасибо Леониду Ивановичу за прекрастную статьюИтак перый вопрос: почему (на сколько я понял) обычно ext_int ставят по фронту и по первому перерыванию запускают таймер на пол такта, а не так: Цитата АЛГОРИТМ ДЕКОДИРОВАНИЯ
1. вычисляем константу для таймера, чтобы получить интервал 1,778 мс 2. unsigned int rc5_reg=0; 3. unsigned char rc5_counter=0; 4. настраиваем внешнее прерывание по спаду 5. ждем внешнее прерывания; что-либо делаем или спим… 6. первое EXT_INT: 1) запускаем таймер 2) переводим внешнее прерывание в режим по фронту далее по EXT_INT в rc5_reg устанавливаем LSB
по таймеру сдвигаем регистр влево (rc5_reg<<=1;) и rc5_counter++;
когда rc5_counter==13 останавливаем таймер и переводим EXT_INT в режим по спаду
|
|
|
|
|
Sep 29 2006, 19:52
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(vooon @ Sep 29 2006, 23:32)  Решил разобраться сам как оно работает на простом проекте - "ИК выключатель освещения" Сразу скажу огромное спасибо Леониду Ивановичу за прекрастную статьюИтак перый вопрос: почему (на сколько я понял) обычно ext_int ставят по фронту и по первому перерыванию запускают таймер на пол такта, а не так: Ну точно Вам ответит Леонид Иванович (не вникал подробно в алгоритм), но как мне кажется это для того чтобы отфильтровать помехи. В вашем варианте алгоритма нет (???) защиты от случайного срабатывания.
|
|
|
|
|
Sep 29 2006, 20:47
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
Цитата В вашем варианте алгоритма нет (???) защиты от случайного срабатывания. Хм действительно пока нет; думаю нужно добавить проверку первого принятого бита == 1 ? это несколько снизит вероятность ошибки Вобще предполагалось сравнивать принятые коды с кодами в EEPROM (их 2) и на остальные ни как не реагировать. Спасибо.
|
|
|
|
|
Sep 30 2006, 23:06
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
Вроде что-то начало получаться, прикрепил си, проверьте на железе пока не проверял... не успел...
Эскизы прикрепленных изображений
Прикрепленные файлы
main.rar ( 1.42 килобайт )
Кол-во скачиваний: 151
|
|
|
|
|
Sep 30 2006, 23:34
|
Частый гость
 
Группа: Участник
Сообщений: 160
Регистрация: 5-04-06
Из: Москва
Пользователь №: 15 847

|
Цитата(vooon @ Sep 29 2006, 23:32)  Решил разобраться сам как оно работает на простом проекте - "ИК выключатель освещения" Сразу скажу огромное спасибо Леониду Ивановичу за прекрастную статьюИтак перый вопрос: почему (на сколько я понял) обычно ext_int ставят по фронту и по первому перерыванию запускают таймер на пол такта, а не так: Цитата АЛГОРИТМ ДЕКОДИРОВАНИЯ
1. вычисляем константу для таймера, чтобы получить интервал 1,778 мс 2. unsigned int rc5_reg=0; 3. unsigned char rc5_counter=0; 4. настраиваем внешнее прерывание по спаду 5. ждем внешнее прерывания; что-либо делаем или спим… 6. первое EXT_INT: 1) запускаем таймер 2) переводим внешнее прерывание в режим по фронту далее по EXT_INT в rc5_reg устанавливаем LSB
по таймеру сдвигаем регистр влево (rc5_reg<<=1;) и rc5_counter++;
когда rc5_counter==13 останавливаем таймер и переводим EXT_INT в режим по спаду И за что Вы говорите огромное спасибо Леониду Ивановичу, если сами ничего не поняли из этой статьи. А если по делу - алгоритм очень простой, сам, когда разбирался, написал прогу примерно за час. Она еще по нажатию клавиш с пульта,каких не помню, плавно регулирует яркость ламп накаливания. Если нужно - могу поделиться.
|
|
|
|
|
Oct 1 2006, 09:27
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
Цитата И за что Вы говорите огромное спасибо Леониду Ивановичу, если сами ничего не поняли из этой статьи. Спасибо за русскую достаточно понятную статью, другое дело что я не знаю 51ый асм. в своем алгоритме я нашел ошибку - конфликт прерываний, будут глюки при приеме нескольких 0 подряд http://www.spettel.de/ralf/index_reload.ht...ojekte/avr_rc5/У немцев взял основную идею - запуск таймера по прерыванию, таймер 3/4 такта Цитата Если нужно - могу поделиться. Будет интересно посмотреть как вы сделали мыло vooon341(собака)mail.ru
|
|
|
|
|
Oct 1 2006, 11:04
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
Возникла проблема с COM1 портом, нет ответа проверял так соединал линии TX и RX посылал "12345" в ответ ни чего не пришло использовал программу rs232Pro мать asus p4p800 Вопрос как проверить не сгорел-ли порт? Или глюк виндовса?
|
|
|
|
|
Oct 1 2006, 15:19
|

Местный
  
Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986

|
Цитата(vooon @ Sep 29 2006, 22:32)  Итак перый вопрос: почему (на сколько я понял) обычно ext_int ставят по фронту и по первому перерыванию запускают таймер на пол такта, а не так: Интегральные ИК-приемники имеют инверсный выход, т.е. в состоянии покоя там единица, а когда придет посылка, она начнется со спада. Сетку сэмплирования нужно сдвинуть таким образом, чтобы опрос приходился на середину импульса, а не на переход. Декодирование RC-5 имеет несколько особенностей. Длительность первых импульсов может быть искажена, так как при появлении ИК-сигнала приемник подстраивает свою АРУ. Поэтому контролировать их длительность нужно с увеличенными допусками или не контролировать вовсе (отрабатывать только таймаут). Декодер RC-5, рекомендованный фирмой Philips, обязан измерять длительность каждого импульса (единицы и нолика), а не просто сэмплировать посылку в определенные моменты времени. Код RC-5 не имеет никакой защиты от помех, типа контрольной суммы и подобных вещей. Поэтому нужно строго контролировать формат посылки. Мой декодер, приведенный в статье, так и делает. Но он производит программное декодирование, т.е. загружает процессор во время декодирования. Такой метод имеет много ограничений. Как показывет опыт, сэмплирование посылки в центре каждого импульса показывает достаточную помехоустойсивость. Можно каждый бит сэмплировать несколько раз (например, три раза), а затем мажоритарным методом восстанавливать значение (как делают аппаратные UART-ы). Еще один вариант - измерять длительность импульсов, используя схему захвата таймера. Такой метод, конечно, сложнее в реализации, но более помехоустойчив. Для бытового использования, думаю, вполне достаточно декодера, просто сэмплирующего посылку.
--------------------
|
|
|
|
|
Oct 1 2006, 17:40
|
Местный
  
Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284

|
Думаю это Вам поможет - RC-5 for Atmega (c code)Щас сам разбираюсь, стало интересно  а где взять это Код #include <bitmsk.h> #include <avrlibtypes.h> #include <avrlibdefs.h>
|
|
|
|
|
Oct 2 2006, 02:49
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
Цитата а где взять это Код #include <bitmsk.h> #include <avrlibtypes.h> #include <avrlibdefs.h> avrlibtypes.h и avrlibdefs.h там: http://hubbard.engr.scu.edu/avr/avrlib/bitmsk.h - имена битов (пока только те что использовал) Спасибо за линк буду изучать  изменил - файл забыл приаттачить
Сообщение отредактировал vooon - Oct 2 2006, 02:51
|
|
|
|
|
Oct 2 2006, 02:50
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-07-06
Пользователь №: 19 070

|
ps1xvooonА я как-то написал чтение RC5 без использования таймеров, проверил у себя - работает стабильно (хотя там и недостатки, описанные выше). Просто вызываю функцию из прерывания, а она возвращает код нажатой кнопки.
Сообщение отредактировал 676038 - Oct 2 2006, 02:58
Прикрепленные файлы
rc5.zip ( 657 байт )
Кол-во скачиваний: 144
|
|
|
|
|
Oct 2 2006, 02:53
|

Частый гость
 
Группа: Новичок
Сообщений: 164
Регистрация: 11-01-05
Из: Россия, Снежинск
Пользователь №: 1 900

|
Я в прошлом году делал тестер для пультов RC-5 стандарта. Прочёл в журнале "радио" статью про подобную конструкцию там программа написана на Basic в котором заложен алгоритм приёма RC-5, но меня не устроил ряд функций и формат выводимых данных, да и самому захотелось разобратся с этим делом подробно. В результате за вечер на макетке спаял приёмник с индикацией: адреса, команды, наличия IR сигнала и бита новой посылки. В добавленном файле схема в формате PCad2001 и файл проги на ассемблере.
Прикрепленные файлы
RxRc5.zip ( 20.97 килобайт )
Кол-во скачиваний: 156
|
|
|
|
|
Oct 2 2006, 03:04
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 27-06-06
Из: Msk
Пользователь №: 18 401

|
Свой алгоритм я проверил - работает (пока  ) длительность тактов моего пульта 1,67 мс (в основном) шаг временной сетки у первого 5 мс, второго - 10 мс сняты с тсопа логическим анализатором samsung
Интересует что это за код? на сколько я понял посылка в конце бит повтора? erisson
ЗЫ опять меня проглючило...
Сообщение отредактировал vooon - Oct 2 2006, 03:07
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|