;------------------------------------------------------ ; PROJECT : 3 CHANNEL TX IR REMOTE ; CRYSTAL 4 MHz ; MPLAB : 7.11 , Assembly ; RC5 FORMAT @38KHz , 35% DUTY CYCLE ; ADDRESS = 0X0B 0000 1011 you may change ; CH1 = 0X01 ; CH2 = 0X02 ; CH3 = 0X03 ; NOT USE TOGGLE ALWAY = 0 ; WWW.SIXCA.COM ; 4-JULY 2005 ; ; FREE TO USE FOR PERSONAL OR EVEN COMERCIAL PRODUCT ;------------------------------------------------------ list P=12F629 __config 01FC4h ;********* Переменные ************************************ CBLOCK 0x20 ;Начальный адрес блока констант T_Cr ;таймер несущей T_NC ;счетчик количества импульсов в пакете T_0 ;таймер интервала между пакетами LBC ;младший байт посылки MBC ;старший байт посылки ENDC ; ;******** Константы *************************************** Cr1 equ .2 ; длительность 1 несущей Cr0 equ .4 ; длительность 0 несущей NCr equ .32 ; количество импульсов несущей в одном пакете (полбита - 889uS) Sys equ .0 ; номер системы CMD_1 equ .32 ; код команды 1 CMD_2 equ .16 ; код команды 2 CMD_3 equ .33 ; код команды 3 CMD_4 equ .17 ; код команды 4 Status equ 03h ; Регистр выбора банка. GPIO equ 05h ; Регистр управления защелками порта. Cmcon equ 19h ; Регистр Cmcon - компаратора TrisIO equ 05h ; Регистр выбора направления работы выводов порта. INTCON equ 0Bh ; Регистр разрешения(1)/запрета(0) прерываний OSCCAL equ 10h ; Регистр хранения калибровочной константы F equ 1 ; Результат направить в регистр. IOCB equ H'0096' GPIE equ H'0003' GIE equ H'0007' C equ H'0000' IOCB5 equ H'0005' IOCB4 equ H'0004' IOCB3 equ H'0003' IOCB2 equ H'0002' IOCB1 equ H'0001' IOCB0 equ H'0000' #DEFINE CH1 GPIO,2 ; CONNECT WITH TX SWITCH v+ #DEFINE CH2 GPIO,1 ; CONNECT WITH TX SWITCH v- #DEFINE CH3 GPIO,5 ; CONNECT WITH TX SWITCH ch+ #DEFINE CH4 GPIO,4 ; CONNECT WITH TX SWITCH ch- #DEFINE IR GPIO,0 ; CONNECT WITH IR LED WITH TRANSISTOR DRIVES #DEFINE TOG_BIT TOGGLE,0 ; TOGLE BIT NOT USE FOR THIS PROJECT #DEFINE CH1_CMD 0X10 ; CHANNEL 1 COMMAND тут изменить под мои #DEFINE CH2_CMD 0X11 ; CHANNEL 2 COMMAND #DEFINE CH3_CMD 0X20 ; CHANNEL 3 COMMAND #DEFINE CH4_CMD 0X21 ; CHANNEL 3 COMMAND #define Z Status,2 CNT1 EQU 20H CNT2 EQU 21H CNT3 EQU 22H CNT4 EQU 23H TOGGLE EQU 24H CMD EQU 25H ; IR COMMAND BUFFER ORG 000 BCF IR ; может rem нужен BSF Status,5 CALL 0X3FF MOVWF OSCCAL BCF Status,5 ; CALL DEBOUNCE ; bsf Status,5 ; это так где работало было ; Call 3FFh ; Загрузить калибровочную константу в w ; movwf OSCCAL ; ; MOVLW 0X07 MOVWF Cmcon ; MAKE ALL GPIO TO DIGITAL I/O BSF Status,5 BCF 0x01,7 ; ENABLE WEAK PULL-UP ; BCF WPU,2 ; DISABLE WEAK PULL-UP FOR GPIO2 там кварц висел ; MOVLW B'00001011' ; GPIO<0,1,3> = INPUT , GPIO 2 = OUTPUT movlw .62 ;Записать конфигурацию GPIO в аккумулятор (W) .62=00 111110 GP0 - выход, остальные - входы MOVWF TrisIO BSF IOCB,IOCB1 ; свои понаставил порты входа BSF IOCB,IOCB2 BSF IOCB,IOCB4 BSF IOCB,IOCB5 BSF INTCON,GPIE BCF Status,5 BCF INTCON,GIE BCF TOG_BIT ;------------------------------------ ; от сюда (line114) ; MAIN LOOP MAIN: SLEEP ; GOTO SLEEP MODE(I a sleepy! and need to save my energy) BTFSS CH1 GOTO DO_CH1 BTFSS CH2 GOTO DO_CH2 BTFSS CH3 GOTO DO_CH3 GOTO MAIN GOTO DO_CH4 ; добавил 4й порт входа MOVF GPIO,W ;ПЕРЕД СЛИПОМ ПРОЧИТАТЬ ПОРТ ; while (GPIObits.GP2 == 1) ;ВЫЧИСЛЕНИЕ НАЖАТА ЛИ КНОПКА (вместо ****) BTFSS Z SLEEP ;ЕСЛИ НЕ НАЖАТО ТО В СПЯЧКУ GOTO MAIN ; до сюда (line 133) ;------------------------------------ DO_CH1: CALL DEBOUNCE BTFSC CH1 GOTO MAIN MOVLW CH1_CMD ; LOAD COMMANE FOR CHANNEL 1 MOVWF CMD CALL SEND_RC5 ; BTFSS CH1 GOTO $-1 ; WAIT FOR SWITCH RELEASED ; CALL DEBOUNCE ; DELAY AFTER SWITCH RELEASED GOTO MAIN ;------------------------------------ DO_CH2: CALL DEBOUNCE BTFSC CH2 GOTO MAIN MOVLW CH2_CMD ; LOAD COMMANE FOR CHANNEL 1 MOVWF CMD CALL SEND_RC5 ; BTFSS CH2 GOTO $-1 ; WAIT FOR SWITCH RELEASED ; CALL DEBOUNCE ; DELAY AFTER SWITCH RELEASED GOTO MAIN ; ;------------------------------------ DO_CH3: CALL DEBOUNCE BTFSC CH3 GOTO MAIN MOVLW CH3_CMD ; LOAD COMMANE FOR CHANNEL 1 MOVWF CMD CALL SEND_RC5 ; BTFSS CH3 GOTO $-1 ; WAIT FOR SWITCH RELEASED ; CALL DEBOUNCE ; DELAY AFTER SWITCH RELEASED GOTO MAIN ; DO_CH4: CALL DEBOUNCE ; добавленная вся зона кнопы как вверху тока ch4 BTFSC CH4 GOTO MAIN MOVLW CH4_CMD ; LOAD COMMANE FOR CHANNEL 1 MOVWF CMD CALL SEND_RC5 ; BTFSS CH4 GOTO $-1 ; WAIT FOR SWITCH RELEASED ; CALL DEBOUNCE ; DELAY AFTER SWITCH RELEASED GOTO MAIN ; ;====================================== ; SEND LOGIC 0 ;====================================== LOGIC0: MOVLW .32 ; 1 MOVWF CNT1 ; 1 ; LOG0_1: BSF IR ; 1 MAKE IR HIGH 35% Duty cycle = 9 uS GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 ; ;=================================== BCF IR ; 1 MAKE IR LOW 17 uS GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 NOP ; 1 ; DECFSZ CNT1,F ; 1/2 GOTO LOG0_1 ; 2 26 uS ; CALL DELAY_OFF RETURN ; 2 ; ;====================================== ; SEND LOGIC 1 ;====================================== LOGIC1: CALL DELAY_OFF ; DELAY 899 uS MOVLW .32 ; 1 MOVWF CNT1 ; 1 ; LOG1_1: BSF IR ; 1 MAKE IR HIGH 35% Duty cycle = 9 uS GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 ; ;=================================== BCF IR ; 1 MAKE IR LOW 17 uS GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 GOTO $+1 NOP ; 1 ; DECFSZ CNT1,F ; 1/2 GOTO LOG1_1 ; 2 ; RETURN ; 2 ; ;====================================== ; DELAY FOR NO CARRAIR ; DELAY ABOUT 835 uS ;====================================== DELAY_OFF: MOVLW 5 ; 1 MOVWF CNT3 ; 1 MOVLW .54 ; 1 MOVWF CNT4 ; 1 DECFSZ CNT4,F ; 1/2 GOTO $-1 ; 2 DECFSZ CNT3,F ; 1/2 GOTO $-5 ; 2 RETURN ; 2 ;====================================== ; SEND RC5 TO REMOTE ; INPUT : CMD (6 BIT IR COMMAND) ;====================================== SEND_RC5: ; SEND 2 START BIT CALL LOGIC1 CALL LOGIC1 ; SEND TOGGLE BIT BTFSS TOG_BIT GOTO $+3 CALL LOGIC1 GOTO $+2 CALL LOGIC0 ; SEND ADDRESS 5 BIT FIX AT 01011 (0X0B) IT MAY BE CHANGED BY YOU CALL LOGIC0 ; 0 MSB FIRST BIT 4 CALL LOGIC0 ; 0 тут я нули поставил везде CALL LOGIC0 ; 0 CALL LOGIC0 ; 0 CALL LOGIC0 ; 0 LSB BIT 0 ; ; SEND COMMAND 6 BIT(00HH LLLL) MSB FIRST BCF Status,C RLF CMD,F ; AFTER FIRST ROTAGE 0HHL LLL0 RLF CMD,F ; AFTER SECOND ROTAGE HHLL LL00 ; MOVLW 6 MOVWF CNT2 ; RLF CMD,F ; SEND MSB FIRST BTFSS Status,C GOTO $+3 CALL LOGIC1 GOTO $+2 ; CALL LOGIC0 DECFSZ CNT2,F GOTO $-7 ; RETLW 0 ; ;====================================== ; DEBOUNCE SWITCH ; DELAY 15 mS ;====================================== DEBOUNCE: MOVLW .1 ; 1 MOVWF CNT1 ; 1 DEL_1: MOVLW .20 MOVWF CNT2 ; 1 DEL_2: CLRF CNT3 ; 1 DEL_3: DECFSZ CNT3,F ; 1/2 GOTO DEL_3 ; 2 DECFSZ CNT2,F ; 1/2 GOTO DEL_2 ; 2 DECFSZ CNT1,F ; 1/2 GOTO DEL_1 ; 2 RETLW 0 ; 2 END