PIC18F2550 完結編!


逆戻りしたり迷走を続けていたこの半年。
ちょっと整理しよう。

2009年6月:PICに出会う。(alarm.html)
2009年9月:アセンブラで第一弾完成するも不安定で実用ならず。(pic.html)
2010年1月:基板作成&C言語による第二弾完成。人柱で実験開始。(pic2.html)
2010年1月:16F88のメモリ&ピン不足により18F2550に移植開始。(pic3.html)
2010年2月:リモコンの必要性に迫られ、恐怖の電波解析突入。
2010年6月:リモコン制覇!PT2262/2272と仲良しになる。(radio.html)
2010年7月:2550で第三弾完成に向けて。(このページ!)
となる。


と、その前に
距離センサー&LEDアレイの実験
エッヂング液を考える&ヒーターの製作
安定化5V電源の製作
などいろんな事に首を突っ込んだのちに・・・・



さて、これは今年1月の2550のピン配置。


ちなみにこれが1月時点でのブレッドパターンだ。


そしてこれが7月時点でのピン配置案。

んで、ブレッド上配線はこうなる。


早速ブレッボ上でLEDを繋げてみると何故か点かない。
いろいろカット&ペーストしてみると、どうも「PORT*bit」は「TRIS*」をキチンと設定しないと動いてくれないようだ。
TRISA〜Cを16進でビット設定してやる。
さらに明確な出力以外は全て入力設定とした。

しかしこれでもまだRA6が点かない。
FOSCは「INTOSC_HS」にRA6については特に明記されていなかったのでそのまま使っていたが、
「INTOSCIO_EC」には「Internal oscillator, port function on RA6」と明確に書いてあったので試しにこちらにしてみると見事に点灯。
ふむ。結構キッチリしている処とそいうでない処がいろいろあるな。


んで、こうなる。
ちょっと見にくいけどフルカラーLEDを使って基本色(8色)で表現していく。

緑:何のボタンも押されていない時
青:ボタン1が押された時
赤:ボタン2が押された時
紫:ボタン1と2が同時に押された時

しっかしこのフルカラーLED・・・3つの発光体が単独で光るだけで全然混ざらない。
ボカす為のLEDキャップ付けないと使いもにならんな・・・。

ちなみに送信側の12V電池は基板にセットしたまま1ヶ月放置状態であった。
1ヶ月前に10.62Vあった電圧が現在10.57Vで完全に消費電流ゼロを確認!

ここまできてやっと大成功!!と言えそうだ。
なんかもう・・・7ヶ月ぶりに・・・・電波から解放されたようだ・・・・!(疲れたよ)

さて、LEDを使ったボタン選択のプログラム(盗難アラームのメインプログラム)を久しぶりに眺める。
番犬を走らせてループテストしてみたが、上手くいかない。
あれぇ〜?WDTCONの記述でエラーにならないんだからあってるじゃん?何故?

の結果、2550のWDTCONは1ビット目しか機能していない事が判明!(マニュアルP304参照)
え?んじゃ、値の設定は?・・・⇒なんとコンフィグレーション!
コンフィグにWDTPSってな記述発見!
そこでコンフィグシートを眺めてみると、

WDT=
ONEnabled
OFFDisabled

実際の時間を測定してみる。
WDTPS=
プリスケール(10進数)実際の時間
1〜512測定不能
10242秒くらい(2〜3秒)
20485秒くらい(4〜5秒)
409610秒くらい(10〜13秒)
819230秒くらい(28〜33秒)
163841分くらい(64〜65秒)
327682分くらい(115〜138秒)

なんかもう・・・・メチャクチャだよ・・・・。
各プリスケーラで平均5回測定したのだが、何で毎回違うの?・・・・判りません!
大体この位で切れるだろう・・・・・で考えておいた方がいいな・・・・。
ちなみにこの値以外を指定するとコンパイルエラーになります。

【ウォッチドッグタイマーの使い方】
さて時間を把握した処で、改めて18F2550の番犬(ウォッチドッグタイマー)の使い方。

1:コンフィグレーションで
#pragma config WDT=ON
#pragma config WDTPS=8192
と指する。

2:以降は勝手に(絶対に!)指定時間毎に強制リセットが掛かるので、
a)メインルーチンには
goto MainLoop;
の前に
ClrWdt();
を入れておく。
b)WDTを発生させたいループの場合はそのループを故意に無限ループ化しておけば、後は何も指定する事なく(WDTのスタート/ストップを指定しなくても)勝手に番犬がやってくるのだ。

16F88よりも便利かもしれないぞ!
ちなみにヘッダファイルの記述によればこのClrWdt()は、
* Some useful macros for inline assembly stuff
#define ClrWdt() {_asm clrwdt _endasm}
とある様にC18の開発陣がアセンブラ・マクロとしてデファイン宣言してインクルードしてくれた関数の様だ。(有り難い事です!)
他にも、
#define Nop() {_asm nop _endasm}
#define Sleep() {_asm sleep _endasm}
#define Reset() {_asm reset _endasm}
などがあるそうな。

【ボタンの作成】
ボタンは前のまま4つの機能を持たせる。
ボタン1:システム時限停止
ボタン2:作動回数表示
両ボタン+ボタン1:傾斜角設定
両ボタン+ボタン2:アラーム時間設定

1:システム時限停止
手順を追って確認しよう。
@初回乗車時はメイン電源が切れているので、シートを外して電源を入れる。
A通電と同時にマシンを動かさないの為の3秒間の「システム未可動」状態を作る。
B3秒後以降にボタン1で「システム時限停止」操作を行なう。
C延長/停止終了の操作を可能とする。
D以降の乗降車時はメイン電源が入っているのでBCの繰り返し。
E最終降車時はボタン1&メイン電源切断。

であれば良いから、
@メインループの前で3秒待機。(3秒後ブザー音1)
Aメインループ内でボタン1押下で「システム時限停止」処理へ。(ブザー音2)
B「システム時限停止」処理中にボタン1押下で処理の再延長。(ブザー音2)
C「システム時限停止」処理中にボタン2押下で処理のキャンセル=メイン・システムリセット(@へ)
  (早速「#define Reset() {_asm reset _endasm}」機能使ってやったぜぃ!)
D「システム時限停止」終了の30秒前に警告する。(ブザー音3)

ところでその「システム時限停止」時間は10分間に設定。
何故ならば、デイトナのマジックアラーム5の時限停止時間は5分間だったのだが、キーON後に、鍵を外し、チェーンを外し、ガレージから引っ張り出して・・・・の作業中にずっと「今何プンたったかな?」と気が気では無かったからだ。
精神衛生上よろしくない・・・・・いつデッカイ音で鳴り出すか?怖かったから・・・・。