;RC RX-2B COMPATIBLE DECORDER 2012.05.29 チエックサム CF78 ;PIC 12F629 内臓 4 MHz ;TMR0 ;プリスケーラ 1:8、8μSで 1 カウント、2048 カウントまで、 ロング(1500μS)&ショート(500μS)の判定に使用、750以上でロング ; ;POWER:単3 × 3 4.5V ;INTERNAL OSC, NO-USE INTERNAL PULL-UP ;GP0:OUTPUT 前進 ;GP1:OUTPUT 後退 ;GP2:OUTPUT 右 ;GP3:INPUT ENCODE 入力 ;GP4:OUTPUT 左 ;GP5:OUTPUT ターボ ;---- PROGRAM ---- LIST P=12F629 __CONFIG _MCLRE_OFF &_BODEN_ON &_CPD_OFF &_PWRTE_ON &_WDT_OFF &_CP_OFF &_INTRC_OSC_NOCLKOUT INCLUDE "P12F629.INC" ;REGISTER DEFINITION HLACH EQU 20H ;入力HIGHラッチ SLACH EQU 21H ;前回SHORTパルスラッチ SCNT EQU 22H ;信号パルスカウンタ TMR0CNT EQU 23H ;TMR0 カウンタ値バッファ T05M EQU 25H ;500μs TIMER T5M EQU 26H ; 5ms TIMER T10M EQU 27H ;10ms TIMER T50M EQU 28H ;50ms TIMER ;//////// PROGRAM START //////// ; ORG 00H ;リセット時 GOTO START ORG 04H ;割込み時 BCF GPIO,0 ;前進 BCF GPIO,1 ;後退 BCF GPIO,2 ;右 BCF GPIO,4 ;左 BCF GPIO,5 ;ターボ BCF INTCON,2 ;オーバーフローフラグ リセット RETFIE START CALL INITIAL MAIN ;INPUT チエック BTFSS HLACH,0 ;入力HIGHラッチ=1 THEN SKIP GOTO INPCHK2 BTFSC GPIO,3 ;入力LOW=0 THEN SKIP GOTO MAIN CLRF HLACH ;入力HIGHラッチ リセット MOVF TMR0,W ;TIMER0値読取 MOVWF TMR0CNT ;TIMER0値バッファ MOVLW 00H ; MOVWF TMR0 ;TIMER0 00 からスタート MOVLW 5DH ;93×8=744μs SUBWF TMR0CNT,W ;TIMER0値-(W) BTFSS STATUS,C ;>0 OR =0 C=1 (ロング) THEN SKIP GOTO SHCNT BTFSS SLACH,0 ;前回SHORTパルス=1 THEN SKIP GOTO RSLACH CALL DECODE ;デコード&出力 CLRF TMR0CNT ;TIMER0値バッファ リセット CLRF SLACH ;前回SHORTパルスラッチ リセット CLRF SCNT ;信号パルスカウンタ リセット GOTO MAIN INPCHK2 BTFSS GPIO,3 ;信号 HIGH=1 THEN SKIP GOTO MAIN BSF HLACH,0 ;入力HIGHラッチ セット MOVLW 00H ; MOVWF TMR0 ;TIMER0 00 からスタート GOTO MAIN SHCNT ;SHORTパルス カウント MOVLW 20H ;32×8=256μs SUBWF TMR0CNT,W ;TIMER0値-(W) BTFSS STATUS,C ;>0 ならば C=1 (ショート) THEN SKIP GOTO RTMR0 ;ショートより短いノイズ INCF SCNT,F BSF SLACH,0 ;前回SHORTパルスラッチ CLRF TMR0CNT ;TIMER0値バッファ リセット GOTO MAIN RSLACH CLRF SLACH ;前回SHORTパルスラッチ リセット RTMR0 CLRF TMR0CNT ;TIMER0値バッファ リセット GOTO MAIN ;****SUB ROUTINE**** ;デコード&出力 GP0:前進、GP1:後退、GP2:右、GP4:左、GP5:ターボ DECODE MOVLW 04H ;信号終了コード SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC10 BCF GPIO,0 ;前進 BCF GPIO,1 ;後退 BCF GPIO,2 ;右 BCF GPIO,4 ;左 BCF GPIO,5 ;ターボ RETURN DEC10 ;前進 MOVLW 0AH ;コード10 SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC16 BSF GPIO,0 ;前進 BCF GPIO,1 ;後退 BCF GPIO,2 ;右 BCF GPIO,4 ;左 BCF GPIO,5 ;ターボ RETURN DEC16 ;前進 + ターボ MOVLW 10H ;コード16 SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC22 BSF GPIO,0 ;前進 BCF GPIO,1 ;後退 BCF GPIO,2 ;右 BCF GPIO,4 ;左 BSF GPIO,5 ;ターボ RETURN DEC22 ;ターボ MOVLW 16H ;コード22 SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC28 BCF GPIO,0 ;前進 BCF GPIO,1 ;後退 BCF GPIO,2 ;右 BCF GPIO,4 ;左 BSF GPIO,5 ;ターボ RETURN DEC28 ;前進 & 左 MOVLW 1CH ;コード28 SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC34 BSF GPIO,0 ;前進 BCF GPIO,1 ;後退 BCF GPIO,2 ;右 BSF GPIO,4 ;左 BCF GPIO,5 ;ターボ RETURN DEC34 ;前進 & 右 MOVLW 22H ;コード34 SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC40 BSF GPIO,0 ;前進 BCF GPIO,1 ;後退 BSF GPIO,2 ;右 BCF GPIO,4 ;左 BCF GPIO,5 ;ターボ RETURN DEC40 ;後退 MOVLW 28H ;コード40 SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC46 BCF GPIO,0 ;前進 BSF GPIO,1 ;後退 BCF GPIO,2 ;右 BCF GPIO,4 ;左 BCF GPIO,5 ;ターボ RETURN DEC46 ;後退 & 右 MOVLW 2EH ;コード46 SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC52 BCF GPIO,0 ;前進 BSF GPIO,1 ;後退 BSF GPIO,2 ;右 BCF GPIO,4 ;左 BCF GPIO,5 ;ターボ RETURN DEC52 ;後退 & 左 MOVLW 34H ;コード52 SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC58 BCF GPIO,0 ;前進 BSF GPIO,1 ;後退 BCF GPIO,2 ;右 BSF GPIO,4 ;左 BCF GPIO,5 ;ターボ RETURN DEC58 ;左 MOVLW 3AH ;コード58 SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC64 BCF GPIO,0 ;前進 BCF GPIO,1 ;後退 BCF GPIO,2 ;右 BSF GPIO,4 ;左 BCF GPIO,5 ;ターボ RETURN DEC64 ;右 MOVLW 40H ;コード64 SUBWF SCNT,W ;SCNT値-(W) BTFSS STATUS,Z ;合致=0、Z=1 THEN SKIP GOTO DEC80 ;エラーなので出力を全部OFFしておく BCF GPIO,0 ;前進 BCF GPIO,1 ;後退 BSF GPIO,2 ;右 BCF GPIO,4 ;左 BCF GPIO,5 ;ターボ RETURN DEC80 CLRF SCNT BCF GPIO,0 ;前進 BCF GPIO,1 ;後退 BCF GPIO,2 ;右 BCF GPIO,4 ;左 BCF GPIO,5 ;ターボ RETURN ;****INITIAL ROUTINE**** ; INITIAL BSF STATUS,RP0 ;BANK=1 ;INTERNAL CLOCK AJUSUT DATA SET CALL 3FFH MOVWF OSCCAL ;OSC ADJUST VALUE SET ;OPTION SET MOVLW 82H MOVWF OPTION_REG ;GPPU=1,INTEDG=0,TOCS=0,TOSE=0, PSA=0,PS2=0,PS1=1,PS0=0 ;プルアップなし、GP2立ち下がり、内部クロック、立ち上がり、 TIM0,プリスケーラ 1:8 ;I/O PORT SET CLRF GPIO MOVLW 08H ; X, X, GP5=0,GP4=0, GP3=1,GP2=0,GP1=0,GP0=0 入力=1 MOVWF TRISIO ;WEAK PULL-UP SET ; MOVLW 01H ; X, X, WPU5=0,WPU4=0, X, WPU2=0,WPU1=0,WPU0=0 ; MOVWF WPU BCF STATUS,RP0 ;BANK=0 ;INTCON TMR0 割込み SET MOVLW 0AH ;GIE=1,PEIE=0,T0IE=1,INTE=0, GPIE=0,TOIF,INTF,GPIF MOVWF CMCON ;CMCON SET COMPARATOR不使用 MOVLW 07H ;X,X,X,X, X,CM2=1,CM1=1,CM0=1 MOVWF CMCON ;I/O、レジスタクリア CLRF GPIO ;I/O OFF CLRF HLACH ;入力HIGHラッチ CLRF SLACH ;前回SHORTパルスラッチ CLRF SCNT ;信号パルスカウンタ CLRF TMR0CNT ;TMR0 カウンタ値バッファ RETURN ;**** TIMER FOR 4MHz **** ; ;---- 500 μsec(1.0 μsec*500) ---- TIM05M MOVLW 0A5H ;A5H=165(=500 CYCLE) MOVWF T05M NOP NOP TIM05LP DECFSZ T05M,F ;(T05M)-1=0 THEN SKIP GOTO TIM05LP RETURN ;---- 5 msec(0.5 ms*10) ---- TIM5M MOVLW 0AH ;0AH=10(5.053 mS) MOVWF T5M TIM5LP CALL TIM05M DECFSZ T5M,F GOTO TIM5LP RETURN ;---- 10 msec(0.5 ms*20) ---- TIM10M MOVLW 014H ;014H=20 MOVWF T10M TIM10LP CALL TIM05M DECFSZ T10M,F GOTO TIM10LP RETURN ;---- 50 msec(0.5 ms*100) ---- TIM50M MOVLW 064H ;064H=100 MOVWF T50M TIM50LP CALL TIM05M DECFSZ T50M,F GOTO TIM50LP RETURN END