No.09 押し釦5個ゲームPIC製作  


オルタネイト5個ゲームのプログラムと回路図

全部ONでブザーが鳴る
今回は昔からあるゲームをPICで作ってみました。
オルタネイトの押し釦が5個あります。オルタネイトは押すたびにON/OFFが切り換わるスイッチのことで、見ためではONなのかOFFなのか分かりません。
5個のスイッチが全部ONになるとブザーが鳴るというおもちゃです。

このおもちゃをモーメンタリ(押しているときだけONする)スイッチで作りました。
ゲーム自身にLEDは必要ないのですがPICによるオルタネイト化がちゃんとできているか確認するために付けてあります。
ジャンパーピンを外すとLEDのON/OFF状態が分からなくなり、おもちゃになります。

PIC16F84Aを使っています。4MHzで設計しましたが手持ちが無かったので3.58MHzの水晶を使いました。





ソフトによる誤動作対策
いつもはポート直読みで入力していますが今回はまじめに作りました。
ノイズやチャタリングによる誤動作の対策について私の意見を書きます。

1.いつ入力するか
 どのタイミングでポートを読み込んでも一緒じゃないか・・・いいえ、ハード回路によっては出力直後はノイズが発生したり、電源低下が起きます。
なので、出力後しばらくしてから入力した方が安全です。
main()ルーチンを、
while(1){
  input();  // まとめて入力   (RAMに保存)
  sub1();  // 制御・処理本体1 (RAMデータで計算)
  sub2();  // 制御・処理本体2 (出力データをRAMに保持)
  output(); // まとめて出力
  timer();  // 10mSecとか20mSec,時間をおく
}
以上のようにするとプログラムも見やすく、1秒間に100回ループしているとか計算もしやすくなります。
タイマーがあると無駄に思えますが、タイマー無しで作るとプログラムを変更するたびに動作が思わぬ方向に変わったりします。



2.入力フィルタ
 入力をサブルーチンでまとめるとノイズ・チャタリング防止ソフトが作りやすくなります。
 今回は方法3で作りました。

方法1: AND・OR
 入力をANDかORしながら何回か繰り返す方法。
 入力データが0方向か1方向どちらかに偏ってしまうので良くないです。

方法2: 2回チェック
 入力を2回して同じデータならOKとする方法。
 比較的良い方法ですがバイト入力の場合、クロックのようにH/Lを繰り返すビットがあると残りのビットまで入力ができなくなってしまいます。

方法3: 2回連続で更新
 1回だけ変化したデータには反応せず、入力値が2回同じならデータを更新する方法です。
通常、ノイズやチャタリングは一瞬ポートが反転し、10m秒・20m秒後には消えています。
そのような考えにしたがって作られたソフトです。昔読んだZ80のアセンブラの本に書いてありました。
コンデンサによる積分と一緒になります。
内容は実際のプログラムで確認してください。
(すみません、計算の説明がうまくできないです。真理値表を書くと解りやすいかも)
フィルタの段数を増やす(3回連続なら更新にする)と精度は上がりますが反応時間も長くなります。



XORについて
入力フィルタなどを考えるとき、ExOR(排他的論理和、XORとかEOR)を知らないと作れません。
なじみが無い方のために少し説明します。2つの使い方があります。

1.違い検出
  AとBが一緒なら 0、
  AとBが違ってたら1。

  変化ビット = 前回の8ビット XOR 今回の8ビット; になります。


2.出力反転
  Aが0なら、YはBそのもの
  Aが1なら、YはBの(1/0)反転

  MSBだけ反転 = データ XOR 0x80; のように使います。

更新履歴
2009年 2月 8日 : 押し釦5個ゲームを公開。


  トップ アイコン 
直線上に配置