PIC16F84電子遊戯(89) |
最終更新日:2002年11月23日 |
歴史年号一発屋 (1ページ)へ (2ページ)へ (3ページ) (4ページ)へ |
|
歴史年号一発屋のポート割付 |
ポート名 |
入出力 |
機能 |
RA0 |
OUT |
OK・LED出力 |
RA1 |
OUT |
NG・LED出力 |
RA2 |
OUT |
NC |
RA3 |
IN |
SW1 |
RA4 |
IN |
センサー |
RB0 |
OUT |
7セグ駆動 |
RB1 |
OUT |
7セグ駆動 |
RB2 |
OUT |
7セグ駆動 |
RB3 |
OUT |
7セグ駆動 |
RB4 |
OUT |
1年選択 |
RB5 |
OUT |
10年選択 |
RB5 |
OUT |
100年選択 |
RB7 |
OUT |
1000年選択 |
|
歴史年号一発屋のメインルーチンのフロー |
年号カードを読み込み、年号表示をする部分の概要フローチャートです。
まずは全体を把握していただいた後、ポイントのみ説明します。 |
|
歴史年号一発屋のスタートマーク幅の計測と判定 |
カードに記載されたバーコードをセンサーで読み取ると次のような波形が出力されます。 |
|
(バーコードセンサーからの出力波形・その1) |
カードを入れない時は、センサーの反射面が黒色のため、出力は「Hレベル」になっています。ここに白いカードを差し込むことにより、出力は「Lレベル」になります。
この後、スタートマークの部分がセンサーに掛かると出力は「Hレベル」になります。
ここでひとつテクニックが必要です。よく考えて見ると、このカードをセンサーの部分で前後させるとどうなるでしょうか。そうです、カードの白とセンサーの背景の黒に反応して出力が変動するのです。この変動がスタートマークの部分と間違わないことが必要になります。
そこで、まずはスタートマーク幅(最初の来るビットのH幅)のみ読み取り、その幅を判断する必要があります。 |
ビットの幅はタイマー割り込みの回数で計測します。
タイマー割り込みは約200usecで掛かるように設定し、その回数を計測します。
計測用のカウンタは8bitですので、約51msecまでのビット幅が計測出来ます。
特にカードを最初の部分で前後する場合、この51msecを超えることも考えられるので、8bitカウンタがオーバーフローしているかの判断も必要になります。 |
count |
タイマー割り込みカウント数 |
over |
カウント数オーバーフラグ |
data_h |
スタートマーク幅カウント数 |
|
詳細は別ページのソースリストを見ていただくとして、簡単に説明します。
最初に計測したスタートマークの幅は実験の結果から次の範囲内に入っている時を有効としました。それ以外のときはスタートマークと判断せず、またスタートマークの計測に戻ります。
こうすることによって、センサー付近でカードを出し入れした時の誤動作を低減しています。 |
|
歴史年号一発屋のデータ計測 |
スタートマーク幅の判定を無事パスすれば順次データの計測に入ります。
信号が来るたびに無条件にH幅を計測し、RAMに書き込みます。
幅の計測はスタートマークと同様に、タイマー割り込みの回数を計測します。 |
data_00〜data_10 |
年号データ11bit分の幅カウント数 |
data_end |
エンドビットの幅カウント数 |
data_he |
エンドマーク幅カウント数 |
|
歴史年号一発屋のエンドマーク判定と判定値設定 |
データ11bit分、エンドビット、エンドマークの幅を無事に読み取った後は、エンドマーク幅の判定に入ります。
なぜエンドマークの判定が必要かと言いますと、まずは次の波形を見て下さい。 |
|
(バーコードセンサーからの出力波形・その2) |
スタートマークとエンドマークの幅がかなり違います。年号カードを動かすとき最初ゆっくりで後になるほど速くすると上記のような波形になります。
年号データの判定にはスタートマークとエンドマークを幅を利用しますので、エンドマーク幅はスタートマーク幅と大きく違わない必要があります。
従ってスタートマーク幅に対してエンドマーク幅がある範囲内に入っているか判定を行います。 |
エンドマーク幅カウント値 |
+5H(スタートマーク幅カウント値)−20H |
|
エンドマーク幅の判定が無事終了した後、年号データの「1」「0」を判別する基準データを作成します。
ほぼ幅の揃ったスタートマークとエンドマークの幅を利用します。
まずスタートマーク、エンドマーク幅は「3T」分の長さがあります。
これを半分にすれば「1.5T」となりこれより長い時が「2T」の「1」になり、短い時が「T」の「0」になります。
スタートマークとエンドマーク幅の平均値を半分にして判定値として設定します。 |
|
歴史年号一発屋のデータチェック |
カードを途中で止めたり、急にゆっくり動かしたりした時、年号データ部分の幅が極端に広くなり年号を誤判断する可能性があります。そこで全ての年号データがスタートマーク幅を超えていないかのチェックを行っています。 |
歴史年号一発屋のデータ変換 |
年号データ部分のカウント値を判定値カウント値を用いて「1」「0」のビットデータに変換します。同様にエンドビットのカウント値も変換して合計12bitのバイナリデータにします。 |
data_s1 |
変換バイナリデータ(bit8−11) |
data_s0 |
変換バイナリデータ(bit0−7) |
|
歴史年号一発屋の年号バイナリデータの10進変換 |
11bitのバイナリデータに変換された年号データは表示をするために10進表記にさらに変換する必要があります。
10進変換に関しては下記のHPを参考にさせて頂きました。(自分で考えると時間がかかりそうなので・・・・) |
[ 趣味の電気工作 ]http://www.try-net.or.jp/~el_dream/のPICマイコンの使い方とサブルーチン集のページにあります。 |
変換したデータは次のRAMに格納されます。変換時に使用するRAMも必要です。 |
hen_5〜hen_1 |
変換後の10進データ |
sub_count |
変換時のカウンタ |
sub_amari |
変換時の余り |
|
歴史年号一発屋の変換データの表示RAM格納とゼロサプレス処理 |
10進に変換したデータを表示RAMへ格納します。 |
n1_data |
1桁目の表示データ |
n2_data |
2桁目の表示データ |
n3_data |
3桁目の表示データ |
n4_data |
4桁目の表示データ |
|
7セグメントLED点灯処理はここのデータを参照して行います。
年号表示には上の桁のゼロ表示は必要ありませんので、表示の前にゼロサプレス処理を行っておきましょう。
例えば「0058」のとき「58」の表示になるようにします。
処理は簡単で上の桁から順番にチェックしてゼロの時には表示出来ない「0FH」のデータに置き換えます。処理はゼロでない数値が来たら終了します。 |
以上がカードデータ読み込みに関する処理の説明です。
私としては久々ぶりに詳しく説明できたのではないかと思っております。
ということで、今回はここまでとしておきましょう。 |
これからも益々面白くなる「PIC16F84電子遊戯」をよろしくお願いいたします。 |
|
不明点などあればメールお願いいたします。nonchansoft@nifty.com |
|
|