Radiohobby Forum

Интернет конференция журнала "Радиохобби"

Вы не вошли.

Объявление

Подписка на новые материалы от Николая Сухова - ролики, схемы, модели, онлайн конференции, консультации, чат.

Внимание! Почта в доменах Яндекс и Mail.ru не будет работать в профилях форумчан, из-за введённых правительством Украины санкций против этих компаний. Всем, кто ранее использовал подобную почту, для сохранения прежней функциональности форума, рекомендуется её поменять.

Огромная просьба, заливать тематические картинки и файлы в личные файловые каталоги на форуме, чтобы они не потерялись, со временем!

Ссылка "Загрузки" находится справа внизу формы набора сообщения.

Подписка на журнал "Радиохобби" прекращена. Подробности. Форум же - продолжает свою работу.

#1 31.05.2007 15:43:42

petcheneg
Новичок
Здесь с 31.05.2007
Сообщений: 7

Сигнализация на PIC-контроллере

Привет всем!
Может кто встречал описание конструкции пультика и декодера на PIC -контроллере. Например, -пультик посылает посылку с кодом, приёмник его проверяет на правильность, и, после этого выдаёт команду, -на запуск двигателя, или, открывание дверей -например. Если где то попадалось описание с листингами, дайте ссылочку. Упор на исключение ложного срабатывания. Зараннее спасибо.

Отредактировано petcheneg (31.05.2007 15:56:02)

Вне форума

#2 31.05.2007 15:57:27

Dmitry
Забанен
Откуда: Запорожье
Здесь с 03.02.2004
Сообщений: 3,105
Сайт

Re: Сигнализация на PIC-контроллере

Берешь пульт 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
;=============================================================================
;=============================================================================
;=============================================================================
;=============================================================================

Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....

Вне форума

#3 31.05.2007 16:06:35

Jaxon
радиолюбовник
Откуда: Николаев
Здесь с 22.01.2004
Сообщений: 3,018

Re: Сигнализация на PIC-контроллере

всем бы так научиться расставлять комменты smile

Вне форума

#4 31.05.2007 16:07:58

Dmitry
Забанен
Откуда: Запорожье
Здесь с 03.02.2004
Сообщений: 3,105
Сайт

Re: Сигнализация на PIC-контроллере

Просили "описание с листингами". Ну не виноват я , что у меня "листинги с описаниями". wink


Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....

Вне форума

#5 31.05.2007 16:38:37

petcheneg
Новичок
Здесь с 31.05.2007
Сообщений: 7

Re: Сигнализация на PIC-контроллере

Вот спасибо!!!

Отредактировано petcheneg (31.05.2007 16:39:31)

Вне форума

#6 31.05.2007 19:13:20

petcheneg
Новичок
Здесь с 31.05.2007
Сообщений: 7

Re: Сигнализация на PIC-контроллере

Сорри. Ещё вопрос/уточнение, -для какого контроллера код? Спасибо.

Вне форума

#7 31.05.2007 19:46:03

Dmitry
Забанен
Откуда: Запорожье
Здесь с 03.02.2004
Сообщений: 3,105
Сайт

Re: Сигнализация на PIC-контроллере

18-го


Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....

Вне форума

#8 01.06.2007 03:05:17

petcheneg
Новичок
Здесь с 31.05.2007
Сообщений: 7

Re: Сигнализация на PIC-контроллере

Эммм, избыточно насышеный контролллер для требуемых нужд... Вполне достаточно Pic12f5xx или Pic16f(с избытком). Нужны всего 2-3 выходных сигнала. Нужно просто, чтоб замки не щёлкали, когда в другом конце стоянкикто то открывает свою машину. Для контроллера попроще нет кода? Или может средства есть чтоб жтот конвернировать в иной?

Вне форума

#9 01.06.2007 07:43:56

Dmitry
Забанен
Откуда: Запорожье
Здесь с 03.02.2004
Сообщений: 3,105
Сайт

Re: Сигнализация на PIC-контроллере

Средство называется "даташит". Один из разделов нем называется "INSTRUCTION SET SUMMARY". Сравниваем и меняем...


Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....

Вне форума

#10 01.06.2007 09:11:41

Матроскин
Ветеран
Откуда: Краснодар
Здесь с 06.02.2006
Сообщений: 2,022

Re: Сигнализация на PIC-контроллере

petcheneg пишет:

Эммм, избыточно насышеный контролллер для требуемых нужд... Вполне достаточно Pic12f5xx или Pic16f(с избытком). Нужны всего 2-3 выходных сигнала. Нужно просто, чтоб замки не щёлкали, когда в другом конце стоянкикто то открывает свою машину. Для контроллера попроще нет кода? Или может средства есть чтоб жтот конвернировать в иной?

Дружище, тебе с такой сигнализацией машину угонят на раз. Криптографически защищенные сигналы и то взламывают, а ты тут про RC5... Ну и плюс обычно в сигналках радиоканал связи с брелком, и ему все равно с какой стороны ты  от машины (читай "от антенны") ты "пикаешь" брелком. А приемники ИК ДУ имеют довольно узкую диаграмму направленности, да и берут меня сомнения по поводу работоспособности в жаркий солнечный день.


......There is someone in my head, but it's not me.......

Вне форума

Сейчас в этой теме пользователей: 0, гостей: 1
[Bot] ClaudeBot

Подвал форума

Под управлением FluxBB
Модифицировал Visman

[ Сгенерировано за 0.032 сек, 7 запросов выполнено - Использовано памяти: 650.17 Кбайт (Пик: 700.54 Кбайт) ]