;マグネットアクチェータードライバ
Ver. 0.3 MAGDRV03.ASM |
;1450μsec
以下のパルスで左出力、1550μsec 以上で右出力 |
;PIC16F84A @4MHz |
|
|
LIST P=PIC16F84A |
|
INCLUDE "P16F84A.INC" |
|
__CONFIG _HS_OSC & _PWRTE_ON
& _CP_OFF & WDT_OFF |
|
|
|
|
CNT020 |
EQU |
0CH |
;20μsec timer use |
CNT050 |
EQU |
0DH |
;50μsec |
CNT100 |
EQU |
0EH |
;100μsec |
CNT1400 |
EQU |
0FH |
:1400μsec |
CNT1600 |
EQU |
11H |
;1600μsec |
|
|
|
|
|
ORG |
0 |
|
|
|
|
|
MAIN |
|
|
|
|
BSF |
STATUS,RP0 |
;バンク 1 に切替え |
|
CLRF |
TRISB |
;ポート B をすべて出力にセット |
|
BCF |
STATUS,RP0 |
;バンク 0 に戻る |
|
MOVLW |
B'00000000' |
;RB0-RB7 Low set |
|
MOVWF |
TRISB |
|
|
MOVLW |
0H |
|
|
MOVWF |
CNT1400 |
;CNT1400 RESET |
|
MOVWF |
CNT1600 |
;CNT1600 RESET |
|
|
|
|
;メインループ |
LOOP |
|
|
|
TP1 |
BTFSC |
PORTA,4 |
;RA4 が Low
の場合次の命令をスキップ |
|
GOTO |
TP1 |
|
|
|
|
|
TP2 |
BTFSS |
PORTA,4 |
;RA4 が High
の場合次の命令をスキップ |
|
GOTO |
TP2 |
|
|
|
|
|
TP3 |
CALL |
WAIT100 |
;100μsec |
|
CALL |
WAIT100 |
;200 |
|
CALL |
WAIT100 |
;300 |
|
CALL |
WAIT100 |
;400 |
|
CALL |
WAIT100 |
;500 |
|
CALL |
WAIT100 |
;600 |
|
CALL |
WAIT100 |
;700 |
|
CALL |
WAIT100 |
;800 |
|
|
|
|
|
BTFSS |
PORTA,4 |
;RA4 が High
の場合次の命令をスキップ |
|
GOTO |
WRONG |
;800μsec以下のパルスは不正とみなして排除 |
|
|
|
|
|
CALL |
WAIT100 |
;900 |
|
CALL |
WAIT100 |
;1000 |
|
CALL |
WAIT100 |
;1000 |
|
CALL |
WAIT100 |
;1100 |
|
CALL |
WAIT100 |
;1200 |
|
CALL |
WAIT100 |
;1300 |
|
CALL |
WAIT100 |
;1400 |
|
CALL |
WAIT050 |
;1450 |
|
|
|
|
;1450μsec 以下なら OUT1400
の処理へ |
|
BTFSS |
PORTA,4 |
;RA4 が High
の場合次の命令をスキップ |
|
GOTO |
OUT1400 |
|
|
CALL |
WAIT050 |
;1500μsec |
|
|
|
|
;1500μsec 以下なら OUT1500
の処理へ |
|
BTFSS |
PORTA,4 |
;RA4 が High
の場合次の命令をスキップ |
|
GOTO |
OUT1500 |
|
|
CALL |
WAIT020 |
;1520μsec |
|
|
|
|
;1550μsec 以上なら OUT1600
の処理へ |
|
GOT1600 |
|
|
|
|
|
|
;800μsec
以下のパルスは不正とみなす処理ルーチン |
WRONG |
|
|
|
|
MOVLW |
B'00000000' |
;RB0-RB7 Low set |
|
MOVWF |
TRISB |
|
|
MOVLW |
0H |
|
|
MOVWF |
CNT1400 |
;CNT1400 RESET |
|
MOVWF |
CNT1600 |
;CNT1600 RESET |
|
GOTO |
LOOP |
|
|
|
|
|
;1400μsec 処理ルーチン |
OUT1400 |
|
|
|
|
BTFSS |
CNT1400,0 |
;CNT1400 が 1 (初めてのパルス)でない場合次の命令をスキップ |
|
CALL |
WAIT020 |
;初めてのパルスなら 20μsec 待つ |
|
BTFSS |
PORTA,4 |
;RA4 が High
の場合次の命令をスキップ |
|
GOTO |
CHECK1400 |
|
|
MOVLW |
B'00000000' |
RB0-RB7 Low set |
|
MOWF |
TRISB |
|
|
MOVLW |
0H |
|
|
MOVWF |
CNT1400 |
;CNT1400 RESET |
|
MOVWF |
CNT1600 |
;CNT1600 RESET |
|
GOTO |
LOOP |
|
|
|
|
|
CHECK1400 |
;初めてのパルスなら CNT1400
をインクリメント、二度目のパルスなら出力へ |
|
BTFSC |
CNT1400,0 |
;CNT1400 が 0 (初めてのパルス)の場合次の命令をスキップ |
|
GOTO |
OUTRB4 |
|
|
INCF |
CNT1400,F |
;CNT1400 をインクリメント |
|
GOTO |
LOOP |
|
|
|
|
|
OUTRB4 |
|
|
|
|
MOVLW |
B'11110000' |
;RB0-RB3 High RB4-RB7 Low set |
|
MOVWF |
TRISB |
|
|
MOVLW |
0H |
|
|
MOVWF |
CNT1600 |
;CNT1600 RESET |
|
GOTO |
LOOP |
|
|
|
|
|
;1500μsec 処理ルーチン |
OUT1500 |
|
|
|
|
MOVLW |
B'00000000' |
;RB0-RB7 Low set |
|
MOVWF |
TRISB |
|
|
MOVLW |
0H |
|
|
MOVWF |
CNT1400 |
;CNT1400 RESET |
|
MOVWF |
CNT1600 |
;CNT1600 RESET |
|
GOTO |
LOOP |
|
|
|
|
|
;1600μsec 処理ルーチン |
OUT1600 |
|
|
|
|
BTFSS |
CNT1600,0 |
;CNT1600 が 1 (初めてのパルス)でない場合次の命令をスキップ |
|
CALL |
WAIT020 |
;初めてのパルスなら 20μsec 待つ |
|
BTFSC |
PORTA,4 |
;RA4 が Low なら次の命令をスキップ |
|
GOTO |
CHECK1600 |
|
|
MOVLW |
B'00000000' |
;RB0-RB7 Low set |
|
MOVWF |
TRISB |
|
|
MOVLW |
0H |
|
|
MOVWF |
CNT1400 |
;CNT1400 RESET |
|
MOVWF |
CNT1600 |
;CNT1600 RESET |
|
GOTO |
LOOP |
|
|
|
|
|
CHECK1600 |
;初めてのパルスなら CNT1600
をインクリメント、二度目のパルスなら出力へ |
|
BTFSC |
CNT1600,0 |
;CNT1600 が 0
(初めてのパルス)の場合次の命令をスキップ |
|
GOTO |
OUTRB3 |
|
|
INCF |
CNT1600,F |
;CNT1600 をインクリメント |
|
GOTO |
LOOP |
|
|
|
|
|
OUTRB3 |
MOVLW |
B'00001111' |
;RB0-RB3 High RB4-RB7 Low set |
|
MOVWF |
TRISB |
|
|
MOVLW |
0H |
|
|
MOVWF |
CNT1400 |
;CNT1400 RESET |
|
GOTO |
LOOP |
|
|
|
|
|
;20μsec wait timer |
WAIT020 |
|
|
|
|
MOVLW |
05H |
|
|
MOVWF |
CNT020 |
|
TIMLP1 |
DECFSZ |
CNT020,F |
|
|
GOTO |
TIMLP1 |
|
|
NOP |
|
|
|
NOP |
|
|
|
RETURN |
|
|
|
|
|
|
;100μsec wait timer |
WAIT100 |
|
|
|
|
MOVLW |
17H |
|
|
MOVWF |
CNT100 |
|
TIMLP2 |
NOP |
|
|
|
DECFSZ |
CNT100,F |
|
|
GOTO |
TIMLP2 |
|
|
NOP |
|
|
|
NOP |
|
|
|
NOP |
|
|
|
RETURN |
|
|
|
|
|
|
;50μsec wait timer |
WAIT050 |
|
|
|
|
MOVLW |
0CH |
|
|
MOVWF |
CNT050 |
|
TIMLP3 |
NOP |
|
|
|
DECFSZ |
CNT050,F |
|
|
GOTO |
TIMLP3 |
|
|
RETURN |
|
|
|
|
|
|
|
END |
|
|