Форум

Радиолюбительский форум.

Если у Вас возникли вопросы, задавайте их на форуме.

В сети

Пользователей: 181
Из них просматривают:
Аналоги: 61. Видео: 1. Даташиты: 54. Новости: 24. Остальное: 3. Профиль пользователя: 8. Форум: 30.
Участников: 1
Гостей: 180

Google , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.

Просмотр этой темы: 

 1 анонимных пользователей
Проблема с декодером
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Я вот разрабатываю приемник и передатчик по ИК каналу. Сейчас разрабатываю свой протокол по Т, 2Т сони технологии.
Т, 2Т. Т-0, 2Т-1. Передаю 2 бита старта. 8 бит адреса и 8 бит данных.
Декодер я делал по прерыванию 8 битного таймера. По переполнению считает низкий уровень и битовый флаг 1. Как только высокий уровень флаг в 0. Проверяет условие. Определяет время, сравнивая с константой. Кладет его в буфер типа FIFO. Отту в основной прогр. Сравнивает все и выполняет событие если истина. Все это реализовываю в таймере. Да кстати 1 - 2мС, 0- 1м, старт бит - 500 мкС.
Таймер оказывается все не успевает делать. Если по внешнему прерыванию делать, то я пока что- то не совсем понимаю. Перегрев)))
Помогите пожалуйста. Как правильно и лучше это реализовать.
А то я уже совсем запутался
Может у кого пример кода есть.
P.S. Программирую на С. В азме только проверяю как выглядит код



Re: Проблема с декодером
Модератор
Зарегистрирован:
26.01.2010 23:26
Из: Тирасполь
Сообщений: 3926
Не в сети
Необходимо измерять длительность импульсов с помощью схемы захвата таймера. Импульс принимается если его длительность +/- 25 % от базовой. Ну и на 2,5 мс каждый раз заводим таймер другой на переполнение- если произошло- то таймаут посылки и не RC5 код- очистка флагов и ждем начала. Длительность стартового импульса вообще не проверяем- она будет искажена из-за АРУ приемника.



Re: Проблема с декодером
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Спасибо более понятнее стало!
В смысле:"если произошло"? И как проверить не RC5 code?



Re: Проблема с декодером
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
И еще вопрос. Как реализовать буфер для чтения принятых данных?



Re: Проблема с декодером
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Извините, что пишу не сразу все. Вопросы постепенно лезут)))
Не могу понять зачем другой таймер и для чего 2.5 мС?



Re: Проблема с декодером
Модератор
Зарегистрирован:
26.01.2010 23:26
Из: Тирасполь
Сообщений: 3926
Не в сети
2,5 мс это 2 мс +25% т.е. если время вышло-тогда вся полученная посылка не соответсвует кодировке. Полученный код необходимо очистить и сбросить все флаги. Напишите на бумаге словами как вы видите весь алгоритм работы, последовательно уточняя каждую его часть. Получать можно с помощью битового сдвига и логической ИЛИ.



Re: Проблема с декодером
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Дело в что 16 битный таймер занят.
Я написал след. образом:
1) иниц. внешн. прерыв. по люб. лог. уровню и 2-го таймера 8-ми битного по переполнению каждые 12 мкС.
2) Если прих. 0: запуск таймера счета для вычисления длины импульса при помощи переменной timecount(в прерывании использую только timecount++) и уст. флаг.
3)если прих. 1: ост. таймер и сброс флага
4)Если сброшен флаг и есть счет(timecount): то провер. счет, если в одном диапазоне для 1 мС, то в 16 символьный массив с опред. индексом(buffer[wr]) помещаем 0; а если в дипазоне для 2 мС, то ... 1.
5) увелич индекс wr и сравн. его с размером массива 16, если равен, то обнул. wr
6)увелич индекс counter и сравн. его с размером массива 16, если равен, то обнул. counter.
7) пишим макрос:
а. объявляем перем. дата для хранения
б. ждем пока counter равен 0
в. как только counter не равен 0, то data=buffer[rd]
г. увелич индекс rd и сравн. его с размером массива 16, если равен, то обнул. rd.
д. запрещ. все прерыв.; пониж. счетчик; разреш. прерыв;
е. возвращ. в ф-ю data (return data).
8) Дальше просто последов. провер:
Например, если передаю 0х6F = ob01101111, то проверяю так
if (getchar() ==0 && getchar() ==1 && getchar() ==1 && getchar() ==0 ... ) PORTC.2=1; // выкл. LED

P.S. если оставишь мыло свое, то могу скинуть код.
Писал на С



Re: Проблема с декодером
Модератор
Зарегистрирован:
26.01.2010 23:26
Из: Тирасполь
Сообщений: 3926
Не в сети
Код можно прикрепить сюда архивом. Не заметил в алгоритме сбросов по таймауту посылки. Закидывать биты в байты можно напрямую, а не через ж..у :
unsigned int code=0;
code=code<<1;
if(принята "1") code |=(1U<<index);


Отредактировано пользователем MACTEP 05.07.2011 18:45:57


Re: Проблема с декодером
Главный Технолог
Зарегистрирован:
01.07.2011 19:44
Из: Тольятти
Сообщений: 305
Не в сети
Так в этом то и проблема что не занятый только 1 таймер. Там есть один из вариантов преобразования в байт. Через косвенную адресацию делал(указатели). А потом проверка этих байтов(tmpdata - переменная для хранения байтов). в условии проверяю и потом уже действие в зависимости от рез-та истинности условия. Посмотри, пожалйста.
P.S. Спасибо, что помогаешь)))

Это все я делаю на отдельных макетках. На которых разрабатываю протокол.(отдельная программа)
А в самом уст-ве задействовано АЦП, таймер 1, таймер 0, TWI(I2C).

Прикреплённый файл:


zip irda.zip Размер: 2.74 KB; Просмотры: 444



Re: Проблема с декодером
Модератор
Зарегистрирован:
26.01.2010 23:26
Из: Тирасполь
Сообщений: 3926
Не в сети
где-то вот такой автомат состояний

Прикреплённый файл:


zip irda.zip Размер: 1.57 KB; Просмотры: 360



Поиск по форуму


Расширенный поиск

Разное

Интересно

При пайке деталей над горловиной кинескопа накройте ее куском материи.
Этим Вы убережёте кинескоп от случайно падающего расплавленного припоя и, следовательно, от трещин в его стекле.