LCDライブラリを整える
2014-06-07
ワールドカップが近づいてきました。今朝は、本線前の最後のテストマッチとなるザンビア戦。1993年に不幸な事故に見舞われたザンビア代表がその後メキメキと頭角を現し、2年前のアフリカネーションズカップで優勝したのは記憶に新しいところ。本線前のマッチメークとしては、非常に恵まれたものとなりました。
昨晩は飲み会で遅くに帰宅し、試合直前に目覚めたものの見事な宿酔い・・・それでもしっかり観戦しました。打ち合いとなった試合に本戦への一抹の不安を感じつつ4-3という辛勝を見届け、ツイッターをのぞき見し、そして早めの昼食。すると、体内残存のアルコールが再度回り始め、なんと
ちょっとダラダラの週末になってしまいました
さて、そろそろ梅雨を迎える時期となり、春の工作祭りは何処・・・ってな塩梅ですが、作りたいものがどんどんと移り変わってしまい、どういうわけか「LCD表示用のPIC用ライブラリをC言語で作らねば
」というところに落ち着きました。LCD表示は、既にLCメータ製作の過程で制覇していますが、その後「生産性重視」を念頭に、アセンブラからC言語へメイン開発言語をスイッチしたため、C言語で組み直してライブラリ化しようと計画したわけです。
まぁ、ライブラリと言っても本格的な「リンクするだけで使える」というようなものにはせず、必要に応じてヘッダファイルのみ書き換えてリコンパイルする・・・お得意の「ナンチャッテ・ライブラリ」です
最近のLCD制御は、制御信号数が少なくて済む「I2C」にも及んでいますが、LCDの表示バリエーション・・・何文字何行という形での選択肢を考えると、ポピュラーなパラレル制御のものを準備しておくのも意味がありそう。しかし、技術的には何の面白みもないものを作ることになります。実はこれが「うわぁ・・・超億劫
」という気持ちを誘い、なかなか着手しなかった原因。満を持して・・・というより、仕方なく・・・といったテンション低めのプログラミングでしたが漸く完了させました。
今回のコンセプトは、ヘッダファイル定義の変更のみで(リコンパイルすれば)まずまず使える・・・ってなものです。結局、以下のようになりました。
1) LCDとして「2行」のタイプを網羅、4行タイプは16,20文字に対応
特にソフト処理部分での工夫はないが、表示文字のライン、カラムを関数パラメータにして対応。
2) CD制御のインターバルにはタイマを用い、よく使うクロックに対応
0.5,1,2,4,8,16,32MHzに対応。
3) タイマ#2に加え、拡張ミッドレンジに具備されているタイマ#4,6にも対応
タイマ#2を別用途で使う場合に対応。
4) 使用する4ビットの制御ポートは上位/下位4ビットの何れにも対応
4ビットが飛び飛びに設計されるということは考え難いため、上位4ビットか下位4ビットかを設定。
2) から4) までの部分の変更は「lcd.h」というヘッダファイルで設定できるようにしました。

特に工夫した点は、タイマ#2には「Fosc/4」が供給されることから、分周比を160としてPR2の設定値を選択的に設定することで、殆どのクロックに対応できるようにした点です。タイマ#4,#6も、この部分は同様になります。

ソースファイルの「lcd.c」の先頭で「lcd.h」で設定した値を引き込み、プログラム・コード部分で使うラベルに変換しています。これらの値を使って、使用するタイマの設定を行います。

プログラム部分では、上位/下位4ビットの選択によって必要なニーモニックを生成するようにしています。
プログラムサイズは、上記の設定を適宜変更してリコンパイルしますので、タイマ#2使用時に212バイト、タイマ#4,#6で217バイトになりました。アセンブラで組むよりは大きくなりましたが、拡張ミッドレンジではメモリも比較的大きいため問題ないでしょう。
さぁ、デバッグして早く使えるようにしないと・・・。
昨晩は飲み会で遅くに帰宅し、試合直前に目覚めたものの見事な宿酔い・・・それでもしっかり観戦しました。打ち合いとなった試合に本戦への一抹の不安を感じつつ4-3という辛勝を見届け、ツイッターをのぞき見し、そして早めの昼食。すると、体内残存のアルコールが再度回り始め、なんと


さて、そろそろ梅雨を迎える時期となり、春の工作祭りは何処・・・ってな塩梅ですが、作りたいものがどんどんと移り変わってしまい、どういうわけか「LCD表示用のPIC用ライブラリをC言語で作らねば

まぁ、ライブラリと言っても本格的な「リンクするだけで使える」というようなものにはせず、必要に応じてヘッダファイルのみ書き換えてリコンパイルする・・・お得意の「ナンチャッテ・ライブラリ」です

最近のLCD制御は、制御信号数が少なくて済む「I2C」にも及んでいますが、LCDの表示バリエーション・・・何文字何行という形での選択肢を考えると、ポピュラーなパラレル制御のものを準備しておくのも意味がありそう。しかし、技術的には何の面白みもないものを作ることになります。実はこれが「うわぁ・・・超億劫

今回のコンセプトは、ヘッダファイル定義の変更のみで(リコンパイルすれば)まずまず使える・・・ってなものです。結局、以下のようになりました。
1) LCDとして「2行」のタイプを網羅、4行タイプは16,20文字に対応
特にソフト処理部分での工夫はないが、表示文字のライン、カラムを関数パラメータにして対応。
2) CD制御のインターバルにはタイマを用い、よく使うクロックに対応
0.5,1,2,4,8,16,32MHzに対応。
3) タイマ#2に加え、拡張ミッドレンジに具備されているタイマ#4,6にも対応
タイマ#2を別用途で使う場合に対応。
4) 使用する4ビットの制御ポートは上位/下位4ビットの何れにも対応
4ビットが飛び飛びに設計されるということは考え難いため、上位4ビットか下位4ビットかを設定。
2) から4) までの部分の変更は「lcd.h」というヘッダファイルで設定できるようにしました。

特に工夫した点は、タイマ#2には「Fosc/4」が供給されることから、分周比を160としてPR2の設定値を選択的に設定することで、殆どのクロックに対応できるようにした点です。タイマ#4,#6も、この部分は同様になります。

ソースファイルの「lcd.c」の先頭で「lcd.h」で設定した値を引き込み、プログラム・コード部分で使うラベルに変換しています。これらの値を使って、使用するタイマの設定を行います。

プログラム部分では、上位/下位4ビットの選択によって必要なニーモニックを生成するようにしています。
プログラムサイズは、上記の設定を適宜変更してリコンパイルしますので、タイマ#2使用時に212バイト、タイマ#4,#6で217バイトになりました。アセンブラで組むよりは大きくなりましたが、拡張ミッドレンジではメモリも比較的大きいため問題ないでしょう。
さぁ、デバッグして早く使えるようにしないと・・・。
- 関連記事
コメントの投稿
3枚目が拡大されません><
こんばんは!
自分もライブラリ作ってみたいけれどもどうやっていいのか分からず、いまのところ前に書いたソースをコピペして使いまわしています^^;
キャラクタLCDのライブラリはいろんなところで見かけますが、自作したほうがかえって使いやすいのかもしれませんね。
自分もライブラリ作ってみたいけれどもどうやっていいのか分からず、いまのところ前に書いたソースをコピペして使いまわしています^^;
キャラクタLCDのライブラリはいろんなところで見かけますが、自作したほうがかえって使いやすいのかもしれませんね。
コピペ・ライブラリの方が…
ぶんきゅうさん、こんにちは。
3枚目の拡大不可、ご指摘アリです。拡大できるよう修正しておきました。
ライブラリ化は、解ってしまえば別に難しくないんですが、ぶんきゅうさんのように「ソース流用」の方が後々の改変が楽ですから、専ら自分もそうしています(今回のLCDのものもそうしています)。
本格的にライブラリ化するなら、やはりアセンブラで出来るだけコンパクトに作らないと…と欲が出て、さらに遠回りしそうですしね(^^;)
兎に角、ヘッダファイルをきちんと作っておき、どんな機能にしたかをReadmeにでも記述して、一緒に固めておけば十分でしょう。
3枚目の拡大不可、ご指摘アリです。拡大できるよう修正しておきました。
ライブラリ化は、解ってしまえば別に難しくないんですが、ぶんきゅうさんのように「ソース流用」の方が後々の改変が楽ですから、専ら自分もそうしています(今回のLCDのものもそうしています)。
本格的にライブラリ化するなら、やはりアセンブラで出来るだけコンパクトに作らないと…と欲が出て、さらに遠回りしそうですしね(^^;)
兎に角、ヘッダファイルをきちんと作っておき、どんな機能にしたかをReadmeにでも記述して、一緒に固めておけば十分でしょう。