Radiohobby Forum

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

Вы не вошли.

Объявление

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

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

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

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

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

#11 07.07.2008 21:48:17

Deman
Новичок
Здесь с 04.07.2008
Сообщений: 12

Re: ИК ДУ на PIC12...

Понятно. Попробуем по новому рассмотреть ДУ может чё и получиться, буду весьма рад и признателен вам по достижению результата.

Вне форума

#12 07.07.2008 23:22:13

Sergej_P
Участник
Откуда: Украина
Здесь с 25.01.2007
Сообщений: 272

Re: ИК ДУ на PIC12...

В РХ 2006 № 6, с. 51 есть статья "Автономный декодер кода RС-5". Требуется микроконтроллер AT90S1200 или AT90S2313 и, естественно, прошить его прилагаемой в статье программой. Возможно пригодится.

Вне форума

#13 08.07.2008 00:53:09

Deman
Новичок
Здесь с 04.07.2008
Сообщений: 12

Re: ИК ДУ на PIC12...

Чем дальше в лес тем...
ВОПРОС по IR_DATA_FORMAT,
1)зачем нам из регистра команд выводить биты адреса и так пойдёт по идее
2)вобще-то в регистре команд остаётся два бита адреса (а в регистре адреса 1бит-toggle, 2-start и 3бита адреса)+8=14
3)а команда RRNCF IR_COMMAND,F ; смещая убивает один бит команды.
Ну а так 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

Отредактировано Deman (08.07.2008 00:54:11)

Вне форума

#14 08.07.2008 00:59:48

Deman
Новичок
Здесь с 04.07.2008
Сообщений: 12

Re: ИК ДУ на PIC12...

Slon пишет:

В РХ 2006 № 6, с. 51 есть статья "Автономный декодер кода RС-5". Требуется микроконтроллер AT90S1200 или AT90S2313 и, естественно, прошить его прилагаемой в статье программой. Возможно пригодится.

В asm или hex-не катит. Да и на ПИКе у меня всё имеется от програм до железа.

Отредактировано Deman (08.07.2008 01:01:29)

Вне форума

#15 08.07.2008 08:20:53

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

Re: ИК ДУ на PIC12...

Начнем с того, что с этой программой (да и вообще с этим алгоритмом), я разбирался года три назад, и сейчас сам вынужден вспоминать все по-новой.

Про всего одно смещение - посмотрите на рисунок, который я привел ранее. В нем нас интересуют только зеленые точки. Это именно считываемый код. В итоге Вы видите, что принятый код немного отличается - сначала ВСЕГО один стартовый бит, потом toggle, потом пять бит адреса, потом шесть бит команды, а потом ОДНА ЛИШНЯЯ единица (всегда). Вот ее-тот мы и теряем сдвигом вправо.

А про то, зачем разделять по отдельным регистрам адрес и команду - это уже как Вам нравится! Мне было удобнее, чтоб было именно так - в одном регистре "чистый" адрес, в другом "чистая" команда - впоследствии я их сравниваю с требующимися значениями, хранящимися в других регистрах или в аккумуляторе безо всяких дополнительных манипуляций...

Отредактировано Dmitry (08.07.2008 08:22:39)


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

Вне форума

#16 18.07.2008 00:00:49

Deman
Новичок
Здесь с 04.07.2008
Сообщений: 12

Re: ИК ДУ на PIC12...

УРАА получилось. ИК приёмник ДУ RC-5 под PIC12F675, открытый код тестился на пульте от Горизонта RC7-9 (на микрухе 3010). Большая благодарность Dmitryю!!!

;PIC12..............;Код:
;=============================================================================
; Обработчик пульта, работающего в системе RC-5.Состоит из двух частей. 
; Первая - декодер, принимающий посылку - прием 14 бит, детектирование ошибок.
; Вторая - анализ - соответствие адреса, проверка бита повтора и т.д.
;=============================================================================
; Первым делом, определения - портов, битов, ячеек ОЗУ...
;=============================================================================
 list P=12F675
 INCLUDE p12F675.INC

	__config 0x3F84

	;__CONFIG   _CP_OFF & _WDT_ON & _MCLRE_OFF & _IntRC_OSC


;#define SIRENA	 	GPIO,1
#define LED	 	GPIO,0
#define IR_INPUT	GPIO,2
;#define REC	 	GPIO,4	;PORTB,4


;IR_TIMER    EQU    TMR3H

#define    IR_INT_ENABLE    INTCON,INTE	;разреш преры
#define    IR_INT_FLAG      INTCON,INTF	;флаг преры

#DEFINE BANK0   BCF STATUS,RP0
#DEFINE BANK1   BSF STATUS,RP0
;***** VARIABLE DEFINITIONS


; ячейки ОЗУ
 cblock	0x20
reg0	;equ	0x14	;reg7...reg0
reg1	;equ	0x15
reg2	;equ	0x16
reg3	;equ	0x17
reg4	;equ	0x18
reg5	;equ	0x19
reg6	;equ	0x1a
reg7	;equ	0x1b

del0	;equ	0x0f
del1	;equ	0x10
cobit	;equ	0x11

coreg	;equ	0x1c
cob	;equ	0x1d
intfl	;equ	0x1e
FLAGI
TM1    		;Задержка
TM2    		;Задержка
TM3    		;Задержка
TM5    		;Задержка
IR_ADRES
IR_COMMAND
IR_COUNT
;IR_FLAG
 endc
;**********************************************************************
		ORG     0x000             ; processor reset vector
		goto	main
;Обработчик прерываний
		ORG     0x004

	;movf	IR_INPUT	;чтение ИК для исключения несоответствия

	btfss	PIR1,TMR1IF
	goto	INT_FL

	CALL	IR_TIMER_INTERUPT

INT_FL
	btfsc	IR_INT_FLAG
	CALL	IR_EXT_INTERUPT

	retfie

main
		BANK0
        BCF	INTCON,GIE	 ;Запрет всех прерываний
	
		movlw	b'00000111'
		movwf	CMCON		;компараторы не используются

       	MOVLW   0X00            	 ;Загpузить B'00000000' в pегистp W
	BANK1   
		movlw	b'00000110'
		movwf	TRISIO
		movlw	b'00000000'
		movwf	IOCB		;разреш прерывания '1' по изменению ур. сигнала
		movlw	b'00000010'
		movwf	WPU		;резисторы 1-вкл., 0-откл.
		movlw	b'00000000'
		movwf	OPTION_REG
		clrf	ANSEL		;для 12f675 ;
      BANK0
		clrf	ADCON0	;откл. АЦП для 12f675 ;

		call	CYCLE_PREPARE
        movlw	b'11010000'
;		 	||||||||      ; конфигурации (см. ниже) INTCON
;                 |||||||+-- "0" - флаг прерыв от измен сигн GPIO
;                 ||||||+--- "0" - флаг внешн прерыв
;                 |||||+---- "0" - флаг прерыв от TMR0
;                 ||||+----- "1" - разреш прерыв от измен сигн GPIO
;                 |||+------ "1" - разреш внешн прерыв
;                 ||+------- "0" - нет прерыв от TMR0
;                 |+-------- "1" - разреш прерыв от переф модулей
;                 +--------- "1" - глоб разреш прерыв
		movwf	INTCON

		;CLRF	FLAGI	


zacikl	nop
	nop

	goto	zacikl











;=============================================================================
;=============================================================================
;=============================================================================
; 
;=============================================================================
; Первая часть процедры - декодирование команды (14 бит). Процедура работает
; по двум прерываниям - внешнему от входа, к которому подкючен ИК-приемник,
; и таймера. 
;=============================================================================
; При срабатывании внешнего прерывания делаем две вещи - снимаем его флаг и 
; перезапускаем таймер. Таймер настроен на длительность, равную 3/4 периода
; одной посылки кода RC-5. 
; Кстати, срабатывание прерывания таймера в то время, когда ожидается внешнее
; прерывание - ошибка...
;=============================================================================
IR_EXT_INTERUPT
    CALL    IR_TIMER_STOP    ; Останавливаем таймер 1
    CALL    IR_TIMER_START    ; Запускаем таймер 1
    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
    RLF    IR_ADRES,f        ; Сдвигаем регистр адреса влево БЕЗ переноса
    RLF    IR_COMMAND,f        ; Сдвигаем регистр комманды влево через С
    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

    BTFSC    STATUS,C        ; Проверяем бит переноса, если равен "1"
    BSF        IR_ADRES,0        ; пишем "1" в младший разряд регистра адреса.
    BTFSS    STATUS,C        ; Проверяем бит переноса, если равен "0"
    BCF        IR_ADRES,0        ; пишем "0" в младший разряд регистра адреса.
    DECFSZ    IR_COUNT,F        ; Уменьшаем счетчик принятых бит и проверяем.
	GOTO	SHIFT_BITS 
    GOTO    CMD_RECEIVED    ; Если получили "0" (приняты все 14 бит посылки),
                            ; уходим по метке дальше
SHIFT_BITS
    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            ; Ставим флаг - Принята ИК команда.
	BANK1
    BCF        OPTION_REG,INTEDG    ; Включаем прерывание по BSF-ФРОНТУ ;СПАДУ
	BANK0
    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
    clrf	IR_ADRES
    clrf	IR_COMMAND
    MOVLW    D'14'            ; Ложим 14 (число бит, которое нужно принять)
    MOVWF    IR_COUNT        ; в регистр счетчика бит.

    RETURN
;=============================================================================
; Процедура включает внешнее прерывание и выбирает повод его срабатыания 
; (фронт или спад) в зависимости от значения (ноль или единица) послежнего 
; принятого бита.
;=============================================================================
IR_EXT_INT_REENABLE
    BTFSC    IR_COMMAND,0    ; Ксли последний принятый бит - ноль, то
	goto	spad
	BANK1
    BSF        OPTION_REG,INTEDG    ; включаем внешнее прерывание по ФРОНТУ
	BANK0
	goto	dal
spad
	BANK1
    BCF        OPTION_REG,INTEDG    ; включаем прерывание по СПАДУ
	BANK0
dal
    BCF        IR_INT_FLAG        ; Сбрасываем флаг внешнего прерывания
    BSF        IR_INT_ENABLE    ; Разрешаем внешнее прерывание
    RETURN

;=============================================================================
; Запуск таймера
;=============================================================================
IR_TIMER_START
    MOVLW    .249	;0xF8	;.250
    MOVWF    TMR1H            ; новые значения
    MOVLW    .250	;0xE3	;.200
    MOVWF    TMR1L            ; в таймер 1
    MOVLW    B'00000001'        ; берем константу, соответствующую требуемой
;              ||||||||      ; конфигурации (см. ниже) таймера 1
;              |||||||+-- "1" - Таймер ВКЛ, "0" - Таймер ВЫКЛ
;              ||||||+--- "1" - внеш. такт. сигнал для Таймера 1, "0" - внутр.
;              |||||+---- "0" - синхронизация внешн. такт. сигнала, "1" - нет
;              ||||+----- 
;              |||+------ биты 4 и 5 - устанавливают значение предделителя
;              ||+-------                     .......
;              |+-------- 
;              +--------- 
    MOVWF    T1CON            ; и загружаем в регистр конфигурации таймера 3
    BCF        PIR1,TMR1IF        ; Сбрасываем флаг прерывания таймера 3
	BANK1
    BSF        PIE1,TMR1IE        ;
	BANK0
    RETURN
    RETURN
;=============================================================================
; Остановка таймера
;=============================================================================
IR_TIMER_STOP
    CLRF    T1CON            ; сбрасываем регистр конфигурации таймера 1
	BANK1
    BCF        PIE1,TMR1IE        ;Запрет прерыв от таймера 
	BANK0
    BCF        PIR1, TMR1IF    ; сбрасываем флаг переполнения таймера 1
    RETURN
;=============================================================================
; Форматирование принятых данных
;Мы принимаем ЧЕТЫРНАДЦАТЬ бит!!! В итоге имеем первые 2 - стартовые "единицы". Третий бит - toggle. Потом пять бит адреса и шесть бит команды. По окончании приема у нас в регистре IR_COMMAND остается один из битов адреса (младший). Процедура IR_DATA_FORMAT как раз переносит его в регистр IR_ADRES, предварительно сдвинув значени е IR_ADRES, на один бит влево. После этого командой AND сбрасываются в ноль по два старшх бита регистров IR_ADRES, и IR_COMMAND. В итоге в регистре IR_ADRES,остаютс бит toggle и пять битов адреса, а в регистре IR_COMMAND - только 6 бит команды.
;=============================================================================
IR_DATA_FORMAT    
    ;RLF    IR_ADRES,F
    ;BTFSS    IR_COMMAND,7    ; Если в старшем разряде регистра команд НЕ "1"
    ;BCF        IR_ADRES,0        ; сбрасываем младший разряд регистра адреса в "0"
    ;BTFSC    IR_COMMAND,7    ; Если в старшем разряде регистра команд НЕ "0"
    ;BSF        IR_ADRES,0        ; пишем в младший разряд регистра адреса "1"
    ;RRF    IR_COMMAND,F    ; 
    ;MOVLW    B'00111111'        ; 
    ;ANDWF    IR_ADRES,F        ; 
    ;MOVLW    B'00111111'        ; 
    ;ANDWF    IR_COMMAND,F    ;
;=============================================================================
	BTFSC	GPIO,1
	goto	SRAVN	;Чтение из памяти и сравнение
;Запись в память команды
	BANK1
	MOVLW	.0
	MOVWF	EEADR
	BANK0
	MOVF	IR_ADRES,W
	CALL	WRITE_EE

	BANK1
	MOVLW	.1
	MOVWF	EEADR
	BANK0
	MOVF	IR_COMMAND,W
	CALL	WRITE_EE

		bsf	LED		;вкл
LED_Mig
		movlw	.7		;количество Миганий =нечётное
		movwf	TM5		;
LED_M		MOVLW	.3
		call	Delay
		btfss	LED
		goto	VKLL
OTKL		bcf	LED		;откл
		goto	LED_N
VKLL		bsf	LED		;вкл
LED_N		DECFSZ	TM5,f
		goto	LED_M
	return

    RETURN
;=============================================================================
SRAVN
	MOVLW	.0
	CALL	READ_EE
	SUBWF	IR_ADRES,f
	btfss	STATUS,Z
	return

	MOVLW	.1
	CALL	READ_EE
	SUBWF	IR_COMMAND,f
	btfss	STATUS,Z
	return

	bsf	LED		;вкл

		movlw	.10		;количество Миганий =чётное
		movwf	TM5		;
LED_M1		MOVLW	.2
		call	Delay
		btfss	LED
		goto	VKLL1
OTKL1		bcf	LED		;откл
		goto	LED_N1
VKLL1		bsf	LED		;вкл
LED_N1		DECFSZ	TM5,f
		goto	LED_M1
	return

    RETURN

;=============================================================================

;Подпрограмма записи
WRITE_EE
	BCF 	INTCON,GIE 		;Запрещение всех прерываний
	BSF	STATUS,RP0
	MOVWF	EEDATA		;;Занесение в регистр данных
	BSF	EECON1,WREN
	MOVLW 	0X55
	MOVWF 	EECON2
	MOVLW 	0XAA
	MOVWF 	EECON2
	BSF 	EECON1,WR
eewrts	NOP
	BTFSC	EECON1,WR
	GOTO	eewrts
	BCF	EECON1,WREN
	;BCF	PIR1,EEIF
	BCF	STATUS,RP0
	RETURN
;===========================================================
;Подпрограмма чтения из EEPROM
;-----------------------------------------------------------
READ_EE
	BCF 	INTCON,GIE 		;Запрещение всех прерываний
	bsf	STATUS,RP0		;Банк 1
	MOVWF	EEADR			;Адреса
	BSF 	EECON1,RD  		;Команда на чтение EEROM
	MOVF	EEDATA,w		;Данные
	bcf	STATUS,RP0		;Банк 0
	BSF 	INTCON,GIE 		;Разрешен всех прерываний
	return

;*********************************************************************************
;Задержки более TM3*260=...млсек
;*********************************************************************************
Delay
	MOVWF	TM3
D_05	
	decfsz	TM1,F
	goto	D_05
	clrwdt
	decfsz	TM2,F
	goto	D_05
	decfsz	TM3,F
	goto	D_05
	
	return
;=============================================================================
;=============================================================================
;=============================================================================
	end

Вне форума

#17 18.07.2008 00:53:25

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

Re: ИК ДУ на PIC12...

Не за что....

Я тут на волне того, что вопросы участились, решил страничку про это декодирование настрочить. Начал было уже, а тут по работе - конец квартала, отчеты в налоговую и пр. Не доделал пока что. Но допишу и выложу у себя на сайте...


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

Вне форума

#18 18.07.2008 23:26:22

booster©
Участник
Здесь с 14.04.2007
Сообщений: 60
Сайт

Re: ИК ДУ на PIC12...

Deman пишет:

УРАА получилось. ИК приёмник ДУ RC-5 под PIC12F675, открытый код тестился на пульте от Горизонта RC7-9 (на микрухе 3010). Большая благодарность Dmitryю!!!

Вы бы поподробнее о конструкции... и ещё вопрос - почему результат не для PIC12F629?

Вне форума

#19 02.08.2008 23:53:19

Instruktor
Новичок
Здесь с 01.08.2008
Сообщений: 16

Re: ИК ДУ на PIC12...

Dmitry пишет:

О, вижу мой код!...

ЗЫ. когдато картинку такую вот нарисовал для "наглядности" понимания.
dmitrykhn.homedns.org/img_fast/IR_sequence.jpg

Это же Манчестер-код. (Самый простой скремблер.)

Вне форума

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

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

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

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