;************************************************************************* ; IRD-56.ASM 赤外線LED 38KHz発振 M.Mine ; ; ; Program for PIC12F629 ; Clock 12MHz ; ; v1.00 2005-6-28 ; ; ☆赤外線LEDの駆動は、PIC12F629で行う。 ; PIC12F629に、MCLR、CLOCK、制御の3本の信号を送る ; SLEEP動作は、今回省略 ; ;************************************************************************* ; LIST P=12F629, R=DEC ;Target Processor INCLUDE P12F629.INC __config _CP_OFF & _MCLRE_ON & _CPD_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC __idlocs h'0100' ;v1.00 ; ;------------------------------------------------------------------------- ; DEFINE I/O Port ;------------------------------------------------------------------------- ; GPIO ; GP0 IR_LED_DRIVE output ; GP1 IR Drive in input ; GP2 IR_PWR 受信POWER output ; GP3 MCLR input ; GP4 -------- output ; GP5 CLOCK in input IR_LED EQU H'00' ; IR_LED_DRIVE IR_DRV EQU H'01' ; 発振制御入力  (16F876から) IR_PWR EQU H'02' ; IR受信機POWER  ;------------------------------------------------------------------------- ; Variables ;------------------------------------------------------------------------- ;------------------------------------------------------------------------- ; Register ;------------------------------------------------------------------------- REG EQU H'20' ; PIC16F629 R_TIME0 EQU REG+0 R_TIME1 EQU REG+1 ; R_PW0 EQU REG+6 ; Power0 (AA)  (not use) R_PW1 EQU REG+7 ; Power1 (55)   (not use) ; R_A0 EQU REG+8 ; General Reg. R_B0 EQU REG+9 ; General Reg. R_B1 EQU REG+10 ; General Reg. R_C0 EQU REG+11 ; General Reg. R_C1 EQU REG+12 ; General Reg. ; TIMEF1 EQU REG+30 wtemp equ h'58' ; 割り込み処理 コンテキスト保存/復帰用レジスタ statustemp equ h'59' ; 20〜5Fは、BANK切り替え無しで参照可能 fsrtemp equ h'5A' pclathtemp equ h'5B' ; ;------------------------------------------------------------------------- ; Program code ;------------------------------------------------------------------------- ORG 0 ; Reset Vector GOTO START ; ORG 4 ; Interrupt Vector (not use) ; GOTO ISR ;------------------------------------------------------------------------- ; Main Program ;------------------------------------------------------------------------- ORG H'100' START CLRWDT ; WDT=0 (Disable) ; Interrupt Contrl reg. Initialize MOVLW B'00000000' ; 割り込みDISABLE MOVWF INTCON ; ; Option reg. Initialize (BANK1) MOVLW B'01010111' ; 1/256 Pre-scaler (not use) ; BIT_7: ; BIT_6 ; BIT_5: TMR0 Source Internal CLK ; BIT_4: TMR0 Up Edge ; BIT_3: TMR0/WDT (TMR0) ; BIT_2〜0: PreScaler 1/256 BSF STATUS, RP0 ; Set Page1 MOVWF OPTION_REG BCF STATUS, RP0 ; Set Page0 ; ; COMPARATOR MOVLW H'07' ; Digital I/O MOVWF CMCON ; ;----- ;Set I/O Port INPUT/OUTPUT (Direction) CALL PORT_INI ; Port Direction Set ;----- ;Set OUTPUT Port Data MOVLW B'00101010' ; MOVWF GPIO ; ;----- ;Power Test ; (not use) MOVLW H'AA' ; Power Reg.0 SUBWF R_PW0, W BTFSC STATUS, Z GOTO RRE ; if R_PW0='AA' then jump MOVLW H'AA' ; Set R_PW0='AA' (First Power ON) MOVWF R_PW0 ; MOVLW H'55' ; Power Reg.1 SUBWF R_PW1, W BTFSC STATUS, Z GOTO RRE ; if R_PW1='55' then jump MOVLW H'55' ; Set R_PW1='55' (First Power ON) MOVWF R_PW1 ;----- ;Reset Register RRE BSF GPIO, IR_PWR ; IR module POWER ON ; ;******************* ; MAIN PROGRAM ;******************* MAIN BTFSC GPIO, IR_DRV ; 'L': ON GOTO MAIN_E ; CALL P_DLY BSF GPIO, IR_PWR CALL CLK_OUT GOTO MAIN ; MAIN_E BCF GPIO, IR_LED ; IR38KHz Stop CALL P_DLY CALL P_DLY BCF GPIO, IR_PWR ; IR module POWER OFF CALL P_DLY GOTO MAIN ; ;******************* ; Subroutine ;******************* ; ;--- ; PORT Delay for Key Read P_DLY ; 3uS Delay NOP NOP NOP NOP NOP RETURN ; ;----- ; Delay Time count (12MHz CLOCK) ;----- D_0P1 MOVLW d'1' ; 100uS GOTO D_T D_10 ; 10mS MOVLW d'100' GOTO D_T D_3P2 ; 3.2mS MOVLW d'32' GOTO D_T ; D_T MOVWF R_TIME0 D_P100 ; 100uS MOVLW d'100' ; Clock 12MHz MOVWF R_TIME1 D_P003 ; 1uS DECFSZ R_TIME1,F ; 0.33uS (0.66uS) GOTO D_P003 ; 0.66uS DECFSZ R_TIME0,F ; 0.33uS (0.66uS) GOTO D_P100 ; 0.66uS RETURN ; ;----- ; I/O port direction set ; PA4-0: xxx01010 ;----- PORT_INI BSF STATUS, RP0 ; Set Page1 MOVLW B'11101010' ; Port A Direction MOVWF TRISIO BCF STATUS, RP0 ; Set Page0 RETURN ; ;*************************************************** ; CLOCK OUTPUT ; 38KHz CLOCK OUTPUT 26.9uS 1step=0.33uS ; 'H' 10.3uS (30step) 'L' 16.6uS (48step) CLK_OUT BSF GPIO, IR_LED ; 1 (26.3-10.3uS) 'H' CALL UCLK_24 ; 24 Clock NOP ; 1 (25) NOP ; 1 (26) NOP ; 1 (27) NOP ; 1 (28) NOP ; 1 (29) BCF GPIO, IR_LED ; 1 (30 = 10.3uS) CALL UCLK_45 ; 45 Clock ; NOP ; 1 (46) ; NOP ; 1 (47) BTFSS GPIO, IR_DRV ; 1 (48) control in = OFF? GOTO CLK_OUT ; 2 (50 = 16.6uS) RETURN ;--------------------------------------------------- ; Unit Clock Delay UCLK_45 ; 45 Clock MOVLW d'13' ; 1 MOVWF R_C0 ; 1 UCLK_1 DECFSZ R_C0, F ; 1(2) GOTO UCLK_1 ; 2 ; Total Clock 13*3+4=43-1 NOP ; 1 (43) RETURN ; 2 (43+2=45) ; UCLK_24 ; 24 Clock MOVLW d'6' ; 1 MOVWF R_C0 ; 1 UCLK_2 DECFSZ R_C0, F ; 1(2) GOTO UCLK_2 ; 2 ; Total Clock 6*3+4=22-1 NOP ; 1 (22) RETURN ; 2 (22+2=24) ; ;------------- ; wait 50uS w_50us MOVLW D'50' MOVWF TIMEF1 W20US_1 DECFSZ TIMEF1, F ; 0.33us GOTO W20US_1 ; 0.66us RETURN ; ; END