PICで気圧計 by 18LF2550 先ずは C言語 で LCD表示!


やっとC言語でLCDが稼働しました。まだ、気圧センサー外してありますが、回路は前回の通りです。



下記C言語サンプルソースは、
「改訂版 電子工作のための PIC18F 本格活用ガイド 後閑哲也 氏著 技術評論社」

のLCD用参考プログラムを、HI-TECH C Pro for PIC18 MCU (Liteモード)用に変更と、一部の修正をして、
MPLAB IDE v8.50 上の統合環境で、HI-TECH C Pro for PIC18 MCU Family V9.63PL3 を 無償のLiteモードを使用し、アセンブル、コンパイルしました。出来上がったHexファイルを、秋月電子通商のAKI-PICプログラマー Ver.4でPIC18LF2550へ書込みました。


のLCD用参考プログラムを、
MPLAB IDE v8.88 の統合環境の元で、
HI-TECH C Pro PIC18MCU (Liteモード) v9.80用に変更し、 一部を修正して、コンパイルして、
MPLAB IDE v8.88 の統合環境から直接USB接続の秋月電子通商のPICkit2もどきのゼロプレッシャーソケットからPIC18LF2550へ書込みました。(Dec. the 3rd. 2012)

ファイルは、lcdcont2.c、lcdlib18.h、lcdlib18.c の3つです。

HI-TECH C の無償バージョンであるLiteで注意すべき所は、標準ディレイ関数のDelayMs()がフルオプションバージョンでも正しく動作しない事です。それは、フルオプションバージョンでは、CPUのクロック(Fosc)が12MHzを超えている場合には、これをDelayUs(250)のループに置き換えてコンパイルする様に薦めています!CPUのクロックが12MHzを超えている場合には、短くなるからだと言っています。しかもこの推奨された対策方法は、必ずフルオプションバージョンでコンパイルする様に!と書いています。

* Functions available:
* DelayUs(x) Delay specified number of microseconds
* DelayMs(x) Delay specified number of milliseconds
*
* Note that there are range limits: x must not exceed 255 - for xtal
* frequencies > 12MHz the range for DelayUs is even smaller.
* To use DelayUs it is only necessary to include this file; to use
* DelayMs you must include delay.c in your project.

* MAKE SURE this code is compiled with full optimization!!!

実はこの対策をLiteバージョンで行おうとすると、DelayMs()ばかりではなく、DelayUs()ルーチンも含めて、__delay_ms()、__delay_us()もCPUのクロックと設定数値に以下の様な制限があって、コンパイルエラーになり上手く対策できません。
しかも、このコンパイルエラーがいったいどうして出るのか知らないと、途方に暮れてしまいます。

詳細はair variableさんのコンテンツの無料PIC最強開発環境のページ
http://www.ne.jp/asahi/air/variable/picmel/index.htm
のOtherのワンポイントのページ内の
「PICC Pro9.60PL3以降をLiteモードで使用するときの__delay_msと__delay__usの使い方」
を参照して下さい。

Liteモード時のディレイ時間の上限値
動作周波数 最大時間 __delay_ms(x) __delay_us(x)
20MHz 39,424us __delay_ms(39); __delay_us(39424);
16MHz 49,280us __delay_ms(49); __delay_us(49280);
10MHz 78848us __delay_ms(78); __delay_us(78848);
8MHz 98560us __delay_ms(98); __delay_us(98560);
4MHz 197120us __delay_ms(197); __delay_us(197120);

これは、Liteバージョンでは、ディレイルーチンによって生成されるサイクル数が197,120サイクルまでとなっている為にこのような事になるのです。これは、Liteバージョンが最適化を行わない事と深く関係が有る様ですが、実につまらない制限です。無償だから致し方ないのでしょうが・・

この制限を超えると、コンパイルエラーになってしまってHexファイルが生成されません。

この表によれば、今回のCPU内部クロック(Fosc)は16MHzで、1回に呼べる最大は、49msとなります。
これ以上のディレイを得るには、この最大値を繰り返して呼び出す事になります。

今回は、例として1秒のディレイを得る為に、40msのディレイを5回繰り返して0.2秒を造り、それをさらに5回くりかえして1秒を造っています。

Liteバージョンを使用して40ms以上のディレイを使う様な、外部とのI/Oルーチンを設計する際には、特に気をつけなくてはなりません。私は、この事を知らなくて、さまざまな、HI-TECH C のサンプルが動かず、ましてや他社の参考プログラムも動かず、何日もの間、七転八倒の苦しみを味わいました。

今回の私のサンプルプログラムも、40ms以上のディレイを使っているので、CPUクロック(Fosc)が20MHz以上の場合にはコンパイルエラーになってしまいますので、気をつけてください!

未だに、HI-TECH C のマニュアルの何処にこの事が書かれているのか見つかりません。

さて、これでようやくアセンブラーからHI-TECH CでLCDのコントロールが出来る様になったので、パレットソフトさんの気圧センサーユニットルーチンを移植する準備ができた訳です。
(May. the 8th 2010)


注意事項
General disclaimer
トッ プページへ

なお、当ホームページで公開しているデーター(写真、音声)等を個人の枠を超えて複製・転用する事はご遠慮下さいませ。
ご意見/苦情/ご感想はこちらまで