Просмотр этой темы:
1 анонимных пользователей
1 2
Главный Технолог
Зарегистрирован:
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. Программирую на С. В азме только проверяю как выглядит код
Отправлено: 01.07.2011 20:07
|
|
Модератор
Зарегистрирован:
26.01.2010 23:26 Из: Тирасполь
Сообщений:
3926
|
Необходимо измерять длительность импульсов с помощью схемы захвата таймера. Импульс принимается если его длительность +/- 25 % от базовой. Ну и на 2,5 мс каждый раз заводим таймер другой на переполнение- если произошло- то таймаут посылки и не RC5 код- очистка флагов и ждем начала. Длительность стартового импульса вообще не проверяем- она будет искажена из-за АРУ приемника.
Отправлено: 01.07.2011 22:34
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Спасибо более понятнее стало!
В смысле:"если произошло"? И как проверить не RC5 code?
Отправлено: 04.07.2011 19:57
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
И еще вопрос. Как реализовать буфер для чтения принятых данных?
Отправлено: 04.07.2011 19:58
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Извините, что пишу не сразу все. Вопросы постепенно лезут)))
Не могу понять зачем другой таймер и для чего 2.5 мС?
Отправлено: 04.07.2011 20:14
|
|
Модератор
Зарегистрирован:
26.01.2010 23:26 Из: Тирасполь
Сообщений:
3926
|
2,5 мс это 2 мс +25% т.е. если время вышло-тогда вся полученная посылка не соответсвует кодировке. Полученный код необходимо очистить и сбросить все флаги. Напишите на бумаге словами как вы видите весь алгоритм работы, последовательно уточняя каждую его часть. Получать можно с помощью битового сдвига и логической ИЛИ.
Отправлено: 05.07.2011 1:00
|
|
Главный Технолог
Зарегистрирован:
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. если оставишь мыло свое, то могу скинуть код. Писал на С
Отправлено: 05.07.2011 7:42
|
|
Модератор
Зарегистрирован:
26.01.2010 23:26 Из: Тирасполь
Сообщений:
3926
|
Код можно прикрепить сюда архивом. Не заметил в алгоритме сбросов по таймауту посылки. Закидывать биты в байты можно напрямую, а не через ж..у :
unsigned int code=0; code=code<<1; if(принята "1") code |=(1U<<index);
Отправлено: 05.07.2011 13:50
Отредактировано пользователем MACTEP 05.07.2011 18:45:57
|
|
Главный Технолог
Зарегистрирован:
01.07.2011 19:44 Из: Тольятти
Сообщений:
305
|
Так в этом то и проблема что не занятый только 1 таймер. Там есть один из вариантов преобразования в байт. Через косвенную адресацию делал(указатели). А потом проверка этих байтов(tmpdata - переменная для хранения байтов). в условии проверяю и потом уже действие в зависимости от рез-та истинности условия. Посмотри, пожалйста.
P.S. Спасибо, что помогаешь))) Это все я делаю на отдельных макетках. На которых разрабатываю протокол.(отдельная программа) А в самом уст-ве задействовано АЦП, таймер 1, таймер 0, TWI(I2C).
Отправлено: 05.07.2011 18:06
|
|
Модератор
Зарегистрирован:
26.01.2010 23:26 Из: Тирасполь
Сообщений:
3926
|
где-то вот такой автомат состояний
Отправлено: 05.07.2011 23:10
|
|
1 2