; 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; 終了
|