;------------------------------------------------------ ; 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 #include __config 01FC4h #DEFINE CH1 GPIO,0 ; CONNECT WITH TX SWITCH CHANNEL 1 #DEFINE CH2 GPIO,1 ; CONNECT WITH TX SWITCH CHANNEL 2 #DEFINE CH3 GPIO,3 ; CONNECT WITH TX SWITCH CHANNEL 3 #DEFINE IR GPIO,2 ; CONNECT WITH IR LED WITH TRANSISTOR DRIVES #DEFINE TOG_BIT TOGGLE,0 ; TOGLE BIT NOT USE FOR THIS PROJECT #DEFINE CH1_CMD 0X01 ; CHANNEL 1 COMMAND #DEFINE CH2_CMD 0X02 ; CHANNEL 2 COMMAND #DEFINE CH3_CMD 0X03 ; CHANNEL 3 COMMAND 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 BSF STATUS,RP0 CALL 0X3FF MOVWF OSCCAL BCF STATUS,RP0 CALL DEBOUNCE ; MOVLW 0X07 MOVWF CMCON ; MAKE ALL GPIO TO DIGITAL I/O BSF STATUS,RP0 BCF OPTION_REG,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 MOVWF TRISIO BSF IOCB,IOCB0 BSF IOCB,IOCB1 BSF IOCB,IOCB3 BSF INTCON,GPIE BCF STATUS,RP0 BCF INTCON,GIE BCF TOG_BIT ;------------------------------------ ; 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 ;------------------------------------ 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 ; ;====================================== ; 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 LOGIC1 ; 1 CALL LOGIC0 ; 0 CALL LOGIC1 ; 1 CALL LOGIC1 ; 1 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