Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RC5
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
vooon
Решил разобраться сам как оно работает на простом проекте - "ИК выключатель освещения"

Сразу скажу огромное спасибо Леониду Ивановичу за прекрастную статью

Итак перый вопрос: почему (на сколько я понял) обычно 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 в режим по спаду
singlskv
Цитата(vooon @ Sep 29 2006, 23:32) *
Решил разобраться сам как оно работает на простом проекте - "ИК выключатель освещения"

Сразу скажу огромное спасибо Леониду Ивановичу за прекрастную статью

Итак перый вопрос: почему (на сколько я понял) обычно ext_int ставят по фронту
и по первому перерыванию запускают таймер на пол такта, а не так:

Ну точно Вам ответит Леонид Иванович (не вникал подробно в алгоритм),
но как мне кажется это для того чтобы отфильтровать помехи.
В вашем варианте алгоритма нет (???) защиты от случайного срабатывания.
vooon
Цитата
В вашем варианте алгоритма нет (???) защиты от случайного срабатывания.


Хм действительно пока нет;
думаю нужно добавить проверку первого принятого бита == 1 ?
это несколько снизит вероятность ошибки

Вобще предполагалось сравнивать принятые коды с кодами в EEPROM (их 2) и на остальные ни как не реагировать.

Спасибо.
Stas
Делал два раза в разное время такие вещи но на AT89C2051. По внешнему прерыванию запускался прием посылки, принимал прграммно (через задержки считывал по битику, анализировал), на таймере паралельно запускался счетчик тайм аута. После приема (если он не заканчивался тайм аутом) сравнивал результат с используемыми кодами, если тайм аут или несовпадение то пропускаем код - защита от случайного срабатывания. Ради хохмы специально устраивал помехи на ик светодиодах, подавал коды в другом стандарте, ошибок декодирования небыло...
vooon
Вроде что-то начало получаться, прикрепил си, проверьте help.gif

на железе пока не проверял... не успел...
algidim
Цитата(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 в режим по спаду



И за что Вы говорите огромное спасибо Леониду Ивановичу, если сами ничего не поняли из этой статьи. sad.gif
А если по делу - алгоритм очень простой, сам, когда разбирался, написал прогу примерно за час. Она еще по нажатию клавиш с пульта,каких не помню, плавно регулирует яркость ламп накаливания.
Если нужно - могу поделиться. cheers.gif
vooon
Цитата
И за что Вы говорите огромное спасибо Леониду Ивановичу, если сами ничего не поняли из этой статьи.

Спасибо за русскую достаточно понятную статью, другое дело что я не знаю 51ый асм.

в своем алгоритме я нашел ошибку - конфликт прерываний, будут глюки при приеме нескольких 0 подряд

http://www.spettel.de/ralf/index_reload.ht...ojekte/avr_rc5/
У немцев взял основную идею - запуск таймера по прерыванию, таймер 3/4 такта

Цитата
Если нужно - могу поделиться.

Будет интересно посмотреть как вы сделали a14.gif
мыло vooon341(собака)mail.ru
vooon
Возникла проблема с COM1 портом, нет ответа

проверял так соединал линии TX и RX
посылал "12345"
в ответ ни чего не пришло

использовал программу rs232Pro
мать asus p4p800

Вопрос как проверить не сгорел-ли порт?
Или глюк виндовса?

help.gif
Pyku_He_oTTyda
Цитата
Вопрос как проверить не сгорел-ли порт?
Или глюк виндовса?

Подключить что то наверняка работающее, например старую комовскую мышку
Леонид Иванович
Цитата(vooon @ Sep 29 2006, 22:32) *
Итак перый вопрос: почему (на сколько я понял) обычно ext_int ставят по фронту
и по первому перерыванию запускают таймер на пол такта, а не так:


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

Декодирование RC-5 имеет несколько особенностей. Длительность первых импульсов может быть искажена, так как при появлении ИК-сигнала приемник подстраивает свою АРУ. Поэтому контролировать их длительность нужно с увеличенными допусками или не контролировать вовсе (отрабатывать только таймаут). Декодер RC-5, рекомендованный фирмой Philips, обязан измерять длительность каждого импульса (единицы и нолика), а не просто сэмплировать посылку в определенные моменты времени. Код RC-5 не имеет никакой защиты от помех, типа контрольной суммы и подобных вещей. Поэтому нужно строго контролировать формат посылки. Мой декодер, приведенный в статье, так и делает. Но он производит программное декодирование, т.е. загружает процессор во время декодирования. Такой метод имеет много ограничений. Как показывет опыт, сэмплирование посылки в центре каждого импульса показывает достаточную помехоустойсивость. Можно каждый бит сэмплировать несколько раз (например, три раза), а затем мажоритарным методом восстанавливать значение (как делают аппаратные UART-ы). Еще один вариант - измерять длительность импульсов, используя схему захвата таймера. Такой метод, конечно, сложнее в реализации, но более помехоустойчив. Для бытового использования, думаю, вполне достаточно декодера, просто сэмплирующего посылку.
ps1x
Думаю это Вам поможет - RC-5 for Atmega (c code)
Щас сам разбираюсь, стало интересно smile.gif

а где взять это
Код
#include    <bitmsk.h>
#include    <avrlibtypes.h>
#include    <avrlibdefs.h>
vooon
Цитата
а где взять это

Код
#include    <bitmsk.h>
#include    <avrlibtypes.h>
#include    <avrlibdefs.h>


avrlibtypes.h и avrlibdefs.h там: http://hubbard.engr.scu.edu/avr/avrlib/

bitmsk.h - имена битов (пока только те что использовал)

Спасибо за линк буду изучать smile.gif


изменил - файл забыл приаттачить smile.gif
676038
ps1x
vooon
А я как-то написал чтение RC5 без использования таймеров, проверил у себя - работает стабильно (хотя там и недостатки, описанные выше).
Просто вызываю функцию из прерывания, а она возвращает код нажатой кнопки.
ValeraK
Я в прошлом году делал тестер для пультов RC-5 стандарта.

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

В результате за вечер на макетке спаял приёмник с индикацией:
адреса, команды, наличия IR сигнала и бита новой посылки.

В добавленном файле схема в формате PCad2001 и файл проги на ассемблере.
vooon
Свой алгоритм я проверил - работает (пока smile.gif )
длительность тактов моего пульта 1,67 мс (в основном)

шаг временной сетки у первого 5 мс, второго - 10 мс
сняты с тсопа логическим анализатором

samsung
Нажмите для просмотра прикрепленного файла

Интересует что это за код?
на сколько я понял посылка в конце бит повтора?

erisson
Нажмите для просмотра прикрепленного файла


ЗЫ опять меня проглючило... smile.gif
algidim
Вот моя прога, может поможет, там реализован регулятор яркостью ламп накаливания при нажатии кнопок пульта. В этом случае на компоратор нужно подовать импульсы сети,чтобы он изменял свое состояние при переходе черз 0 импульсов сети 50Гц. А сам алгоритм декодирования RC5 занимает строчек 10.В переменную RC5 записывается не вся посылка, а только млатшие 6 бит, в которых и передается код нажатой клавиши.
hd44780
algidim, для какого конроллера вы это писали и на какой частоте он работает?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.