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 スタートマーク幅カウント数
詳細は別ページのソースリストを見ていただくとして、簡単に説明します。
最初に計測したスタートマークの幅は実験の結果から次の範囲内に入っている時を有効としました。それ以外のときはスタートマークと判断せず、またスタートマークの計測に戻ります。
こうすることによって、センサー付近でカードを出し入れした時の誤動作を低減しています。
スタートマーク幅カウント値
20H〜78H
歴史年号一発屋のデータ計測
スタートマーク幅の判定を無事パスすれば順次データの計測に入ります。
信号が来るたびに無条件にH幅を計測し、RAMに書き込みます。
幅の計測はスタートマークと同様に、タイマー割り込みの回数を計測します。
data_00〜data_10 年号データ11bit分の幅カウント数
data_end エンドビットの幅カウント数
data_he エンドマーク幅カウント数
歴史年号一発屋のエンドマーク判定と判定値設定
データ11bit分、エンドビット、エンドマークの幅を無事に読み取った後は、エンドマーク幅の判定に入ります。
なぜエンドマークの判定が必要かと言いますと、まずは次の波形を見て下さい。
(バーコードセンサーからの出力波形・その2)
スタートマークとエンドマークの幅がかなり違います。年号カードを動かすとき最初ゆっくりで後になるほど速くすると上記のような波形になります。
年号データの判定にはスタートマークとエンドマークを幅を利用しますので、エンドマーク幅はスタートマーク幅と大きく違わない必要があります。
従ってスタートマーク幅に対してエンドマーク幅がある範囲内に入っているか判定を行います。
エンドマーク幅カウント値
+5H(スタートマーク幅カウント値)−20H
エンドマーク幅の判定が無事終了した後、年号データの「1」「0」を判別する基準データを作成します。
ほぼ幅の揃ったスタートマークとエンドマークの幅を利用します。
まずスタートマーク、エンドマーク幅は「3T」分の長さがあります。
これを半分にすれば「1.5T」となりこれより長い時が「2T」の「1」になり、短い時が「T」の「0」になります。
スタートマークとエンドマーク幅の平均値を半分にして判定値として設定します。
hantei 「1」「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