;------------------------------------------------------------------------------ ; Copyright 2005 Koichi Tanaka ; 4チャンネルデコーダー (PIC12F629) ; irxs411.asm ; GP0: CH1出力 2回測定した平均値を出力 ; GP1: CH2出力 2回測定した平均値を出力 ; GP2: CH3出力 2回測定した平均値を出力 ; GP3: 負論理入力 ; GP4: CH4出力 2回測定した平均値を出力 ;------------------------------------------------------------------------------ LIST P=PIC12F629 INCLUDE "P12F629.INC" ;------------------------------------ ; コンフィギュレーションビットの設定 ;------------------------------------ __CONFIG _CPD_OFF & _CP_OFF & _BODEN_ON & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT #DEFINE STKCENT D'33' ;@4MHz 46usec x 33 = 1518usec CH1CNT EQU 20H ;CH1計測カウンタ CH2CNT EQU 21H ;CH2計測カウンタ CH3CNT EQU 22H ;CH3計測カウンタ CH4CNT EQU 23H ;CH4計測カウンタ CH1VAL EQU 24H ;CH1現在値カウンタ CH2VAL EQU 25H ;CH2現在値カウンタ CH3VAL EQU 26H ;CH3現在値カウンタ CH4VAL EQU 27H ;CH4現在値カウンタ CH1LAST EQU 28H ;CH1前回値カウンタ CH2LAST EQU 29H ;CH2前回値カウンタ CH3LAST EQU 2AH ;CH3前回値カウンタ CH4LAST EQU 2BH ;CH4前回値カウンタ GAPCNT EQU 2CH ;ギャップカウンタ LAST EQU 2DH ;直前の入力レベル CHANNEL EQU 2EH ;実行チャンネル TEMP EQU 2FH ;演算用 WCNT3 EQU 30H ;タイマカウンタ ORG 0 START BSF STATUS, RP0 ;bank1 CALL 3FFH MOVWF OSCCAL MOVLW B'00001000' ;08H MOVWF TRISIO MOVLW B'00001000' MOVWF OPTION_REG BCF STATUS, RP0 ;bank0 CLRF GPIO MOVLW B'00000111' ;SET GP<2:0> TO DIGITAL IO MOVWF CMCON CLRF CH1CNT ;CH1カウンタクリア CLRF CH2CNT ;CH2カウンタクリア CLRF CH3CNT ;CH3カウンタクリア CLRF CH4CNT ;CH4カウンタクリア CLRF GAPCNT ;ギャップカウンタクリア CLRF LAST ;LASTをクリア INCF LAST, F ;入力をHに設定 CLRF CHANNEL ;0チャンネルからスタート MOVLW STKCENT MOVWF CH1LAST ;前回のCH1の値にSTKCENT値をセット MOVWF CH2LAST ;前回のCH2の値にSTKCENT値をセット MOVWF CH3LAST ;前回のCH3の値にSTKCENT値をセット MOVWF CH4LAST ;前回のCH4の値にSTKCENT値をセット MOVLW D'1' MOVWF CH1VAL MOVWF CH2VAL MOVWF CH3VAL MOVWF CH4VAL ;-------------------------- ; 送信機から入力パルス待ち ;-------------------------- LP000 BTFSC GPIO, 3 ;GP3入力がLならスキップ GOTO LP000 ;----------------------------------- ; ギャップ検出 (ギャップを42回検出) ;----------------------------------- ; MOVLW D'42' ; MOVWF TEMP ;LP00 MOVLW d'30' ; MOVWF GAPCNT ;GAPCNTに19Hをセット ;LP01 ; BTFSS GPIO, 3 ;GP3入力がHならスキップ ; GOTO LP00 ; CALL W010 ;100μsec待ち ; DECFSZ GAPCNT, F ;GAPCNTが0ならスキップ ; GOTO LP01 ; DECFSZ TEMP, F ;TEMPが0スキップ ; GOTO LP00 ; GOTO LP_IN ;-------------------------- ; パルス入力レベルチェック ;-------------------------- LP_IN BTFSC GPIO, 3 ;0 入力がLならスキップ GOTO IN_H ;1 入力がHならIN_H へ ;------------- ; 入力Lの処理 ;------------- IN_L MOVF LAST, W ;2steps 一つ前の入力レベルをロード BTFSC STATUS, Z ;3steps 一つ前の入力がHならスキップ GOTO CHCHK1 ;4steps パルス立下り検知以外のとき ;---------------------- ; パルス立下り検知処理 ;---------------------- CLRF GAPCNT ;5steps 立下り検出GAPCNTクリア CLRF LAST ;6steps 立下り検出LASTクリア INCF CHANNEL, F ;7steps CHANNELインクリメント GOTO CHCHK ;8 ;------------------------------------ ; 入力パルス検知時のチャンネル別処理 ;------------------------------------ CHCHK MOVF CHANNEL, W ;9steps CHANNEL DATA LOAD ADDWF PCL, F ;10steps PCにWレジスタの値を加算 GOTO CH0 ;11steps CHANNEL=0 GOTO CH1 ;11steps CHANNEL=1 GOTO CH2 ;11steps CHANNEL=2 GOTO CH3 ;11steps CHANNEL=3 GOTO CH4 ;11steps CHANNEL=4 GOTO CH5 ;11steps CHANNEL=5 GOTO CH0 ;11steps CHANNEL=6 GOTO CH0 ;11steps CHANNEL=7 GOTO CH0 ;11steps CHANNEL=8 GOTO CH0 ;11steps CHANNEL=9 ;------------------------------------ ; パルス検知時以外のチャンネル別処理 ;------------------------------------ CHCHK1 NOP ;6step NOP ;7steps NOP ;8steps NOP ;9steps NOP ;10steps NOP ;11steps CHCHK2 MOVF CHANNEL, W ;12steps CHANNEL DATA LOAD ADDWF PCL, F ;13steps GOTO CH200 ;14steps CHANNEL=0 GOTO CH210 ;14steps CHANNEL=1 GOTO CH220 ;14steps CHANNEL=2 GOTO CH230 ;14steps CHANNEL=3 GOTO CH240 ;14steps CHANNEL=4 GOTO CH200 ;14steps CHANNEL=5 GOTO CH200 ;14steps CHANNEL=6 GOTO CH200 ;14steps CHANNEL=7 GOTO CH200 ;14steps CHANNEL=8 GOTO CH200 ;14steps CHANNEL=9 ;----- 0CH 処理 ----- CH0 GOTO $+1 ;13steps ステップ合わせ GOTO $+1 ;15steps GOTO $+1 ;17steps GOTO $+1 ;19steps GOTO $+1 ;21steps GOTO $+1 ;23steps GOTO $+1 ;25steps GOTO $+1 ;27steps GOTO $+1 ;29steps GOTO $+1 ;31steps GOTO $+1 ;33steps GOTO $+1 ;35steps GOTO $+1 ;37steps GOTO $+1 ;39steps GOTO $+1 ;41steps GOTO LP_IN ;43steps ;----- 1CH 処理 ----- CH1 GOTO $+1 ;13steps GOTO $+1 ;15steps GOTO $+1 ;17steps GOTO $+1 ;19steps GOTO $+1 ;21steps GOTO $+1 ;23steps GOTO $+1 ;25steps GOTO $+1 ;27steps GOTO $+1 ;29steps GOTO $+1 ;31steps GOTO $+1 ;33steps GOTO $+1 ;35steps GOTO $+1 ;37steps GOTO $+1 ;39steps NOP ;41steps CLRF CH1CNT ;42steps CH1CNTクリア GOTO LP_IN ;43steps ;---------- ; 2CH 処理 ;---------- CH2 CLRF CH2CNT ;13steps ;----- ここから1CHのパルス幅処理 ----- MOVF CH1CNT, W ;14steps MOVWF CH1VAL ;15 MOVF CH1LAST, W ;16 ADDWF CH1VAL, F ;17 BCF STATUS, C ;18 RRF CH1VAL, F ;19 MOVF CH1VAL, W ;20 MOVWF CH1LAST ;21 GOTO $+1 ;22 GOTO $+1 ;24 GOTO $+1 ;26 GOTO $+1 ;28 GOTO $+1 ;30 GOTO $+1 ;32 GOTO $+1 ;34 GOTO $+1 ;36 GOTO $+1 ;38 GOTO $+1 ;40 BSF GPIO, 0 ;42 GOTO LP_IN ;43 ;----- ジッタ軽減処理 ----- ; movwf TEMP ;15 CH1VAL->TEMP ; movf CH1LAST, W ;16 ; subwf TEMP, F ;17 TEMP-CH1LAST->TEMP ;----- 前回のパルス幅と比較 ----- ; btfss STATUS, C ;18 前回と同じか大ならスキップ ; goto CH1N ;19 前回より小 ;----- 前回のパルス幅より大 ----- ; decf TEMP, W ;20 TEMP-1->W ; btfsc STATUS, Z ;21 0でなければスキップ ; goto CH10 ;22 0なら ; goto CH1SET0 ;23 ; ;CH1N ;----- 前回のパルス幅より小 ----- ; incf TEMP, W ;21 TEMP+1->W ; btfsc STATUS, Z ;22 0でなければスキップ ; goto CH11 ;23 0なら ; goto CH1SET1 ;24 ; ;----- ±1なので前回の値を使う ----- ;CH10 nop ;24 ;CH11 nop ;25 ; goto $+1 ;26 ; goto $+1 ;28 ; goto $+1 ;30 ; goto $+1 ;32 ; goto $+1 ;34 ; goto $+1 ;36 ; nop ;38 ; movf CH1LAST, W ;39 ; movwf CH1VAL ;40 ; BSF GPIO, 0 ;42steps GP0出力H ; goto LP_IN ;43 ;----- 今回の値を前回の値に加算して1/2に ----- CH1SET0 nop ;25 CH1SET1 movf CH1CNT, W ;26 movwf CH1VAL ;27 movf CH1LAST, W ;28 addwf CH1VAL, F ;29 bcf STATUS, C ;30 rrf CH1VAL, F ;31 goto $+1 ;32 goto $+1 ;34 goto $+1 ;36 goto $+1 ;38 goto $+1 ;40 ;----- CH1出力 ----- BSF GPIO, 0 ;42steps GP0出力H goto LP_IN ;43 ;---------- ; 3CH 処理 ;---------- CH3 CLRF CH3CNT ;13steps ;----- ここから2CHのパルス幅処理 ----- MOVF CH2CNT, W ;14steps ;----- ジッタ軽減処理 ----- movwf TEMP ;15 CH2VAL->TEMP movf CH2LAST, W ;16 subwf TEMP, F ;17 TEMP-CH2LAST->TEMP ;----- 前回のパルス幅と比較 ----- btfss STATUS, C ;18 前回と同じか大ならスキップ goto CH2N ;19 前回より小 ;----- 前回のパルス幅より大 ----- decf TEMP, W ;20 TEMP-1->W btfsc STATUS, Z ;21 0でなければスキップ goto CH20 ;22 0なら goto CH2SET0 ;23 CH2N ;----- 前回のパルス幅より小 ----- incf TEMP, W ;21 TEMP+1->W btfsc STATUS, Z ;22 0でなければスキップ goto CH21 ;23 0なら goto CH2SET1 ;24 ;----- ±1なので前回の値を使う ----- CH20 nop ;24 CH21 nop ;25 goto $+1 ;26 goto $+1 ;28 goto $+1 ;30 goto $+1 ;32 goto $+1 ;34 goto $+1 ;36 nop ;38 movf CH2LAST, W ;39 movwf CH2VAL ;40 BSF GPIO, 1 ;42steps GP1出力H goto LP_IN ;43 ;----- 今回の値を前回の値に加算して1/2に ----- CH2SET0 nop ;25 CH2SET1 movf CH2CNT, W ;26 movwf CH2VAL ;27 movf CH2LAST, W ;28 addwf CH2VAL, F ;29 bcf STATUS, C ;30 rrf CH2VAL, F ;31 goto $+1 ;32 goto $+1 ;34 goto $+1 ;36 goto $+1 ;38 goto $+1 ;40 ;----- CH2出力 ----- BSF GPIO, 1 ;42steps GP1出力H goto LP_IN ;43 ;---------- ; 4CH 処理 ;---------- CH4 CLRF CH4CNT ;13steps ;----- ここから3CHのパルス幅処理 ----- MOVF CH3CNT, W ;14steps ;----- ジッタ軽減処理 ----- movwf TEMP ;15 CH3VAL->TEMP movf CH3LAST, W ;16 subwf TEMP, F ;17 TEMP-CH3LAST->TEMP ;----- 前回のパルス幅と比較 ----- btfss STATUS, C ;18 前回と同じか大ならスキップ goto CH3N ;19 前回より小 ;----- 前回のパルス幅より大 ----- decf TEMP, W ;20 TEMP-1->W btfsc STATUS, Z ;21 0でなければスキップ goto CH30 ;22 0なら goto CH3SET0 ;23 CH3N ;----- 前回のパルス幅より小 ----- incf TEMP, W ;21 TEMP+1->W btfsc STATUS, Z ;22 0でなければスキップ goto CH31 ;23 0なら goto CH3SET1 ;24 ;----- ±1なので前回の値を使う ----- CH30 nop ;24 CH31 nop ;25 goto $+1 ;26 goto $+1 ;28 goto $+1 ;30 goto $+1 ;32 goto $+1 ;34 goto $+1 ;36 nop ;38 movf CH3LAST, W ;39 movwf CH3VAL ;40 BSF GPIO, 2 ;42steps GP2出力H goto LP_IN ;43 ;----- 今回の値を前回の値に加算して1/2に ----- CH3SET0 nop ;25 CH3SET1 movf CH3CNT, W ;26 movwf CH3VAL ;27 movf CH3LAST, W ;28 addwf CH3VAL, F ;29 bcf STATUS, C ;30 rrf CH3VAL, F ;31 goto $+1 ;32 goto $+1 ;34 goto $+1 ;36 goto $+1 ;38 goto $+1 ;40 ;----- CH3出力 ----- BSF GPIO, 2 ;42steps GP2出力H goto LP_IN ;43 ;---------- ; 5CH 処理 ;---------- CH5 nop ;13steps ;----- ここから4CHのパルス幅処理 ----- MOVF CH4CNT, W ;14steps ;----- ジッタ軽減処理 ----- movwf TEMP ;15 CH4VAL->TEMP movf CH4LAST, W ;16 subwf TEMP, F ;17 TEMP-CH4LAST->TEMP ;----- 前回のパルス幅と比較 ----- btfss STATUS, C ;18 前回と同じか大ならスキップ goto CH4N ;19 前回より小 ;----- 前回のパルス幅より大 ----- decf TEMP, W ;20 TEMP-1->W btfsc STATUS, Z ;21 0でなければスキップ goto CH40 ;22 0なら goto CH4SET0 ;23 CH4N ;----- 前回のパルス幅より小 ----- incf TEMP, W ;21 TEMP+1->W btfsc STATUS, Z ;22 0でなければスキップ goto CH41 ;23 0なら goto CH4SET1 ;24 ;----- ±1なので前回の値を使う ----- CH40 nop ;24 CH41 nop ;25 goto $+1 ;26 goto $+1 ;28 goto $+1 ;30 goto $+1 ;32 goto $+1 ;34 goto $+1 ;36 nop ;38 movf CH4LAST, W ;39 movwf CH4VAL ;40 BSF GPIO, 4 ;42steps GP4出力H goto LP_IN ;43 ;----- 今回の値を前回の値に加算して1/2に ----- CH4SET0 nop ;25 CH4SET1 movf CH4CNT, W ;26 movwf CH4VAL ;27 movf CH4LAST, W ;28 addwf CH4VAL, F ;29 bcf STATUS, C ;30 rrf CH4VAL, F ;31 goto $+1 ;32 goto $+1 ;34 goto $+1 ;36 goto $+1 ;38 goto $+1 ;40 ;----- CH3出力 ----- BSF GPIO, 4 ;42steps GP4出力H goto LP_IN ;43 ;----- 0CH 処理 ----- CH200 NOP ;18steps GOTO PULSEOUT ;20steps ;----- 1CH 処理 ----- CH210 INCF CH1CNT, F ;16steps GOTO PULSEOUT ;17steps ;----- 2CH 処理 ----- CH220 INCF CH2CNT, F ;16steps GOTO PULSEOUT ;17steps ;----- 3CH 処理 ----- CH230 INCF CH3CNT, F ;16steps GOTO PULSEOUT ;17steps ;----- 4CH 処理 ----- CH240 INCF CH4CNT, f ;16steps GOTO PULSEOUT ;17steps ;----- 5CH 処理 ----- CH250 NOP ;16steps GOTO PULSEOUT ;17steps ;-------------------------------------------------- ; エルロン・エレベータ・スロットル・ラダー出力処理 ;-------------------------------------------------- PULSEOUT DECFSZ CH1VAL, F ;19steps CH1VALが0ならスキップ GOTO PLP11 ;20teps BCF GPIO, 0 ;21steps GP0出力L INCF CH1VAL, F ;22steps 次に備えて1を保存 GOTO PLP12 ;23steps PLP11 NOP ;22steps NOP ;23steps NOP ;24steps PLP12 DECFSZ CH2VAL, F ;25steps CH2VAL0ならスキップ GOTO PLP21 ;26steps BCF GPIO, 1 ;27steps GP1出力Low INCF CH2VAL, F ;28steps 次に備えて1を保存 GOTO PLP22 ;29steps PLP21 NOP ;28steps NOP ;29steps NOP ;30steps PLP22 DECFSZ CH3VAL, F ;31steps GOTO PLP31 ;32steps BCF GPIO, 2 ;33steps GP2出力L INCF CH3VAL, F ;34steps 次に備えて1を保存 GOTO PLP32 ;35steps PLP31 NOP ;34steps NOP ;35steps NOP ;36steps PLP32 DECFSZ CH4VAL, F ;37steps GOTO PLP41 ;38steps BCF GPIO, 4 ;39steps GP4出力L INCF CH4VAL, F ;40steps 次に備えて1を保存 GOTO PLP42 ;41steps PLP41 NOP ;40steps NOP ;41steps NOP ;42steps PLP42 GOTO LP_IN ;43steps ;---------------------------------------------------------- ; 入力がHghの時の処理 ; ここではギャップ検出と信号が途絶えた時の処理を行っている ; 約3msec HighならCHANNELカウンタをクリア ; 約1sec Highなら無信号と判断してSTARTへ ;---------------------------------------------------------- IN_H MOVLW D'1' ;3steps MOVWF LAST ;4steps 入力がHなのでLASTに1をセット MOVLW D'65' ;5steps 46usec loop x 65 = 2,99msec SUBWF GAPCNT, W ;6steps BTFSC STATUS, C ;7steps CLRF CHANNEL ;9steps ギャップ検知CHANNELクリア INCFSZ GAPCNT, F ;9steps オーバーフローならスキップ GOTO CHCHK2 ;10steps CHCHK2ヘ GOTO START ;12steps 初期設定へ ;--------------- ; 100μsec wait ;--------------- W010 MOVLW D'23' MOVWF WCNT3 WL3 NOP DECFSZ WCNT3, F GOTO WL3 NOP NOP NOP RETURN END