;---- 1kHz-2kHz Generator ;---- by K.I 020429 LIST P=12C509A INCLUDE P12C509A.INC __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC __IDLOCS H'0100' ;V1.00 ;-------------------------------- TXD EQU 0 ;GP0, O, 送信データ IN0 EQU 1 ;GP1, I, bit0 IN1 EQU 2 ;GP2, I, bit1 TXEN EQU 3 ;GP3, I, /送信イネーブル IN2 EQU 4 ;GP4, I, bit2 IN3 EQU 5 ;GP5, I, bit3 ;-------------------------------- GPIODIR EQU B'00111110' ;GPIO入出力設定 GPIOINI EQU B'00001000' ;GPIO InitValue OPT_INI EQU B'00011100' ;OPTION Init ;-------------------------------- CBLOCK H'08' LOOP_CN ;LOOP counter LOOP_CN2 ;LOOP counter2 WAIT_CN ;WAIT counter WAIT_CN2 ;WAIT counter2 ENDC ;-------------------------------- ;-------------------------------- ORG 0 ;リセット・ベクタ ;-------------------------------- POWERUP GOTO SETUPPORTS SETUPPORTS MOVLW OPT_INI ;WAKE-UP,PULL-UP,1:16 WDT PRESCALER OPTION MOVLW GPIODIR ;Set I/O direction TRIS GPIO MOVLW GPIOINI ;Init I/O data MOVWF GPIO ;-------------------------------- GOTO START ;GP Wake-UpならばStartへ ;-------------------------------------------------------- DT "PIPO_020429 by K.I" ;-------------------------------------------------------- START BTFSC GPIO,TXEN ;/TxEが'H'ならば、スリープへ SLEEP REPEAT CALL SEND_1KHZ ;1kHz信号送信 CALL WAIT_4US CALL SEND_2KHZ ;2kHz信号送信 BTFSC GPIO,TXEN ;/TxEが'H'ならば、FINISHへ GOTO FINISH GOTO REPEAT FINISH SLEEP ;-------------------------------- SEND_1KHZ MOVLW 8 ;1; MOVWF LOOP_CN ;1; SEND1KLOOP0 MOVLW 250 ;1; MOVWF LOOP_CN2 ;1; GOTO $+2 ;2;Skip Wait SEND1KLOOP1 CALL WAIT_6US CALL XOR_TX ;6; CALL WAIT_485US DECFSZ LOOP_CN2,1 ;1; GOTO SEND1KLOOP1 ;2; DECFSZ LOOP_CN,1 ;1; GOTO SEND1KLOOP0 ;2; RETLW 0 ; ;-------------------------------- SEND_2KHZ MOVLW 16 ;1; MOVWF LOOP_CN ;1; SEND2KLOOP0 MOVLW 250 ;1; MOVWF LOOP_CN2 ;1; GOTO $+2 ;2;Skip Wait SEND2KLOOP1 CALL WAIT_6US CALL XOR_TX ;6; CALL WAIT_235US DECFSZ LOOP_CN2,1 ;1; GOTO SEND2KLOOP1 ;2; DECFSZ LOOP_CN,1 ;1; GOTO SEND2KLOOP0 ;2; RETLW 0 ; ;-------------------------------- XOR_TX ;NRZIで送信するために MOVLW 1 ;GP0を反転させる XORWF GPIO,F ;(6US) RETLW 0 ;-------------------------------- WAIT_250MS MOVLW 250 ;1001*250+5+1US=250.256MS WAIT_MS MOVWF WAIT_CN ;1001*CN+5 US WAIT_MS0 MOVLW 249 ;1;249 MOVWF WAIT_CN2 ;1; WAIT_MS1 NOP ;1; DECFSZ WAIT_CN2,1 ;1; GOTO WAIT_MS1 ;2;4usx249 DECFSZ WAIT_CN,1 ;1; GOTO WAIT_MS0 ;2;WAIT_CN*1001us RETLW 0 ;CALL(2)+(1)+(5+4*249)*CN+RET(2)=1001*CN+5US ;-------------------------------- WAIT_485US ;485US遅延(1kHz用) GOTO $+1 ;2; MOVLW 95 ;1; GOTO WAIT_US ;2;2+5*95+5+3=485US WAIT_235US ;235US遅延(2kHz用) GOTO $+1 ;2; MOVLW 45 ;1; GOTO WAIT_US ;2;2+5*45+5+3=235US WAIT_10US GOTO $+1 ;2; GOTO $+1 ;2; WAIT_6US GOTO WAIT_4US ;2; WAIT_101US MOVLW 19 ;5*19+5+1=101US WAIT_US MOVWF WAIT_CN ;1; WAIT_US0 GOTO $+1 ;2; DECFSZ WAIT_CN,1 ;1; GOTO WAIT_US0 ;2;WAIT_CN*5us WAIT_4US RETLW 0 ;2;CALL(2)+(1)+(5)*CN+RET(2)=5*CN+5US ;-------------------------------- END