前へ 目次 次へ
FUTABA FP-S3003を動かす
 

注意:

  • RCサーボモータの電源は別に取る。
  • モータ電源のグランドとマイコン電源のグランドはつなげる。

 
FUTABA FP-S3003を1個動かすサンプルプログラム(futaba01.asm)
;	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;			終了
プログラム解説
 
2002/03/20(THu)
PICのトップページへ
トップページへ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送