Вы не вошли.
Привет всем!
Может кто встречал описание конструкции пультика и декодера на PIC -контроллере. Например, -пультик посылает посылку с кодом, приёмник его проверяет на правильность, и, после этого выдаёт команду, -на запуск двигателя, или, открывание дверей -например. Если где то попадалось описание с листингами, дайте ссылочку. Упор на исключение ложного срабатывания. Зараннее спасибо.
Отредактировано petcheneg (31.05.2007 15:56:02)
Вне форума
Берешь пульт RC-5 и примерно такой код
;=============================================================================
; Обработчик пульта, работающего в системе RC-5.Состоит из двух частей.
; Первая - декодер, принимающий посылку - прием 14 бит, детектирование ошибок.
; Вторая - анализ - соответствие адреса, проверка бита повтора и т.д.
;=============================================================================
; Первым делом, определения - портов, битов, ячеек ОЗУ...
;=============================================================================
IR_TIMER EQU TMR3H
#define IR_INPUT PORTB,0
#define IR_INT_ENABLE INTCON,INT0IE
#define IR_INT_FLAG INTCON,INT0IF
;=============================================================================
;=============================================================================
;=============================================================================
;
;=============================================================================
; Первая часть процедры - декодирование команды (14 бит). Процедура работает
; по двум прерываниям - внешнему от входа, к которому подкючен ИК-приемник,
; и таймера.
;=============================================================================
; При срабатывании внешнего прерывания делаем две вещи - снимаем его флаг и
; перезапускаем таймер. Таймер настроен на длительность, равную 3/4 периода
; одной посылки кода RC-5.
; Кстати, срабатывание прерывания таймера в то время, когда ожидается внешнее
; прерывание - ошибка...
;=============================================================================
IR_EXT_INTERUPT
CALL IR_TIMER_STOP ; Останавливаем таймер 3
CALL IR_TIMER_START ; Запускаем таймер 3
BCF IR_INT_FLAG ; Сбрасывем флаг прерывания
BCF IR_INT_ENABLE ; Запрещаем внешнее прерывание
RETURN
;=============================================================================
; При обаботке таймера процедура сложнее.
; 1). Если таймер сработал в то время, когд ожидается внешнее прервывание,
; значит произошла ошибка (в нормальном режиме от момента разрешения внешнего
; прерывания, до его срабатывания проходит около 1/4-й периода посылки, а
; таймер настроен на 3/4)....
;=============================================================================
IR_TIMER_INTERUPT
CALL IR_TIMER_STOP ; Останавливаем таймер
BTFSC IR_INT_ENABLE ; Если внешнее прерывание было разрешено,
GOTO IR_INT_TIMEOUT ; и сработал таймер - то идем на "ошибку"...
;=============================================================================
; 2). Нормальный ход процесса - принимаем бит. Сдвигаем регистр IR_COMMAND
; влево С УЧЕТОМ БИТА CARRY (он необходим в дальнейшем при сдвиге данных в
; регистре IR_ADRES). Потом проверяем уровень сигнала на входе от ИК-примника
; и такое же значение прописываем в младшем бите регистра IR_COMMAND.
;=============================================================================
SHIFT_COMMAND_BITS
RLCF IR_COMMAND ; Сдвигаем регистр комманды влево через С
BTFSS IR_INPUT ; Если на входе сигнала от ИК-Приемника НЕ "1"
BCF IR_COMMAND,0 ; сбрасываем младший разрял регистра команд в "0"
BTFSC IR_INPUT ; Если на входе сигнала от ИК-Приемника НЕ "0"
BSF IR_COMMAND,0 ; пишем в младший разрял регистра команд "1"
;=============================================================================
; Продолжаем - сдвгаем влево регистр IR_ADRES. НО, в этот раз уже БЕЗ УЧЕТА
; БИТА CARRY (более того, нем его использование противопоказано - НУЖНО, чтобы
; сохранилось значение, оставшееся после сдвига регистра IR_COMMAND). Затем
; проверяем значение бита CARRY и такое же значение прописываем в младший бит
; регистра IR_ADRES.Затем уменьшаем счетчик бит принятого сигнала (их должно
; быть 14), и перезапускаем одновремено и внешнее прерывание и таймер.
;=============================================================================
SHIFT_ADRES_BITS
RLNCF IR_ADRES ; Сдвигаем регистр адреса влево БЕЗ переноса
BTFSC STATUS,C ; Проверяем бит переноса, если равен "1"
BSF IR_ADRES,0 ; пишем "1" в младший разряд регистра адреса.
BTFSS STATUS,C ; Проверяем бит переноса, если равен "0"
BCF IR_ADRES,0 ; пишем "0" в младший разряд регистра адреса.
DCFSNZ IR_COUNT,F ; Уменьшаем счетчик принятых бит и проверяем.
GOTO CMD_RECEIVED ; Если получили "0" (приняты все 14 бит посылки),
; уходим по метке дальше
CALL IR_EXT_INT_REENABLE ; Перезапускаем внешнее прерывание
CALL IR_TIMER_START ; Запускаем таймер 3
RETURN
;=============================================================================
; CMD_RECEIVED - это финал успешного приема посылки (14 бит) пульта.
; Прием команды (14 бит) завершен. Форматируем полученные данные и вызываем
; процедуру подготовки к прему следующей команды. В конце - ставим флаги...
;=============================================================================
CMD_RECEIVED
CALL IR_DATA_FORMAT ; Форматируем полученные данные
IR_DECODE_EXIT
CALL CYCLE_PREPARE ; Вызываем подготовку к прему следующей команды.
BSF IR_INT ; Ставим флаг - Принята ИК команда.
BCF INTCON2,INTEDG0 ; Включаем прерывание по СПАДУ
BCF IR_INT_FLAG ; Сбрасываем флаг внешнего прерывания
BSF IR_INT_ENABLE ; Разрешаем внешнее прерыване.
RETURN
;=============================================================================
; IR_INT_TIMEOUT - ошибка пр приеме - переполнение таймера в то время, когда
; ождалось внешнее прерывание...
;=============================================================================
IR_INT_TIMEOUT
CALL IR_TIMER_STOP ; Останавливаем таймер
BSF IR_ER_F ; Ставим флаг - Ошибка приема ИК-посылки
GOTO IR_DECODE_EXIT ; Идем ВЫХОДИТЬ из процедуры приема.
RETURN
;=============================================================================
; Тут мы готовимся к циклу - а именно:
;=============================================================================
CYCLE_PREPARE
MOVLW B'00111000' ; Сбрасываем разряды регистра IR_FLAG, участвующие
ANDWF IR_FLAG,F ; в процедуре декодирования кода RC-5
MOVLW D'14' ; Ложим 14 (число бит, которое нужно принять)
MOVWF IR_COUNT ; в регистр счетчика бит.
RETURN
;=============================================================================
; Процедура включает внешнее прерывание и выбирает повод его срабатыания
; (фронт или спад) в зависимости от значения (ноль или единица) послежнего
; принятого бита.
;=============================================================================
IR_EXT_INT_REENABLE
BTFSS IR_COMMAND,0 ; Ксли последний принятый бит - ноль, то
BSF INTCON2,INTEDG0 ; включаем внешнее прерывание по ФРОНТУ
BTFSC IR_COMMAND,0 ; Если последний принятый бит - единица, то
BCF INTCON2,INTEDG0 ; включаем прерывание по СПАДУ
BCF IR_INT_FLAG ; Сбрасываем флаг внешнего прерывания
BSF IR_INT_ENABLE ; Разрешаем внешнее прерывание
RETURN
;=============================================================================
; Запуск таймера
;=============================================================================
IR_TIMER_START
MOVLW 0xF8
MOVWF TMR3H ; новые значения
MOVLW 0xE3
MOVWF TMR3L ; в таймер 3
MOVLW B'10000001' ; берем константу, соответствующую требуемой
; |||||||| ; конфигурации (см. ниже) таймера 1
; |||||||+-- "1" - Таймер ВКЛ, "0" - Таймер ВЫКЛ
; ||||||+--- "1" - внеш. такт. сигнал для Таймера 1, "0" - внутр.
; |||||+---- "0" - синхронизация внешн. такт. сигнала, "1" - нет
; ||||+----- биты 3 и 6 - выбор источника для модулей ССР и ЕССР
; |||+------ биты 4 и 5 - устанавливают значение предделителя
; ||+------- .......
; |+-------- биты 3 и 6 - выбор источника для модулей ССР и ЕССР
; +--------- "1" 16-битное чтение Таймеа 3, "0" - 8-битное
MOVWF T3CON ; и загружаем в регистр конфигурации таймера 3
BCF PIR2,TMR3IF ; Сбрасываем флаг прерывания таймера 3
BSF PIE2,TMR3IE ;
RETURN
RETURN
;=============================================================================
; Остановка таймера
;=============================================================================
IR_TIMER_STOP
CLRF T3CON ; сбрасываем регистр конфигурации таймера 3
BCF PIE2,TMR3IE ;
BCF PIR2, TMR3IF ; сбрасываем флаг переполнения таймера 3
RETURN
;=============================================================================
; Форматирование принятых данных
;=============================================================================
IR_DATA_FORMAT
RLNCF IR_ADRES,F
BTFSS IR_COMMAND,7 ; Если в старшем разряде регистра команд НЕ "1"
BCF IR_ADRES,0 ; сбрасываем младший разряд регистра адреса в "0"
BTFSC IR_COMMAND,7 ; Если в старшем разряде регистра команд НЕ "0"
BSF IR_ADRES,0 ; пишем в младший разряд регистра адреса "1"
RRNCF IR_COMMAND,F ;
MOVLW B'00111111' ;
ANDWF IR_ADRES,F ;
MOVLW B'00111111' ;
ANDWF IR_COMMAND,F ;
RETURN
;=============================================================================
;=============================================================================
;=============================================================================
;=============================================================================
Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....
Вне форума
всем бы так научиться расставлять комменты
Вне форума
Вне форума
Вот спасибо!!!
Отредактировано petcheneg (31.05.2007 16:39:31)
Вне форума
Сорри. Ещё вопрос/уточнение, -для какого контроллера код? Спасибо.
Вне форума
Эммм, избыточно насышеный контролллер для требуемых нужд... Вполне достаточно Pic12f5xx или Pic16f(с избытком). Нужны всего 2-3 выходных сигнала. Нужно просто, чтоб замки не щёлкали, когда в другом конце стоянкикто то открывает свою машину. Для контроллера попроще нет кода? Или может средства есть чтоб жтот конвернировать в иной?
Вне форума
Средство называется "даташит". Один из разделов нем называется "INSTRUCTION SET SUMMARY". Сравниваем и меняем...
Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....
Вне форума
Эммм, избыточно насышеный контролллер для требуемых нужд... Вполне достаточно Pic12f5xx или Pic16f(с избытком). Нужны всего 2-3 выходных сигнала. Нужно просто, чтоб замки не щёлкали, когда в другом конце стоянкикто то открывает свою машину. Для контроллера попроще нет кода? Или может средства есть чтоб жтот конвернировать в иной?
Дружище, тебе с такой сигнализацией машину угонят на раз. Криптографически защищенные сигналы и то взламывают, а ты тут про RC5... Ну и плюс обычно в сигналках радиоканал связи с брелком, и ему все равно с какой стороны ты от машины (читай "от антенны") ты "пикаешь" брелком. А приемники ИК ДУ имеют довольно узкую диаграмму направленности, да и берут меня сомнения по поводу работоспособности в жаркий солнечный день.
......There is someone in my head, but it's not me.......
Вне форума
[ Сгенерировано за 0.034 сек, 7 запросов выполнено - Использовано памяти: 649.99 Кбайт (Пик: 700.36 Кбайт) ]