jl7gmnのblog

yahooブログから移行してきました。アマチュア無線を中心としたブログです。

2013年05月

PICその15

一眠りしてしまったので、寝れないのでPICのLCD表示をやってみた。今回使用するPICはPIC16F88(18PIN)です。
既に、LEDの点滅は確認済みなので、同じ小型のブレッドボードに5V仕様のLCD(16文字X2行白色抜き文字表示タイプ(SC1602BBWB-XAーGB-G)を接続して確認してみた。
イメージ 1
イメージ 2
イメージ 3
とにかく動作サンプルとしての確認なので、何のプログラム修正もなくコンパイルが通るのでとてもありがたい。動作動画を下記に示します。
PICの選択もインタネット上で確認してみると当初予定していたPIC16F84Aの評判があまりよくないので、今回は無難にPIC16F88にしてみた。違いはA/Dコンバータ、PWM等がないぐらいなPIC16F84Aよりは用途があるが、LCDの動作確認だけとしては、ちょっともったいないかも?いずれにしてもサンプルプログラムでの液晶への表示は文字列で簡単にできるようなので超楽ちんだ。ちなみにLCD表示用の関数は以下の通りでした。
-----------------------------
lcd_goto(0x00);
lcd_write(0x0f);
lcd_puts("Hello world !");
lcd_goto(0x40);
lcd_puts("You can do it!");
-----------------------------
1行目の指定方法はlcd goto(0x00);//LCDの表示位置をホームポジション
2行目の指定方法はlcd_goto(0x40);//LCDの表示位置を2段目に
それぞれ文字の出力はlcd_puts("***~***");//LCDにメッセージ’***~***’を表示だ。
コンパイルはサンプルプログラムをダウンロードし、空のプロジェクトを作成、Source Files にmain.c lcd.cを右クリックのAdd Existing Item...でそれぞれ追加していく。ヘッダーファイルもHeader Files に同様にlcd.h を追加します。サンプル元でのMPLABは旧バージョンのMPLAB IDE v8.40とv8.90用なので最新のMPLAB X IDE v1.70ではプロジェクトを認識しないためです。最初はダウンロードしたサンプルがのコンパイラがHitech PICC Pro Lite mode v9.70で作成されていたので、例のごとく ___CONFIGをWindowsメニューのPIC Memory ViewsでのConfigurationでOutputへのCONFIGコードの出力を行い書き換えを行った。よくよく見るとMPLAB XC8 v1.12用サンプルも下の段にNewとしてあった。そのままやってもよかったのだが、結局はダウンロードをしてサンプル確認を行いました。
また、今回の液晶との接続用のケーブルが無かったので、単ワイヤーでマップピンでブレッドボードにさせるように作成しました。これが一番時間がかかりました。
 インターネットサンプル調査で、いろいろなLCDへの表示用の関数があるようなので、良い機能のものは取り入れ追加していこうと思っている。また先の7セグメントLEDのデータなどのシリアル通信でのデータ表示などもやろうかと思う。いろいろと表示の応用展開ができそうだ。
 本日は、LCD用の回路をブレッドボードで接続し、サンプルプログラムのコンパイルと動作確認でした。

PICその14

よくよく考えてみたらやはりPIC12F675(8PIN)での7セグメント表示は可能だ。前回はPIC12F675のシリアル通信ポートを例題通り(GPIO4、GPIO5)としていたが、この通信のポートはGPIO5が入力ポートとして動いている。GPIO4は出力ポートという具合だ。ということでGPOI3の入力ポートとしてしか動かせないのをシリアル通信の入力ポートであるGPIO5と入れ替えればよいのだ。早速ブレッドボード上の回路を組みなおした。XC8でのソフトウェアの方はserial2400.cのコード中のGPIO5をGPIO3に書き換える。GPIO5は出力ポートにしGPIO3は限定入力ポートとして下記のように定義書き換えをします。
--------------------------------------------
#define TxData  GPIO4
#define RxData  GPIO5 -> #define RxData  GPIO3
#define INIT_PORT  TRISIO = 0b00101001 -> #define INIT_PORT  TRISIO = 0b00001000
--------------------------------------------
後はmain.cのTRISIO をGPIO3だけ入力設定にする。serial2400.cと同じだ。GPIO3以外は出力ポートだ。
TRISIO = 0b00001000;
ついでに電源投入時に全出力ポートに出力してLEDが点灯するようにコード4つ付け足した。
GPIO0 = 1;
GPIO1 = 1;
GPIO2 = 1;
GPIO5 = 1;
他はswith構文中の出力の設定GPIO3を全てGPIO5に書き換える。
以上で完成です。万歳!!
PIC12F675でのシリアル通信での7セグメントの表示はポートなど不足しておらず、全く問題なくできるということです。
実際にパソコンのTERA-TARMから0から9までキーインプットした時の動作時の動画です。
あきらめずに限定しているところがないかとか、見直し、確認はする必要がある。特に他のサンプルを応用展開して作る場合は動作部分をそのまま利用するため、今回の様なポート等の問題が起き易い訳だ。
とにかく思ったようにちゃんと動作すると、こんな些細なことでも気分が良いものだ!

PICその13

さて、早速ソフトウェアのコーディングへと取り掛かった。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
----------------------------------------
実際のパソコンと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に対する数字が全て表示されるようになりました。
さて、シリアル通信がうまく動いてくれているので、やりたいことがたくさん思いつきます。シリアル通信の接続ケーブルレスのブルートゥースなんかコードレスで使い勝手がいいのでいずれやりたいなぁ~。

PICその12

まずブレッドボードで試しに7セグメントLEDを点灯させる回路を作ってみようと思った。前に作成したRS232Cのシリアル通信のデータ、つまりPCから送った数字データをLEDで表示させようという計画である。シリアル通信ではPCから数字データを送ってただパソコン画面に送られたデータを表示するというものだった。これをPIC側につけた7セグメントハードで表示しようということです。PCから送る対象の数字は0から9までと限定しようと思う。10進の数字という事です。16進だとアルファベットとかが入るので今回はPIC12F675の8PIN中の出力ポートを4個使うことでやってみようと思う。1電源、1グラウンド、4出力ポート、シリアル用2ポート で全PINがフル稼働だ。今回はA/Dコンバータは使わない。8ピンしかないので、7セグメント表示部はハードに任せることにしたわけです。この回路は4ビットで0から9までの表示を使い、後は使いません。ということで、ブレッドボードに作成した7セグメントLEDの表示部の写真を示します。
イメージ 1先に作成したジャンパーコードもふんだんに使って作成しました。使用した7セグメントLEDはカソードコモンの東芝TLR308です。表示用ゲートICはモトローラのMC14511Bと手持ちのゲートICです。入力ポートは必ずグランドに10数キロオームでプルダウンする必要がありました。プルダウン抵抗がないとLED表示が入力端子にのるノイズで不安定になり使い物にならない状態となります。必ずつけます。作成後の確認で4ビットの入力端子の下位から順番に”H”レベルを印加していくと1->2->4->8と表示され正常に動いているのが確認できました。
ハードの次はソフトウェアです。今回はほとんどがソフトウェアがウェイトを占める。表示部はできたから4ポートに数字にあわせたデータを送るソフトウェアを組むということです。先の232Cのシリアル通信のソフトウェアを改良します。その前にチェック用のPICの回路を新たにブレッドボードに組む必要がありました。なので今から組みます。ハードとの接続前に出力はLED表示の4ポートとしておきます。ソフトができたらLEDを7セグメント表示回路の4入力ポートとつないで完了というもくろみですが......どうなることやら?

PICその11

PIC用のブレッドボードで使うジャンパーコードがあまり数ないので間に合わせで作ってみた。百均でのマップピンがよさそうなピンの太さだったので利用した。ピンに線材を半田付けするのは少しテクニックがいる。あまりコテを当てすぎるとピンヘッドが溶けてしまうので、手際よく半田が解けて線材にしみこんだ瞬間でコテを離すタイミングがある。やってみるとわかるが、チト大変だ。が、何とか10cmもの12本、15cmもの6本を作り上げました。なおピンなので針先が鋭いため線材を扱うときには手に刺さないように注意が必要です。何度かピン先が手に刺さり痛い思いを少し。以下作製したジャンパーコードです。やはり秋月で買ったほうがいいかも?まずは間に合わせなので!!
イメージ 2
イメージ 1
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード
  • ライブドアブログ