PICで1秒間の豆の数をカウントするプログラム
PIcの初心者です。回路図を見て、基板を作れる程度、プログラムは書いてあるのを打ち込める程度で、意味はまったくわかりません。
PIC16F84のPICでカウントする公開の回路を見つけて、光りセンサ-回路でON.OFFさせるかいろも作りました。プログラムは作成者のものです。 見て書き込んで、なんとか見事にカウントしました。合計数は、わかりました。
質問は、
1,このプログラムを直して、1秒間あたり、何粒落ちるかカウントしたいと考えました。
どのように、すれば良いのか教えてください。
2,合計のカウンタ-と秒速何粒落ちているかプログラムを1つのPICに入れて、動作の最初に選択 できるようにしたいのですが、どのようにしたらよいでしょうか。
PICの回路図とプログラム(テキスト形式)を添付しています。
お願いします。私の連休中の宿題で困っています。
7セグメントLED表示4桁カウンタ
; (クロック 4MHz)
; [ ご注意 ]
;PIC プログラムには秋月電子製のライター・キットを使用しているため、アセン
;ブルにはキットに付属のアセンブラを使用しています。
;プログラム本体は PIC の基本命令だけでの構成に書き替えていますが、ヘッ
;ダー部分などが異なる場合がありますので、他のアセンブラを使用する場合は
;適宜変更してご利用下さい。
include 16f84.h
.16f84
.osc hs
.pwrt on
.wdt off
.protect off
countsw equ rb.0 ;カウント入力ポート
org 0ch
d1 ds 1 ;カウント用
d2 ds 1
d3 ds 1
d4 ds 1
swlc ds 1 ;swait でのループ回数
sd ds 1 ;表示データ (0~9)
lc ds 1 ;汎用、ループ用
org 0
goto start
org 4
goto start
start ;初期設定
bsf 3h,5 ;ページ 1
movlw 10000b
movwf 85h ;ポート ra の初期化
movlw 00000001b
movwf 86h ;ポート rb の初期化
bcf 3h,5 ;ページ 0
clrf d1 ;カウントデータの初期化
clrf d2
clrf d3
clrf d4
ct10: btfsc countsw ;入力が 0 なら次をスキップ
goto ct12
call swait
btfsc countsw ;入力が 0 なら次をスキップ
goto ct12 ;確かでないなら戻る
incf d1,1 ;加算
movlw 10
subwf d1,0
btfss 3h,2
goto ct11
clrf d1
incf d2,1
movlw 10
subwf d2,0
btfss 3h,2
goto ct11
clrf d2
incf d3,1
movlw 10
subwf d3,0
btfss 3h,2
goto ct11
clrf d3
incf d4,1
movlw 10
subwf d4,0
btfss 3h,2
goto ct11
clrf d4
ct11: call swait
btfss countsw ;入力が 1 なら次をスキップ
goto ct11 ;入力が 1 になるのを待つ
call swait
btfss countsw ;確かに入力が 1 に戻ったかを確認
goto ct11
ct12: movlw 11111110b
movwf rb
movlw 01101b
movwf ra ;桁4へ表示
movf d4,0
movwf sd
call l7ptset
call wait
movlw 11111110b
movwf rb
movlw 01110b
movwf ra ;桁 3 へ表示
movf d3,0
movwf sd
call l7ptset
call wait
movlw 11111110b
movwf rb
movlw 00111b
movwf ra ;桁 2 へ表示
movf d2,0
movwf sd
call l7ptset
call wait
movlw 11111110b
movwf rb
movlw 01011b
movwf ra ;桁 1 へ表示
movf d1,0
movwf sd
call l7ptset
call wait
goto ct10
;*********************************************************************
l7ptset: ;sd に指定された 0~9 の数字をセットする
bcf 3h,0 ;キャリフラグのクリア
rlf sd,1 ;4倍
rlf sd,1
movf sd,0 ;sd の値を w にコピー
addwf pc,1 ;プログラム・カウンタに加算
movlw 00000010b ;0
movwf rb
goto pt10
nop
movlw 11100110b ;1
movwf rb
goto pt10
nop
movlw 10010000b ;2
movwf rb
goto pt10
nop
movlw 11000000b ;3
movwf rb
goto pt10
nop
movlw 01100100b ;4
movwf rb
goto pt10
nop
movlw 01001000b ;5
movwf rb
goto pt10
nop
movlw 00001100b ;6
movwf rb
goto pt10
nop
movlw 11100010b ;7
movwf rb
goto pt10
nop
movlw 00000000b ;8
movwf rb
goto pt10
nop
movlw 01100000b ;9
movwf rb
pt10:
return
;*********************************************************************
swait: ;カウント入力時のウェイト・ルーチン
movlw 6 ;6回のループ
movwf swlc
swt10 movlw 11111110b
movwf rb
movlw 01101b
movwf ra
movf d4,0
movwf sd
call l7ptset
call wait
movlw 11111110b
movwf rb
movlw 01110b
movwf ra
movf d3,0
movwf sd
call l7ptset
call wait
movlw 11111110b
movwf rb
movlw 00111b
movwf ra
movf d2,0
movwf sd
call l7ptset
call wait
movlw 11111110b
movwf rb
movlw 01011b
movwf ra
movf d1,0
movwf sd
call l7ptset
call wait
decfsz swlc,1
goto swt10
return
;*********************************************************************
wait: ;ウェイトルーチン(1桁の表示時間)
movlw 100
movwf lc
wt10 decfsz lc,1
goto wt10
return
お礼
ありがとうございます. チャッタリング防止回路がないので,十分な時間を取ることにしました. if(RA0==0){ DelayMs(10); if(RA0==0){ ++up_1; } }