; FUTABA FP-S3003を動かす(20MHz)(futaba01.asm)
; RCサーボモータはPORTBの1ビット目に接続 2002/06/27(Thu)
LIST P=16F84; アセンブラにPICデバイスの情報を与える
STATUS EQU 3; STATUSレジスタは3番地
RP0 EQU 5; ページ操作ビットは5bit目
PORTB EQU 6; ポートBは6番地
TRISB EQU H'86'; TRISBは86番地
COUNT11 EQU H'10'; 変数
COUNT12 EQU H'11'
COUNTA1 EQU H'12'
COUNTA2 EQU H'13'
COUNTB1 EQU H'14'
COUNTB2 EQU H'15'
COUNT01 EQU H'16'
COUNT02 EQU H'17'
DEG EQU H'18'
CLRF PORTB; PORTBのポートを0にクリア
BSF STATUS,RP0; STATUSの5ビット目を1にする(ページ1に変更)
CLRF TRISB; TRISB=0で、すべてアウトプットに設定
BCF STATUS,RP0; STATUSの5ビット目を0にする(ページ0に変更)
;--------------------------------------------
MOVLW 50; Wレジスタに値をセット(1-99)
;--------------------------------------------
MOVWF DEG; DEGにWレジスタの値をセット
LOOP
BSF PORTB,1; PORTBの1ビット目を1にする
CALL SUB1; SUB1の呼び出し
CALL SUBA; SUBAの呼び出し
BCF PORTB,1; PORTBの1ビット目を0にする
CALL SUBB; SUBBの呼び出し
CALL SUB0; SUB0の呼び出し
GOTO LOOP;
SUB1 ;4X100X5X0.2uSで400uSのループ
MOVLW D'5'; Wレジスタに5をセット
MOVWF COUNT12; COUNT12に5をセット
DLY1 MOVLW D'100'; Wレジスタに100をセット
MOVWF COUNT11; COUNT11に100をセット
DLY11 NOP ; クロック数稼ぎ
DECFSZ COUNT11,1; COUNT11が0になったら次の命令をスキップ
GOTO DLY11; DLY11のループ
DECFSZ COUNT12,1; COUNT12が0になったら次の命令をスキップ
GOTO DLY1; DLY1のループ
RETURN
SUBA ;5X10XDEGX0.2uSで10XDEGuSのループ
MOVF DEG,0; WレジスタにDEGをセット
MOVWF COUNTA2; COUNTA2にDEGをセット
DLYA MOVLW D'10'; Wレジスタに10をセット
MOVWF COUNTA1; COUNTA1に10をセット
DLYA1 GOTO $+1; 次の命令へ(クロック数稼ぎ)
DECFSZ COUNTA1,1; COUNTA1が0になったら次の命令をスキップ
GOTO DLYA1; DLYA1のループ
DECFSZ COUNTA2,1; COUNTA2が0になったら次の命令をスキップ
GOTO DLYA; DLYAのループ
RETURN
SUBB ;5X10X(100-DEG)X0.2uSで角度制御のループ
MOVLW D'100';
MOVWF COUNTB2
MOVF DEG,0; WレジスタにDEGをセット
SUBWF COUNTB2,1; 100-Wレジスタ
DLYB MOVLW D'10'; Wレジスタに10をセット
MOVWF COUNTB1; COUNTB1に10をセット
DLYB1 GOTO $+1; 次の命令へ(クロック数稼ぎ)
DECFSZ COUNTB1,1; COUNTB1が0になったら次の命令をスキップ
GOTO DLYB1; DLYB1のループ
DECFSZ COUNTB2,1; COUNTB2が0になったら次の命令をスキップ
GOTO DLYB; DLYBのループ
RETURN
SUB0 ;4X250X100X0.2uSで20mSのループ
MOVLW D'100'; Wレジスタに100をセット
MOVWF COUNT02; COUNT02に100をセット
DLY0 MOVLW D'250'; Wレジスタに250をセット
MOVWF COUNT01; COUNT01に250をセット
DLY01 NOP; クロック数稼ぎ
DECFSZ COUNT01,1; COUNT01が0になったら次の命令をスキップ
GOTO DLY01; DLY01のループ
DECFSZ COUNT02,1; COUNT02が0になったら次の命令をスキップ
GOTO DLY0; DLY0のループ
RETURN
END; 終了
|