さて、早速ソフトウェアのコーディングへと取り掛かった。7セグメントに表示するコード自体はたいして難しいことは何もない。なにせ、PICからは数字にあわせて、BCDコードの4ポートへのオンオフ情報を出力するだけだからだ後はハードのゲートIC 4511が全てやってくれる。’1’の場合の例をwhile分中のswitchの中に記述します。
----------------------------------------
while(1){
kdata = getche();
switch(kdata){
case '1':
GPIO0 = 1;
GPIO1 = 0;
GPIO2 = 0;
GPIO3 = 0;
printf("\n\r 1");
printf("\n\r");
break;
}
switch(kdata){
case '0';
GPIO0 = 0;
以下省略・・・・・・・・・・・
----------------------------------------
printf分は通常のパソコン上への送り返し情報で’1’が送られてきたので、改行¥n、復帰¥r し ’1’を送り返しています。その後はパソコンのTERA-TARM画面上では改行と復帰をして、1行下へ打ち込んだ数字’1’の送り返しの’1’が表示されることになります。TERA-TARM上の ’1’の場合は以下のような状態です。
----------------------------------------
1
1
----------------------------------------
実際のパソコンとPICの動作画像です。数字の1から順に2、3、4、5、6、7、8、9.0,9,8,7,6,5,4,3,2,1とパソコンのキーをたたいて、TERA-TARMから送ったときのPIC側の7セグメント表示です。
動画を見ているとあれっ!何か変だと気づきませんか? 7セグメントの表示した数字と左側のグリーンの出力ポートのLEDが正常な動作をしていない感じがする?実は失敗した?いいえ失敗はしていないのですが、PIC12F675の出力ポートを4ポート(GPIO0,GPIO1,GPIO2,GPIO3)使っていたのですから出力は正常にでているはずです。ここに罠がありました。出力ポートのつもりで、TRISIOでポート設定していたGPIO3は実は入力はできるが、出力はできないポートなのです。入力でしか使用できない仕様なのでした。覚えていたつもりが忘れていました。
つまり2の3乗が動いていないのです。ずうっと0のままということです。なので8進数表示になってしまっていました。0->1->2->3->4->5->6->7->0->1->0->1->0->7->6->5->4->3->2->1 8と9が表示の桁上がりでの下位表示の1と0です。ということで0から7までのシリアル通信で送られた数字は見事にPICで7セグメント表示できていました。しかし何か面白いです。BCDの出力を16出力に変えるLineDecoderの4514B(アクティブH)ゲートICなんぞを使うと、パソコンの数字キーにたいしてPICの4出力に対し出力ポートがマジック的に増えたSWにもなりますからHi。PICの出力4ポートを16進で扱ったわけですから、表現数は16個で個別に制御できますから当たり前といえば当たり前ですが!!
いずれにしても、出力ポートが足りないPIC12F675(DIP8P)ではシリアル通信での7セグメント表示は限界か?やはりPICのポートを増やさないと無理だなぁ!!
PICの仕様は確認すべし!!ですね。
あっ忘れていましたが、シリアル通信のコードで書き直してもどうしても最初のGPIO0の出力が出ないトラブルがありました。main.cのプログラムばかり見ていたので、いろいろと初期設定等を書き直したりしていましたが、まったく出力LEDがつきませんでした。原因はkdata = getche();の関数が関係していました。キー入力を変数に入れる部分で、このgetche()はserial2400.cの中に書かれています。このコードが原因でした。
#define INIT_PORT TRISIO=0b00101001
と定義されています。これはシリアルポートのGPIO4とGPIO5のポート設定用だったのですが、出力ポートのGPIO0が入力ポート指定になっていました。元のサンプルではGPIO0ポートをA/D変換の入力ポートとして使っていたためです。A/D変換の入力ポートは今回はずしたので、GPIO0を出力ポートで使うに変える必要がありました。
#define INIT_PORT TRISIO=0b00101000
に変えてやっとGPIO0に対する数字が全て表示されるようになりました。
さて、シリアル通信がうまく動いてくれているので、やりたいことがたくさん思いつきます。シリアル通信の接続ケーブルレスのブルートゥースなんかコードレスで使い勝手がいいのでいずれやりたいなぁ~。