|
;*********************************************
; サンプルプログラム
PIC16F84
; コイン不要器 作成 フォトモス未使用版
;*********************************************
LIST
P=PIC16F84A
;
INCLUDE
"P16F84A.INC"
;標準ヘッダ定義ファイル
__CONFIG
_HS_OSC & _PWRTE_ON & _WDT_OFF
;のインクルード
;*********************************
; 変数レジスタの定義
;*********************************
CNT1 EQU
0CH
;タイマ用変数
CNT2 EQU
0DH
;タイマ用変数
CNT3 EQU
0EH
;タイマ用変数
CNT4 EQU
0FH
;タイマ用変数
CNT5 EQU
10H
;タイマ用変数
;***********************
; メインルーチン
;***********************
ORG
0
;Reset
Start
MAIN
BSF
STATUS,RP0
;バンク1へ切替
CLRF
TRISB
;ポートBを出力モードに設定。コイン投入パルスと払い出しパルス
BSF TRISA,0 ;ポートAの0ビットを1で入力モードに(コイン投入スイッチ用)
BSF TRISA,1 ;ポートAの1ビットを1で入力モードに(コイン払い出しトリガ用)
BCF
STATUS,RP0
;バンク0に戻す
HPSET MOVLW B'1111111' ;Wレジスタに入力(初期状態を設定)
MOVWF
PORTB ;wレジスタからポートBへ移動全1出力ホッパ停止コイン投入なし
HOPPA BTFSC PORTA,1 ;ポートAの1ビットが0なら次をスキップ (ホッパ動作判定)
GOTO MAINLP ;ポートAの1ビットが1ならメインループへ (ホッパ非動作ならメインへ)
HPACT MOVLW B'11110111' ;Wレジスタに3ビット目0を入力(ホッパ回転中を作る)
MOVWF
PORTB ;wレジスタからポートBへ移動ホッパ動作開始
CALL
TIM100
;10msec待つ 気持ち待つ
COINPAY MOVLW B'11110011' ;Wレジスタに2
3ビット目0を入力(コイン吐き出し中)
MOVWF
PORTB ;wレジスタからポートBへ移動払い出し開始
CALL
TIM100
;10msec秒待つ センサのタイミング取り
MOVLW B'11111011' ;Wレジスタに 3ビット目1を入力(コイン吐き出し中)
MOVWF
PORTB ;wレジスタからポートBへ移動払い出し中その1
CALL TIM100
;10msec秒待つ センサのタイミング取り13msec
CALL TIM5 ;1msec秒待つ
CALL TIM5 ;1msec秒待つ
CALL TIM5 ;1msec秒待つ
MOVLW B'11110011' ;Wレジスタに2
3ビット目0を入力(コイン吐き出し中)
MOVWF
PORTB ;wレジスタからポートBへ移動払い出し中
CALL
TIM50 ;5msec秒待つセンサのタイミング取り7msec
CALL TIM5 ;1msec秒待つ
CALL TIM5 ;1msec秒待つ
MOVLW B'11110111' ;Wレジスタに 2ビット目1を入力(1枚払い出し終わり)
MOVWF
PORTB ;wレジスタからポートBへ移動払い出し終わり
CALL
TIM100 ;0.25秒待つホッパ停止まで待ち時間
CALL
TIM100 ;0.25秒待つ エラー避けのおまじない(無くても良い)
CALL
TIM100 ;0.25秒待つ エラー避けのおまじない(無くても良い)
CALL
TIM100 ;0.25秒待つ エラー避けのおまじない(無くても良い)
GOTO
HOPPA ;ホッパに戻る (まだ払い出すかもしれないから戻る)
MAINLP MOVLW B'11111111' ;Wレジスタにオール1を入力初期状態作成(コイン投入前の初期状態)
MOVWF
PORTB ;wレジスタからポートBへ移動全ビット1出力(コイン投入前の初期状態)
BTFSC PORTA,0 ;ポートAの0ビットが0なら次をスキップ;コイン投入SW判定
GOTO HOPPA ;ポートAの0ビットが1ならホッパーへ;投入無しなら最初に戻る
BCF PORTB,0
;ポートBの0ビット目0を出力して;投入開始センサ1感知
CALL
TIM100
;10msec秒待つ
MOVLW B'11111100' ;Wレジスタに1ビット目0を入力センサ2感知
MOVWF
PORTB
;wレジスタからポートBへ移動;センサ2感知
CALL
TIM100
;10msec秒待つ
CALL
TIM100
;10msec秒待つ
MOVLW B'11111101' ;Wレジスタに0ビット目1で1ビット目は0を入力センサ1通過
MOVWF
PORTB
;wレジスタからポートBへ移動;センサ1通過
CALL
TIM100
;10msec秒待つ
MOVLW
B'11111111' ;Wレジスタに全て1センサ2通過;投入完了
MOVWF
PORTB
;wレジスタからポートBへ移動;センサ2通過;投入完了
CALL
SECTIM
;0.25秒待つ
GOTO
HPSET ;ホッパに戻る
;*******************************
; 約0.5秒のタイマサブルーチン
;*******************************
; 0.4msecタイマ
TIM10 MOVLW
0F9H
MOVWF
CNT1
TIMLP1 NOP
DECFSZ
CNT1,F
GOTO
TIMLP1
RETURN
; 10msec タイマ
TIM100 MOVLW
019H
MOVWF
CNT2
TIMLP2 CALL TIM10
DECFSZ
CNT2,F
GOTO
TIMLP2
RETURN
; 0.25sec タイマ
SECTIM MOVLW 019H
MOVWF
CNT3
TIMLP3 CALL TIM100
DECFSZ
CNT3,F
GOTO
TIMLP3
RETURN
; 5msec タイマ
TIM50 MOVLW
00cH
MOVWF
CNT4
TIMLP4 CALL TIM10
DECFSZ
CNT4,F
GOTO
TIMLP4
RETURN
;
; 1msec タイマ
TIM5 MOVLW
004H
MOVWF
CNT5
TIMLP5 CALL TIM10
DECFSZ
CNT5,F
GOTO
TIMLP5
RETURN
END
|