• 締切済み

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

みんなの回答

noname#157410
noname#157410
回答No.1

一個目の入力があったら、サブルーチン作って1分間カウントさせ、それが戻ってきたら、 PICの出力ポートをHIにするかLOWにするかは自由に出して。 その出力で光センサ切ればいいだけです。 と理論はこうですが、それを上のプログラムからは次の回答者に任せます。 ハード屋さんなのですみません。 Z80系のアセンブラは20年前にかじったぐらいなので・・・・・

tomura12
質問者

お礼

 ありがとうございました。  とても、むずかしいということが、わかりました。

関連するQ&A