前へ 目次 次へ
FUTABA FP-S3003を周期的に動かす
 

とりあえず、ソースだけ。

SUB1以降のサブルーチンは前回のものと同じです。

 
FUTABA FP-S3003を1個、周期的に動かすサンプルプログラム(futaba02.asm)
;	FUTABA FP-S3003を周期的に動かす(20MHz)(futaba02.asm)
;	2002/06/27(Thu)

	LIST	P=16F84		;アセンブラにPICデバイスの情報を与える
PCL	EQU	2
STATUS	EQU	3		;STATUSレジスタは3番地
RP0	EQU	5		;ページ操作ビットは5bit目
PORTB	EQU	6		;ポートBは6番地
LOOPT	EQU	10		;ループ数(単位20mS)
TABLEE	EQU	3		;テーブルの要素数
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'
LCOUNT	EQU	H'19'
TCOUNT	EQU	H'20'

	CLRF	PORTB		;PORTBのポートを0にクリア
	BSF	STATUS,RP0	;STATUSの5ビット目を1にする(ページ1に変更)
	CLRF	TRISB		;TRISB=0で、すべてアウトプットに設定
	BCF	STATUS,RP0	;STATUSの5ビット目を0にする(ページ0に変更)

LOOP	MOVLW	0
	MOVWF	TCOUNT

TCNT	MOVF	TCOUNT,0
	CALL	DEGT
	MOVWF	DEG
	MOVLW	LOOPT
	MOVWF	LCOUNT

LCNT	BSF	PORTB,1		;PORTBの1ビット目を1にする
	CALL	SUB1		;SUB1の呼び出し

	CALL	SUBA		;SUBAの呼び出し

	BCF	PORTB,1		;PORTBの1ビット目を0にする
	CALL	SUBB		;SUBBの呼び出し

	CALL	SUB0		;SUB0の呼び出し

	DECFSZ	LCOUNT,1	;LCOUNTが0になったら次の命令をスキップ
	GOTO	LCNT		;LCNTのループ

	INCF	TCOUNT,1	;TCOUNTを+1
	MOVF	TCOUNT,0	;WレジスタにTCOUNTを代入
	SUBLW	TABLEE
	BTFSC	STATUS,0
	GOTO	TCNT		;TCNTのループ

	GOTO	LOOP

DEGT	ADDWF	PCL,1
	RETLW	D'5'
	RETLW	D'50'
	RETLW	D'95'

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/24(Mon)
PICのトップページへ
トップページへ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送