Вы не вошли.
Нужна прошивка на 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
;=============================================================================
Вне форума
О, вижу мой код!...
ЗЫ. когдато картинку такую вот нарисовал для "наглядности" понимания.
Отредактировано Dmitry (05.07.2008 19:02:43)
Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....
Вне форума
О точняк!!! Была статейка что ктото переделал под ПИК 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
Вне форума
В чужих кодах разбираться не любитель. Главное в любом процессе - понять идею. Ее уже рассматривали тут:
https://rh.adsh.org.ua/viewtopic.php?pid=24349#p24349
почитайте. В принципе, моя программа декодирования написан именно по алгоритму предложеному Ридико (Liv)
Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....
Вне форума
Согласен с вами. Но вспомнил в чём затык был. Есть недочёт в декодере которого в вашем наглядном рисунке нет. На втором бите фронта мы дожидаемся только в середине третьего бита в резуьтате вместо приведённых 11бит получим 10 а если таких последовательностей несколько? Или я ошибаюсь.
Отредактировано Deman (06.07.2008 21:52:32)
Вне форума
Начал читать форум по вашей сылке и возник вопрос, действительно а каки пульты работают по протоколу РЦ5, у меня горизонты написано РЦ7-9 по ним тестил, имеется старый от горизонта416.
Вне форума
ЗЫ. код мой - из рабочей конструкции, и работает он там нормально.
К рисунку моему - в нем:
- желтые треугольники - это моменты срабатывания (и направление) внешнего прерывания.
- Зеленые точки - моменты считывания битов команды по окончании отсчета таймера.
- Цифры под синими стрелками - номера битов.
- Цифры мверху - значения битов (данные).
Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....
Вне форума
В структуре декодера я разобрался, вот только IR_DATA_FORMAT чё делает
Я описывал на примере своего рисунка где биты start i toggle стёр.
Так как пульт определить что он РС5, может я не на том тестил.
Отредактировано Deman (07.07.2008 20:03:04)
Вне форума
Мы принимаем ЧЕТЫРНАДЦАТЬ бит!!! В итоге имеем первые 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.034 сек, 7 запросов выполнено - Использовано памяти: 704.81 Кбайт (Пик: 755.18 Кбайт) ]