トップページ     電子回路のページのトップ

 PIC18Fを使う(3)

 画像をクリックすると拡大表示されます。
 拡大画像からはブラウザの「←戻る」ボタンで戻ってください。



 キー入力とEEPROM書き込み

キースキャン

 今回はキースイッチで設定値をセットし、PIC内蔵のEEPROMに書き込む実験をしました。
 キー入力というと、キーイベントをキューに出し入れするのが正式?な方法かもしれません。
 しかし、メモリの少ないCPUには負担が大きいし、押し続けている状態を取得するのが面倒です。
 そこで、割り込みルーチンの中でカウンタをインクリメントしてチャッタを取る方法にします。
 キーは4個有り、60mS押されれば入力、3秒で長押しとします。
 1個のキーに対し、
・ 入力有り(レベル)
・ 長押し(レベル)
・ 入力の立ち上がりでセット
・ オフの瞬間にセット
 の4個の変数を立てています。
 4×4=16個の変数が必要になりますが、RAMが少ないので、ビットフィールドを定義しています。

プロジェクト  最初、液晶画面は消えています。
 MODEキーを長押しすると、設定値の入力画面になります。
 数値の初期値が2行目に表示されるのでUPキーとDOWNキーで数値を増減します。
 UP又はDOWNキーを押し続けると数値をスキャンし、長押しで増速します。
 現在、最低値10、最大値40となっていて、数値はこの範囲内で増減します。
 ENTキーを長押しすると現在の数値をEEPROMに書き込んだ後、画面を消去して設定を終了します。
 書き込んだ値は次回の初期値になります。
 MODEキーを押すと数値を更新しないで設定を終了します。
 尚、設定画面を1分間、放置すると設定画面は消去されます。
 スイッチ入力は人間とのインターフェースですので時間が掛かります。
 このプログラムは設定中でもメインルーチンが数ミリ秒で回るように作ってあるので、複雑な構造になっています。
 つまり、CPUが他の処理を実行中に設定値の書き換えが実行できると言うわけです。
 今回は簡単に、LEDが1秒点灯、1秒消灯を常に繰り返すようにしましたが、キー操作中でも点滅間隔は変化しません。
 LEDの点滅は割り込みルーチンの中で実行されている訳ではありません。
 数ミリ秒で回るメインルーチンの中でタイマーをスタートさせ、タイムアップをチェックしています。

   ファームウエアのダウンロード (ZIP圧縮されています。)

コンパイラのバージョンにより、プロジェクトに若干の変更が必要になります。


  cnf1320.c  delay.c  lcdlib4l.c  timer.c

 これらは前回と変わっていません。


 eeprom.c

 内蔵EEPROMを読み書きする関数と書き込み禁止にする関数、合計3個の関数があります。
 書き込みには数ミリ秒かかるので、タイマーをスタートさせ、他に処理を渡します。
 タイムアップをチェックして書き込み禁止にしています。
 従って、書き込み禁止の関数が独立しています。
 書き込み完了のステータスはチェックしていません。


 input.c

 4個のキースイッチの入力処理を行います。
 スイッチ毎の入力カウンタの値で入力フラグを立てます。
 フラグは入力有り(レベル)、長押し有り(レベル)、オンイベント、オフイベントの4種類です。
 4×4で、合計16個の変数が必要になるので、メモリ節約の為にビットフィールドを定義しています。
 入力カウンタは割り込みルーチンでインクリメント、クリアされています。


 interruput.c

 タイマー0の割り込みが追加されました。
 20mS毎に割り込み、入力スイッチのチャッタ取りを行っています。
 スイッチに対応したポートの状態で、カウンタをインクリメント又は0クリアしています。


 led.c

 内容的には意味のない、短いソースです。
 数値を設定する作業中でもメインルーチンが規則的に回っていることを目視するために追加しました。
 LEDは1秒点灯、1秒消灯を繰り返しているだけです。
 この処理はメインルーチンのループの中でポーリングされます。
 タイマー割り込みの中でオンオフしている訳ではありません。
 処理の中で1秒タイマーをスタートさせ、タイムアップになったら点滅を反転してタイマーを再スタートしています。


 main.c

 メインルーチンです。
 各処理の初期化の後で無限ループに入り、この中で各処理をポーリングします。


 num_set.c

 数値を設定する部分です。
 キーフラグを見ながら、現在の状態フラグを変更していきます。
 メインルーチンを止めないで処理するので、かなり複雑になっています。
 例えば、タイマー待ちはタイマーをスタートさせてリターンし、次回以降のポーリングでタイムアップしていたら 状態フラグを変更して、次の処理を行います。
 数値のスキャンスピードは2段変速になっています。
 かなり面倒な部分です。


 global.h

 処理が増えているので、変数や関数のプロトタイプ宣言が増えています。
 スイッチフラグのビットフィールドを定義しています。
 使用するタイマーも増えているのでタイマー番号の定義も増えています。


コンパイラのバージョン

 2009年10月10日 追記

 私が使用した環境はMPLAB Ver7.60 C18 Ver3.11(評価版)です。
 新しいC18 Ver3.31ではリンク時にエラーが発生しました。
 電子回路 > PIC18Fを使う > C18のバージョン を読んでください。


トップページ  「電子回路」のトップ