реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> RC5, алгоритм декодирования
vooon
сообщение Sep 29 2006, 19:32
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 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 в режим по спаду
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 29 2006, 19:52
Сообщение #2


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(vooon @ Sep 29 2006, 23:32) *
Решил разобраться сам как оно работает на простом проекте - "ИК выключатель освещения"

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

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

Ну точно Вам ответит Леонид Иванович (не вникал подробно в алгоритм),
но как мне кажется это для того чтобы отфильтровать помехи.
В вашем варианте алгоритма нет (???) защиты от случайного срабатывания.
Go to the top of the page
 
+Quote Post
vooon
сообщение Sep 29 2006, 20:47
Сообщение #3


Участник
*

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



Цитата
В вашем варианте алгоритма нет (???) защиты от случайного срабатывания.


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

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

Спасибо.
Go to the top of the page
 
+Quote Post
Stas
сообщение Sep 30 2006, 07:03
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 464
Регистрация: 1-10-04
Из: Челябинск
Пользователь №: 751



Делал два раза в разное время такие вещи но на AT89C2051. По внешнему прерыванию запускался прием посылки, принимал прграммно (через задержки считывал по битику, анализировал), на таймере паралельно запускался счетчик тайм аута. После приема (если он не заканчивался тайм аутом) сравнивал результат с используемыми кодами, если тайм аут или несовпадение то пропускаем код - защита от случайного срабатывания. Ради хохмы специально устраивал помехи на ик светодиодах, подавал коды в другом стандарте, ошибок декодирования небыло...
Go to the top of the page
 
+Quote Post
vooon
сообщение Sep 30 2006, 23:06
Сообщение #5


Участник
*

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



Вроде что-то начало получаться, прикрепил си, проверьте help.gif

на железе пока не проверял... не успел...
Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  main.rar ( 1.42 килобайт ) Кол-во скачиваний: 151
 
Go to the top of the page
 
+Quote Post
algidim
сообщение Sep 30 2006, 23:34
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 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 в режим по спаду



И за что Вы говорите огромное спасибо Леониду Ивановичу, если сами ничего не поняли из этой статьи. sad.gif
А если по делу - алгоритм очень простой, сам, когда разбирался, написал прогу примерно за час. Она еще по нажатию клавиш с пульта,каких не помню, плавно регулирует яркость ламп накаливания.
Если нужно - могу поделиться. cheers.gif
Go to the top of the page
 
+Quote Post
vooon
сообщение Oct 1 2006, 09:27
Сообщение #7


Участник
*

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



Цитата
И за что Вы говорите огромное спасибо Леониду Ивановичу, если сами ничего не поняли из этой статьи.

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

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

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

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

Будет интересно посмотреть как вы сделали a14.gif
мыло vooon341(собака)mail.ru
Go to the top of the page
 
+Quote Post
vooon
сообщение Oct 1 2006, 11:04
Сообщение #8


Участник
*

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



Возникла проблема с COM1 портом, нет ответа

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

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

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

help.gif
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение Oct 1 2006, 15:18
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



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

Подключить что то наверняка работающее, например старую комовскую мышку


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Oct 1 2006, 15:19
Сообщение #10


Местный
***

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



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


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

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


--------------------
Go to the top of the page
 
+Quote Post
ps1x
сообщение Oct 1 2006, 17:40
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Думаю это Вам поможет - RC-5 for Atmega (c code)
Щас сам разбираюсь, стало интересно smile.gif

а где взять это
Код
#include    <bitmsk.h>
#include    <avrlibtypes.h>
#include    <avrlibdefs.h>
Go to the top of the page
 
+Quote Post
vooon
сообщение Oct 2 2006, 02:49
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 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 - имена битов (пока только те что использовал)

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


изменил - файл забыл приаттачить smile.gif

Сообщение отредактировал vooon - Oct 2 2006, 02:51
Прикрепленные файлы
Прикрепленный файл  bitmsk.rar ( 326 байт ) Кол-во скачиваний: 113
 
Go to the top of the page
 
+Quote Post
676038
сообщение Oct 2 2006, 02:50
Сообщение #13


Участник
*

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



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

Сообщение отредактировал 676038 - Oct 2 2006, 02:58
Прикрепленные файлы
Прикрепленный файл  rc5.zip ( 657 байт ) Кол-во скачиваний: 144
 
Go to the top of the page
 
+Quote Post
ValeraK
сообщение Oct 2 2006, 02:53
Сообщение #14


Частый гость
**

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



Я в прошлом году делал тестер для пультов RC-5 стандарта.

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

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

В добавленном файле схема в формате PCad2001 и файл проги на ассемблере.
Прикрепленные файлы
Прикрепленный файл  RxRc5.zip ( 20.97 килобайт ) Кол-во скачиваний: 156
 
Go to the top of the page
 
+Quote Post
vooon
сообщение Oct 2 2006, 03:04
Сообщение #15


Участник
*

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



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

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

samsung
Прикрепленное изображение


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

erisson
Прикрепленное изображение



ЗЫ опять меня проглючило... smile.gif

Сообщение отредактировал vooon - Oct 2 2006, 03:07
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 04:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.0152 секунд с 7
ELECTRONIX ©2004-2016