Radiohobby Forum

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

Вы не вошли.

Объявление

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

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

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

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

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

#1 05.07.2008 18:45:44

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

ИК ДУ на PIC12...

Нужна прошивка на asm для ПИК12 ИК приёмника, декодера RC-5 (6,7) реально рабочая. Попадалась как то в руки на ПИК18 но чё-то не вышло ничего, и в ней нет приёма стоп-бита.
Уж давно пытаюсь осилить ДУ но в этом не силён. Хочу повесить ИК на выключатель освещения PIC12F629.

;PIC18..............;Код:
;=============================================================================
; Обработчик пульта, работающего в системе 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
;=============================================================================

Вне форума

#2 05.07.2008 18:54:15

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

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

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

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

Отредактировано Dmitry (05.07.2008 19:02:43)


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

Вне форума

#3 05.07.2008 20:06:12

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

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

О точняк!!! Была статейка что ктото переделал под ПИК 12 как бы его найти или его наработки.
Вот мои наработки, писал давновато, переделывал по несколько раз версии, прогонял в пиксимуляторе вроде окей было, сам сча пытаюсь разобраться а свои творениях. Применял 3-х ногий приёмник, выход вешался напрямую к пику.

;=============================================================================
; Первым делом, определения - портов, битов, ячеек ОЗУ...
;=============================================================================
 list P=12F629
 INCLUDE p12F629.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	;GPIE
#define    IR_INT_FLAG      INTCON,INTF	;GPIF

	#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




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

       	MOVLW   0X00            	 ;Загpузить B'00000000' в pегистp W
		;bcf 	STATUS, RP1
		bsf 	STATUS, RP0	;bank 1
		movlw	b'00000100'
		movwf	TRISIO
		movlw	b'00000000'
		movwf	IOCB		;разреш прерывания '1' по изменению ур. сигнала
		movlw	b'00000000'
		movwf	WPU		;резисторы 1-вкл., 0-откл.
		movlw	b'01001010'
		movwf	OPTION_REG
        	BCF     STATUS,RP0  	;bank 0
		movlw	b'11010000'
		movwf	INTCON

		CLRF	FLAGI	


zacikl	nop
	nop

	goto	zacikl

;Обработчик прерываний
		ORG     0x004


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

	btfss	IR_INT_FLAG
	goto	TMR1_FL

	CALL	IR_EXT_INTERUPT


TMR1_FL
	btfsc	PIR1,TMR1F
	CALL	IR_TIMER_INTERUPT


	retfie









;=============================================================================
;=============================================================================
;=============================================================================
; 
;=============================================================================
; Первая часть процедры - декодирование команды (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            ; Ставим флаг - Принята ИК команда.
	BANK1
    BSF        OPTION_REG,INTEDG    ; Включаем прерывание по ФРОНТУ ;СПАДУ
	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
    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    0xF8
    MOVWF    TMR1H            ; новые значения
    MOVLW    0xE3
    MOVWF    TMR1L            ; в таймер 3
    MOVLW    B'10000001'        ; берем константу, соответствующую требуемой
;              ||||||||      ; конфигурации (см. ниже) таймера 1
;             |||||||+-- "1" - Таймер ВКЛ, "0" - Таймер ВЫКЛ
;             ||||||+--- "1" - внеш. такт. сигнал для Таймера 1, "0" - внутр.
;             |||||+---- "0" - синхронизация внешн. такт. сигнала, "1" - нет
;             ||||+----- биты 3 и 6 - выбор источника для модулей ССР и ЕССР
;             |||+------ биты 4 и 5 - устанавливают значение предделителя
;             ||+-------                     .......
;             |+-------- биты 3 и 6 - выбор источника для модулей ССР и ЕССР
;             +--------- "1" 16-битное чтение Таймеа 3, "0" - 8-битное
    MOVWF    T1CON            ; и загружаем в регистр конфигурации таймера 3
    BCF        PIR1,TMR1F        ; Сбрасываем флаг прерывания таймера 3
	BANK1
    BSF        PIE1,TMR1E        ;
	BANK0
    RETURN
    RETURN
;=============================================================================
; Остановка таймера
;=============================================================================
IR_TIMER_STOP
    CLRF    T1CON            ; сбрасываем регистр конфигурации таймера 3
	BANK1
    BCF        PIE1,TMR1E        ; 
	BANK0
    BCF        PIR1, TMR1F    ; сбрасываем флаг переполнения таймера 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    ;

	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

LED_Mig
		movlw	.10		;количество Миганий =чётное
		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
;=============================================================================

;Подпрограмма записи
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
;*********************************************************************************
;Задержки более 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

Вне форума

#4 05.07.2008 22:31:11

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

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

В чужих кодах разбираться не любитель. Главное в любом процессе - понять идею. Ее уже рассматривали тут:
https://rh.adsh.org.ua/viewtopic.php?pid=24349#p24349
почитайте. В принципе, моя программа декодирования написан именно по алгоритму предложеному Ридико (Liv)


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

Вне форума

#5 06.07.2008 21:47:05

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

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

Согласен с вами. Но вспомнил в чём затык был. Есть недочёт в  декодере которого в вашем наглядном рисунке нет. На втором бите фронта мы дожидаемся только в середине третьего бита в резуьтате вместо приведённых 11бит получим 10 а если таких последовательностей несколько? Или я ошибаюсь.
RC5.jpg

Отредактировано Deman (06.07.2008 21:52:32)

Вне форума

#6 07.07.2008 00:27:00

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

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

Начал читать форум по вашей сылке и возник вопрос, действительно а каки пульты работают по протоколу РЦ5, у меня горизонты написано РЦ7-9 по ним тестил, имеется старый от горизонта416.

Вне форума

#7 07.07.2008 08:19:03

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

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

Ну во первых, РЦ-5 -это 14 бит, а не 11. Ну и про первый бит - он всегда равен "1". ..


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

Вне форума

#8 07.07.2008 08:28:10

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

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

ЗЫ. код мой - из рабочей конструкции, и работает он там нормально.
К рисунку моему - в нем:
-  желтые треугольники - это моменты срабатывания (и направление) внешнего прерывания.
- Зеленые точки - моменты считывания битов команды по окончании отсчета таймера.
- Цифры под синими стрелками - номера битов.
- Цифры мверху - значения битов (данные).


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

Вне форума

#9 07.07.2008 19:57:51

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

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

В структуре декодера я разобрался, вот только IR_DATA_FORMAT чё делает
Я описывал на примере своего рисунка где биты start i toggle стёр.
Так как пульт определить что он РС5, может я не на том тестил.

Отредактировано Deman (07.07.2008 20:03:04)

Вне форума

#10 07.07.2008 20:20:55

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

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

Мы принимаем ЧЕТЫРНАДЦАТЬ бит!!! В итоге имеем первые 2 - стартовые "единицы". Третий бит - toggle. Потом пять бит адреса и шесть бит команды. По окончании приема у нас в регистре IR_COMMAND остается один из битов адреса (младший). Процедура IR_DATA_FORMAT как раз переносит его в регистр IR_ADRES, предварительно сдвинув значени е IR_ADRES, на один бит влево. После этого командой AND сбрасываются в ноль по два старшх бита регистров IR_ADRES, и IR_COMMAND. В итоге в регистре IR_ADRES,остаютс бит toggle и пять битов адреса, а в регистре IR_COMMAND - только 6 бит команды.

Кстати, не торопитесь игнорировать бит toggle - в последствии он еще Вам пригодится...

ЗЫ. Как проверить пульт RC-5 или нет, я не знаю. Может можно посмотреть на сигнал на выходе ИК-приемника....


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

Вне форума

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

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

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

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