ワンチップマイコン・PICでC言語を使った学習報告3
勉強する機会がありましたので、第三弾としてアップします。何度も文献を読み直してはいるものの、少しやらないとすぐ忘れてしまうのは、もう年なのか?と少し嘆きながらも、じっくりと、あきらめずに、続けて行ける
よう頑張りたいと、自分にエールを送る毎日です。なお今回も、アップした回路図やプログラムに間違いや無駄などがあるかもしれません。そのあたりは勉強中と言うことでご容赦願います。できればご指摘やアドバイスを頂ければ幸いです。
(メールなどで直接でもOKです)
お決まりの条文ですが、ここに紹介するものは私個人が勝手に製作したもので、万一製作されて事故などの被害にあわれても当方は一切責任を持ちませんので、ご理解とご了解のうえで、ご参照並びにご利用ください。できれば勉強用
として利用して頂ければ幸いです。なにせ私もまったくの素人ですから!
最初に申し上げるべきでしたが、これまでアップしたソースファイルの利用について注意点があります。「xxxxxxxx.C」のソースファイルの中で、インクルードファイルの記述部があります。(通常xxxxxxxx.cと同じ名までxxxxxxxx.hとなっています)アップしたファイルにはインクルードファイルの場所を記述していません。
CCS社のCでこのインクルードファイルの場所を指定しないでコンパイルをするとエラーになります。(特に新しいバージョンでは!)どのインクルードファイルも必ずフルパスを追加記述して下さい。複数ある場合も同じように、それぞれに必ずフルパスを追加記述して下さい。
例. c:\PIC_Study\I2C_LCD\ と言うところにxxxxxxxx.cとxxxxxxxx.h がある場合・・・・・
#include "c:\PIC_Study\I2C_LCD\xxxxxxxx.h"
と追加記述して下さい。(アンダーライン部を追記します!)
トライステート社のこのボード、実は2002年には手入れていたもので、目的は「C言語の勉強」でした。しかし仕事に追われる毎日で手をかけることができず、 とうとうこのボードはお蔵入りになってしまいました。時計の製作を始めるきっかけは、「スイッチの処理」、「LCDの表示処理」、「I2Cの通信処理」などの学習が目的で、ちょうどこのボードの存在を思い出し、採用する事にしました。 I2Cの学習においては秋月電子通商で販売されていたRTCモジュール、エプソントヨコム社のRTC-8564NBを使った変換基板をみつけ、 それを使うことに決めていたので、いい機会だと思っていました。・・・ところがいざプログラミングをする上で、いつものように先駆者の御仁サイトを探してみたのですが、PICを使ってC言語での製作例がかなり少なく、やっと見つけたのが上記のサイトでした。この場を借りて、お礼申し上げます。ありがとうございました。
具体的には
←左の写真が全体です。トライステート社のこのボードは秋月電子通商鰍ナK-39と言う通販コードで通販コードで1セット4,300円で販売されています。12bit-8chのA/Dコンバータ、
RS232Cコンバーター、発信器、レギュレータ、ユニバーサル部などを搭載している基板です。
液晶は適当なものを選びました。回路図ではSC1602BSLB-S0-G_PDと言う型番になっていますが、
秋月電子で販売されているものであれば大半は使用可能です。写真のものは24文字2行と言うもので、昔に秋月電子で購入したものです。今は販売されていないみたいです。これだけ長いと、1行ですべて表示が可能ですね!
電源はDC9V/1.3Aのもので、やはり秋月電子での購入品です。今回はユニバーサル部分に、押しボタンスイッチ4個と液晶接続用の14Pin コネクタとコントラスト調整用の半固定VR(20kΩ)1個、RTC-8564/NB
を追加して搭載し、配線しました。
おっと言い忘れていました。RTCのICをバックアップする電池も搭載しています。電池はCR2032のリチウムボタン電池で、ホルダーはこれまた秋月電子から購入しました。写真に1個、トグルスイッチがありますが、デバッグするときにOFFにし、単独動作時にはONにします。 これはMCRLピン(リセットピン)を単に抵抗(47kΩ)だけでプルアップするか(OFF時)、CとDを接続してリセット信号を作るか(ON時)の切り替えをしています。LEDは今回は使用していません。つけなくてもOKです。
↑液晶LCD表示部 ↑バックアップボタン電池 ↑ スイッチ操作部
スイッチ部の説明
バックアップ電池がない場合は、初期化されます。初期データは2008年6月17日 TUS 12時0分0秒になります。RTCレジスター内のVLビットを真面目に監視しています。なぜこの日付になるのかは少し意味があります。
また月データを変更するときは、2月を除き、月ごとにちゃんと30日か31日かを判断しています。
の注1の説明ですが、4年に1度の閏年は4年を監視すれば分かることですが、設定するのには必要ないと判断したからです。表示されるデータはちゃんとしてくれるので問題ないのですが、問題になるのは 間違ったデータを設定した場合です。2月28日までしかない月に2月29日と設定すると、内部時計はおかしくなるそうです。(したことがありませんが???)
もうちょっと欲しいところRTC内にはアラーム機能があります。せっかくあるのだから使いたいところです。しかし、私はこのボードに乗っている12bit・8chのA/Dコンバータを使いたいと思っています。これを使って日付/時計と同時に「温度」、「湿度 」、「気圧」を表示させる予定です。
苦労したこと/その他
私にとってはわりと大がかりなプログラムになりました。ブリンクさせた時に、位置情報をどうするかや、0〜6のカウンタを使うことにより、どの情報を変更させるかなど、プログラムがC言語で良かったと感じました。また、曜日についても 0〜6のカウンターを用意し、変数箱を6個用意し、
リテラル情報で取得して表示させました。勘違いと言うのかはまってしまったのは、RTC情報はBCDで設定/読み出しさがされ、変更時の情報も無理やりBCDになるよう、乱暴なやり方で設定と表示をしています。どなたかスマートなプログラムをご教授願います!!
またハード面では、秋月電子通商のRTCモジュールは便利なように、I2Cのバスのプルアップ抵抗がJPのショートでアクティブにできるのですが、これをすると、バックアップ電池の消耗が激しく低下します。これに気付くのに時間がかかりました。あと注意する事はLCDです。
色々な種類のものがあるのですが、電源Pinの割り当てが違うものがあります。これをよく確認しないで接続するとLCDを壊します。私は1個壊してしまいました。(かなり古いものでもう手に入らないものなのであきらめも早かったです!!)
8年越しの製作です。ある意味「思い入れが」あります。嬉しい反面、まだまだ!と言う複雑な気持ちです。まずは、嬉しく思ってもいいのでは?前向きにものは考え、次なる野望に転換できるよう頑張りたいと思います。