« PIC16F88のRA5はなんと | トップページ | 韶関(Shaoguan)ってどこ? »

2007年3月26日 (月)

PIC16F88でLCD表示

  パターンミス、仕様書理解不足、初期化問題、20年ぶりのC言語などの壁にぶちあたりながらも、ようやくLCDのドライブに成功したので報告です。
私と同じレベルの人には、非常に役に立つ情報だと思います。

素材:マイコン  Microchip社 PIC16F88
    LCD    SUNLIKE社 SC1602BS*B
    BUZZER、LEDなど

環境:デバッガ  Microchip社 MPLAB
    コンパイラ CCS社 PCM 

今現在の目標は、ジェットエンジンのコントローラーの制御パネル作成です。とりあえず、2桁x16行LCDの表示ができないと、何も進まないので、そこからスタート。20年ぶりのC言語ですら高い壁でしたが、結局仕様書だけでは読みきれない事もあったので、報告しますね。最大の難関は、LCDの初期化でした。

何も考えず電源の5Vだけ供給すると、2桁の上の表示だけ、真っ黒になります。
これは、初期化していない状態です。
初期化が中途半端だと、上の表示だけ薄暗くなります。←まともに動きません。まともに初期ができない人は、次をよく注意しながら回路、ソフトを見直してください。

【初期化できない原因】
16F84などのLCDライブラリを、そのまま移植しても、うまく動きません。下記のチェックポイントをよく見直すべし。

①電源の立ち上がりがおそい
  ちゃんと初期化シーケンスができているのに、
  初期化できない場合は、電源の立ち上がりが
  遅い可能性があります。
  初期化の初めは、15msecのWaitからですが、
  LCDの初期化条件は、
  「電源が4.5Vに達してから15msec」です。
  自分の場合は、100msecを入れるとまともに
  動くようになりました。初めてトライするときは、
  200~300msecのWaitからはじめると良いでしょう。

②余計なStrobe(E)信号がでてしまう
  ポートの出力をしていると、その気が無いのに、
  ストローブ信号が出てませんか。
  オシロがあればいいですが、無ければデバッガで
  見てください。

③Strobe(E)信号前、信号中のwaitが少ない
  ストローブをHighにする前に40usec、
  ストローブをLowにするまでの間230usec必要です。

④初期化中に、4bitと8bitを間違える
  初期化では、「0x30」3回のあと、「0x20」を送りますが、
  「0x20」は8bitモードで送信して下さい。
  (あたりまえですね?)

⑤PIC16F88のRA5は入力しかない
  この石で、RA5からアウトプットしようと思ってもできません。
  仕様書をよく読むべし。

⑥はんだ付けを甘く見ない
  悪いこと言わないので、テスターで見直してね。
  (最初にね)

⑦LCDの無使用ピンは、グランドに落ちてるかい?

【サンプル回路】
面倒なので、載せませんが・・・
下記の通りつないでください。PIC16F88は、ポートBにシリアルとかがあるので、私はLCDをポートAにつなぎました。データは4bitバスです。添付のライブラリは、ポートAで、しかもRA0~RA3に、LCDのDB4~DE7を接続して初めて動きます。RA5は"In"専用で、"out"できない為こうなった。(ここで10時間くらいはまった)
下記と違う接続をしても動かないので、あしからず。
RA4~RA7に、LCDのDB4~DB7をつなげる場合は、ライブラリのswap(xxxx)を抜いてください。

// RA0 out LCD_DB4
// RA1 out LCD_DB5
// RA2 out LCD_DB6
// RA3 out LCD_DB7
// RA4 out LCD_R/W         //read/write
// RA5 In   No use
// RA6 out LCD_RS           //chip select
// RA7 out LCD_E             //strobe

// RB0 out No use
// RB1 out No use
// RB2 out No use
// RB3 out No use
// RB4 out BUZZER
// RB5 out LED
// RB6 out No use
// RB7 out No use

【サンプルプログラム】 「PIC16F88_LCD_TEST.c」をダウンロード
上記環境で、とりあえずLCDの表示をするためのサンプルプログラムを作ったので、紹介します。Dscf0207Dscf0206
1. お約束の "Helo !"表示
2. そして、"Helo !"が右に行ったり、左に行ったり、最後は右にフェードアウト

3. 突然カウントダウンが始まる 10→9→8・・・
4. "ENGINE " → "ENGINE START !"

5. 全エリア表示
プログラムでは、LEDやブザーもピコピコ言わせてるので、とりあえず、LCDとその他回路の検証が簡単にできるようになってます。


自分のプログラムスキルが、たいしたこと無いので、あんまり難しいことはしてません。ポインタなんか使ってないので、C言語初心者の人は参考になるかも。

【LCDライブラリ】 「lcd_lib.c」をダウンロード
無理やりライブラリを作りました。(もはや財産!)
もっとスマートに作れそうですが、自分にはこれが限界です。


LCD表示をするために、必要不可欠な関数や、全てのコマンドも準備しました。
コマンドについては、ライブラリの#defineを参照してください。仕様書見てもなんだかよくわからない人は、このコマンドを使ってね。


//  lcd_init()                    イニシャライズ
//  cd_clear()                  クリアディスプレイ
//  lcd_ready()                 ビジーチェック
//  lcd_cmd(cmd)             コマンド送信(cmdにコマンドを入れて送る)
//  lcd_data("string")        文字を送信する("string"部分に文字を入れると表示する)
//  lcd_cur_set(Line,pos)   好きな場所にカーソルを移動させる
                 Line= 1 or 2 , pos= 左からの文字数
//  lcd_ltoa_out(long, digit)  桁数を指定して、数字を表示する
                   long= int or long の数字(最大65535)
                   digit= 桁数(最大5桁)


【PICのCコンパイラ】
PICには、いくつかのCコンパイラがありますが、情報が豊富、サンプル豊富、そんなに高くない、Webで購入できる。などの理由で、CCS社のコンパイラがお勧めです。
CCS社のコンパイラは、PICの種類によって、違うので注意。
また、下記の3種類は単独では動きません。MPLABにビルトイン(合体)させて初めて動くので、よくわからない人は、何で動かないんだろうと、悩まないでね。

PCB 12bitPIC  125ドル
PCM 14bitPIC  125ドル
PCH PIC18    175ドル
詳しくは、http://www.datadynamics.co.jp/ccs/pcwide.html
日本の代理店もありますが、値段は倍です。


MPLABと統合(ビルトイン、合体)させるためのプラグインはここ
Download the MPLAB® IDE Plug-in

合体方法の説明はここにもあるよ
http://www.datadynamics.co.jp/ccs/picc.html
 

【Special Thanks !】
お世話になったページ

電子工作の実験室
http://www.picfun.com/

SPECTRUM電磁工作のページ
http://speana-1.hp.infoseek.co.jp/index.htm

Cのもくじ
http://www9.plala.or.jp/sgwr-t/c/index.html

Microchip社
http://www.microchip.com

Microchip社 MPLAB IDE v7.xx (タダ)
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002

CCS社
http://www.ccsinfo.com/

CCS社 PCMコンパイラ
(125ドル カードで注文、メールで配達!)
http://www.ccsinfo.com/product_info.php?cPath=Store&products_id=PCM_full

CCS社 日本語マニュアルなど
http://www.datadynamics.co.jp/ccs/overview.html

|

« PIC16F88のRA5はなんと | トップページ | 韶関(Shaoguan)ってどこ? »