PIC16F84Aでの時計サンプルをコーディングしていてメモリの不足でコンパイルできない状況が起きた。もともとPIC16F84Aは1024ワードしかプログラムメモリがない。なおかつ私のプルグラムはふんだんに変数もLONGをつかい32ビットをも簡単に消費してしまうためだろう。いろいろとしらべていると、メモリの消費を減らすのはcharを使うのが手のようだ。LONGに比べて8ビットで済むため、1/4ほどで済む。しかしプログラムのアイデアが必要となる。ここが一番難しいのではないかと思う。いろいろとメモリを減らすために定義をなくしたり対応してみたが、さっぱりコンパイルができない状態だ。物理的に私のプログラムでは無理(他の人のは問題の無いものがあるが、私のプログラムの理解ができていないため)なので、PIC16F84Aは一旦保留することにした。ピン互換で使用出来ると言われているPIC16F88に早速差し替えてみた。外部クロックが要らないので、便利なPICだ。新規に作成しなくても途中からの変更が可能だ。Customizeを選び、Configurationのグループ中のDeviceをPIC16F84AからPIC16F88に変更しOKボタンを押すだけでよい。プログラムも余裕でコーディングできる。PIC16F88は4096ワードのプログラムメモリがある。コンパイルも通り、時計が動くようにと期待をこめて小型のブレッドボードにPICを差し込む、そして電源ON!あれっ!何の変化もない。一体どうしたのだろう?出力ポートの使い方がまずかったのか?と思いながら、一応確認の為に、いちいちLEDを出力につないで、点灯するかを確認したり、がしかし特にポートの問題はないようだ。なんで時計の表示がでないんだろう?割り込みタイマーを使っているはずなのだが、動いてなさそうだ。ここに私のプログラムの手順の間違いがありました。結果から言うと、プログラムのCONFIGの設定の方法を便利な機能ということで、PIC Memory ViewsのConfiguration Bitsで間単に作成し使用してしまっていたことが大きな間違いでした。初期の状態での吐き出されるConfigurationコードでは動かない設定となってしまうということです。なので、一つ一つ確認して必要部を書き換えます。ここに来るまでプログラムコードの間違いではないかということで、なんでもないプログラムを無駄に確認してしまってたわけです。あ~あ、またやってしまった。ということで、Configを定義しなおして、無事時計が動いたのでした。時計の秒のドットが無いので空いていたポートRA2を出力として、ディレーと組み合わせて1秒間隔で点灯するように追加改造してみました。やっと時計らしくなりました。後は誤差がどれくらいかということですが、ストップウォッチと比較してみましたが、少し遅いようでしたので、割り込みカウント値を少し減らすようにして調整し、ほとんどずれは感じられない程度までになりました。クロックの周波数補正用にOSCTUNEとOSCCONがありますが、ここは中心値として、補正なしのオリジナルセンター値のままにしてあります。
左下が小型のブレッドボードに組んだ時計のPIC16F88です。RS-232Cのボード上にLEDセグメントを配置したのでこのようになりました。LEDセグメントは、手持ちのTLG4145という東芝のカソードコモンタイプの4X7セグメントLEDです。古いものなので、インターネットで調べても資料はありませんでした。なので、電源と抵抗で実際にLED点灯させ全ピン配置を確認し、使用しています。
小型ブレッドボード上には2ポートの動作確認の為のLEDがつないだままにしてあります。はずしてもいいのですが...。接続コードが足りなくなったので、さらに追加で20本ほど作りました。このマップピンのコードは、案外気にいってます。


時計の動作ではモードSWがオン時(GND)は分と秒表示、時間SWがオン(GND)では時間の桁がカウントアップします。同様に分SWがオン(GND)では分の桁がカウントアップします。PIC16F88での時計はうまくいったので、PIC16F84Aでの1Kワードのサンプルに再挑戦しようかしらん?LCDへの表示もあるしな~。いろいろと調べなきゃ、きゃ!しかしPICは時計もできるしとても、面白いですわ!