; RX_EL.ASM エレポン受信機 2006/9/15 ok ; CH1エルロン出力にCH2エレベータの受信データを出力(エレベータと同じ動き) ; 更にCH1レバー位置によりCH1、CH2出力データにCH1データ(センター値から−した値)を±する ; 何CHのTXでもOK ; *2005/10/03 Rx ONの時と36m秒間電波無しでニュウトラルとモーターストップ追加ok ; 2005/08/12 4chrx.asm 完成 ; *ウオッチドックタイマで18ms*32=0.575sec信号なければリセットかかり最初に戻る ; 間違い 18ms* 2=36ms ; *送信信号(LOWレベル)無ければ(HIGHレベル)ニュウトラルで待機する ; 48(1000μS),73(1500μ),96(2000μ),((計測1ループ21μS)) ; スロートルLOW "45" センター "73" ; tokoさんの4チャンネルデコーダーIrxs410.asm (PIC12F629)を改造する ; 出力は2回の平均値 ; GP0: CH1出力(正極性) ; GP1: CH2出力(正極性) ; GP2: CH3出力(正極性) ; GP3: 入力(負極性) ; GP4: CH4出力(正極性) list P=PIC12F629 include "P12F629.INC" ;------------------------------------ ; コンフィギュレーションビットの設定 ;------------------------------------ __CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_ON & _INTRC_OSC_NOCLKOUT ;12F629では20hから64バイトがユーザーエリア #define CENT d'73' gapcnt1 equ 20h gapcnt2 equ 21h CNT2 equ 22h ch1cnt equ 23h ch2cnt equ 24h ch3cnt equ 25h ch4cnt equ 26h ch1val equ 27h ch2val equ 28h ch3val equ 29h ch4val equ 2ah ch1last equ 2bh ch2last equ 2ch ch3last equ 2dh ch4last equ 2eh CNT1 equ 2fh CENTER equ 30h ch1_da equ 31h ch1x equ 32h ch2x equ 33h org 0 bsf STATUS, RP0 ;bank1へ call 3ffh ;内部発振周波数校正値の読み込み movwf OSCCAL ;OCCALレジスタに校正値をセット movlw b'00001000' ;BP3のみ入力GP5:4,2:0を出力に設定 movwf TRISIO ; 32 = 00001101 movlw b'00001001' ;WDTプリスケーラ1:2(18msecx2=36msec) movwf OPTION_REG ;OPTION_REGを設定しない場合の初期値 b'11111111' bcf STATUS, RP0 ;bank0へ clrf GPIO movlw b'00000111' ;GP2:0をデジタルI/Oに設定 movwf CMCON call clr_cnt ;ギャップカウンタークリア movlw CENT ;中立 73 位 movwf CENTER movwf ch1last movwf ch2last movwf ch3last movwf ch4last call nyuu ;サーボニュウトラル位置へ ;-------------------------- ; 送信機から入力パルス待ち ;-------------------------- LP000 BTFSC GPIO, 3 ;GP3入力がLowなら次をスキップ GOTO LP000 ;-------------- ; ギャップ検出 ;-------------- loop btfsc GPIO, 3 ;入力がLowなら次をスキップ goto out_h ;入力がHighならout_hへ movlw d'2' ;wレジスタに2をセット 3.588msec subwf gapcnt2, w ;w = gapcnt2 - w btfss STATUS, C ;STATUSキャリービットが1なら次をスキップ goto lp1 ;gapcnt2 < 2 ならlp1へ call clr_cnt goto keisoku ;ギャップが検出されたのでkeisokuへ lp1 call clr_cnt ;ギャップカウンタークリア goto loop out_h incf gapcnt1, f btfss STATUS, Z ;桁上げが発生したら次をスキップ goto loop incf gapcnt2, f goto loop ;------------- ; メインエンド ;------------- ;-------------------- ; ニュウトラルルーチン ;-------------------- nyuu movlw CENT ;ニュウトラル movwf ch1val movwf ch2val movwf ch4val movlw d'45' ;motor stop movwf ch3val call ch_out ;ニュウトラル出力 call TIME100 return ;-------------------- ; ギャップカウンタークリアルーチン ;-------------------- clr_cnt clrf gapcnt1 clrf gapcnt2 return ;-------------------------------------------- ; 制御幅の計測,計算(2回平均),出力ルーチン ;-------------------------------------------- keisoku CLRWDT ;実行しないと36m秒でウオッチドックタイマでリセットがかかる ;ch1 clrf ch1cnt ;1 k11 incf ch1cnt,f ;1 call TIME10 btfss GPIO,3 ;1 or 2 goto k11 ;2 k12 incf ch1cnt,f ;1 call TIME10 btfsc GPIO,3 ;1,2 goto k12 ;2 ;ch2 clrf ch2cnt ;1 k21 incf ch2cnt,f ;1 call TIME10 btfss GPIO,3 ;1 or 2 goto k21 ;2 k22 incf ch2cnt,f ;1 call TIME10 btfsc GPIO,3 ;1,2 goto k22 ;2 ;ch3 clrf ch3cnt ;1 k31 incf ch3cnt,f ;1 call TIME10 btfss GPIO,3 ;1 or 2 goto k31 ;2 k32 incf ch3cnt,f ;1 call TIME10 btfsc GPIO,3 ;1,2 goto k32 ;2 ;ch4 clrf ch4cnt ;1 k41 incf ch4cnt,f ;1 call TIME10 btfss GPIO,3 ;1 or 2 goto k41 ;2 k42 incf ch4cnt,f ;1 call TIME10 btfsc GPIO,3 ;1,2 goto k42 ;2 ; 制御幅計算(2回分の平均値) ;ch1 movf ch1cnt,W movwf ch1val movf ch1last,W addwf ch1val,F bcf STATUS,C rrf ch1val,F movf ch1val,W movwf ch1last ;ch2 movf ch2cnt,W movwf ch2val movf ch2last,W addwf ch2val,F bcf STATUS,C rrf ch2val,F movf ch2val,W movwf ch2last ;ch3 movf ch3cnt,W movwf ch3val movf ch3last,W addwf ch3val,F bcf STATUS,C rrf ch3val,F movf ch3val,W movwf ch3last ;ch4 movf ch4cnt,W movwf ch4val movf ch4last,W addwf ch4val,F bcf STATUS,C rrf ch4val,F movf ch4val,W movwf ch4last ; エレポン出力計算 subwf f-w, sublw k-w -(W) movlw CENT-1 ;エルロンレバーの位置により3処理区分 subwf ch1val,W btfsc STATUS,C goto CH_HIGH CH_LOW ;ここから(LOW)ch1valCENT+1の場合、更に分ける movlw CENT+1 subwf ch1val,W btfss STATUS,C goto CH_CENTER ;ここから(HIGH)ch1val>CENT+1の処理 movf CENTER,w movwf ch2x movf ch1val,w movwf ch1x ;ch1val taihi movf ch2x,w subwf ch1x,w movwf ch1_da ;ch1val-CENTER→ch1_da movf ch1_da,w movwf ch2x ;ch1_da taihi subwf ch2val,W ;ch2val sonomama movwf ch1val ;ch2val-ch1_da→ch1val movf ch1_da,W addwf ch2val,F ;ch2val+ch1_da→ch2val goto o11 CH_CENTER ;ここから(±2)CENT-1