Вы не вошли.
Понятно. Попробуем по новому рассмотреть ДУ может чё и получиться, буду весьма рад и признателен вам по достижению результата.
Вне форума
В РХ 2006 № 6, с. 51 есть статья "Автономный декодер кода RС-5". Требуется микроконтроллер AT90S1200 или AT90S2313 и, естественно, прошить его прилагаемой в статье программой. Возможно пригодится.
Вне форума
Чем дальше в лес тем...
ВОПРОС по 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)
Вне форума
В РХ 2006 № 6, с. 51 есть статья "Автономный декодер кода RС-5". Требуется микроконтроллер AT90S1200 или AT90S2313 и, естественно, прошить его прилагаемой в статье программой. Возможно пригодится.
В asm или hex-не катит. Да и на ПИКе у меня всё имеется от програм до железа.
Отредактировано Deman (08.07.2008 01:01:29)
Вне форума
Начнем с того, что с этой программой (да и вообще с этим алгоритмом), я разбирался года три назад, и сейчас сам вынужден вспоминать все по-новой.
Про всего одно смещение - посмотрите на рисунок, который я привел ранее. В нем нас интересуют только зеленые точки. Это именно считываемый код. В итоге Вы видите, что принятый код немного отличается - сначала ВСЕГО один стартовый бит, потом toggle, потом пять бит адреса, потом шесть бит команды, а потом ОДНА ЛИШНЯЯ единица (всегда). Вот ее-тот мы и теряем сдвигом вправо.
А про то, зачем разделять по отдельным регистрам адрес и команду - это уже как Вам нравится! Мне было удобнее, чтоб было именно так - в одном регистре "чистый" адрес, в другом "чистая" команда - впоследствии я их сравниваю с требующимися значениями, хранящимися в других регистрах или в аккумуляторе безо всяких дополнительных манипуляций...
Отредактировано Dmitry (08.07.2008 08:22:39)
Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....
Вне форума
УРАА получилось. ИК приёмник ДУ 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
Вне форума
Не за что....
Я тут на волне того, что вопросы участились, решил страничку про это декодирование настрочить. Начал было уже, а тут по работе - конец квартала, отчеты в налоговую и пр. Не доделал пока что. Но допишу и выложу у себя на сайте...
Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....
Вне форума
УРАА получилось. ИК приёмник ДУ RC-5 под PIC12F675, открытый код тестился на пульте от Горизонта RC7-9 (на микрухе 3010). Большая благодарность Dmitryю!!!
Вы бы поподробнее о конструкции... и ещё вопрос - почему результат не для PIC12F629?
Вне форума
О, вижу мой код!...
ЗЫ. когдато картинку такую вот нарисовал для "наглядности" понимания.
dmitrykhn.homedns.org/img_fast/IR_sequence.jpg
Это же Манчестер-код. (Самый простой скремблер.)
Вне форума
[ Сгенерировано за 0.035 сек, 7 запросов выполнено - Использовано памяти: 672.66 Кбайт (Пик: 723.02 Кбайт) ]