先月末、依頼のあったPIC開発も無事終わったので、ついでに久々にホームページ上のキャラクタLCDによるシリアル通信モニターのファームウェアを更新した。対応したのはPIC16F1823を使用したタイプで、特に20文字4行のSC2004では何と8年ぶりの更新だ。ハイテック時代から現在のXC8コンパイラになってから、変換効率が良くなったので、アスキーモードとバイナリーモードを搭載できた。
Arduino等からシリアル通信を接続すれば、そのまま簡易表示器となるので便利だと思う。
キャラクターLCDは、最近のトレンドとしてI2CタイプのLCDが価格が安くて扱いやすいので、昔ほどキャラクターLCDが多用されなくなった。今度はI2CタイプのLCDでシリアルモニターを作ってみようか考え中。
以下は、MPLABXについて、つらつら書いてあるので、興味のある方だけどうぞ。
ところで、MPLABXについて少々情報を書きこんでおこう。
シリアル通信モニターを含めた私がホームページで公開している情報が古くなったので、そろそろMPLABX5以降でアップデートしなきゃと思っていたのだが、色々と問題があり、その一つ一つを解決していたら時間が過ぎてしまった。
例えば、昔のソースコードをMPLABXで読み込むと、互換を保つために、アップデートするかの質問でYesを選択し、コンパイラを最新に選択し直して更にYesを選択すれば、何も苦労せずビルドができるのだが、これを新規でフォルダを作った所から始めると、ビルドするのに一苦労だった。
MPLABX5.15 +XC8 Ver2.00以降は新規でソースをビルドする場合は以下に注意。
割り込み記述だと、
(旧)void interrupt handler(void) {
(新)void __interrupt () my_isr_routine (void) {
絶対アドレス指定だと、
(旧)foo[10] @ 0x2000;
(新)foo[10] __at(0x2000);
と書き直さないとエラーになってしまう。
また、
static bit LCD_RS @ ((unsigned) & LATA * 8 + 6)
とかは古い表記なのでエラーになる。
この場合は、
「レジスター名bits.ビット名」
を使い記述していくのが良い様だ。オートコンプリートが働くし、この方がむしろ後々のメンテナンス性が良い。 具体的には RA2と書くよりPORTAbits.RA2と書いた方が、どのレジスターのビットなのかが分かるし、PORTAbitsと打ち込んだ時点でMPLABX IDE側が候補を出してくれる。
そもそも、出力ポートにはPORT表記のRAやRBを使わないでLATAやLATBなどを使った方が良い。PORT表記はリードモデファイライトという、昔のPICマイコンの仕様で、ポートをセットしたつもりでも、容量性負荷があったり、マイコンの動作速度が速かったりするとセットされないという厄介な事象があるからだ。PIC16F1000以降やPIC32などはLATというラッチレジスタがあるため、この問題は回避される。新規でコードを書くならLATAとかLATBとかを使うべきだろう。
uint8_t、uint16_tと書き直したりしてC99準拠になるように合わせたり、
ビルド時に型の不一致のWarningが出ないように、
LCD_UsePort = (uint8_t)((LCD_UsePort & LCD_PortMask) | (c & 0x0f));
というように、符号なしは符号なしとして明示的に型を合わせたりして修正を行った。
型の不一致は、uint8_tとint8_tなど、条件分岐時に起きたり、関数の戻り値として
return (bool)FERR; などと、boolean指定にするなどをしていった。
ただ、取れないワーニングがいくつかあって、例えば「unresolved #include <alloca.h> in included .~」とワーニングでるのは別にxc.hが問題になっているわけではなくバグっぽい。
マイクロチップフォーラムより、
実質はビルドできるけどC99をC90にして回避するのが今の方法の模様。左側にあるスパナのアイコンをクリックして設定。
これで出なくなったけど、対処療法なので、次のアップデートで直ってくれることに期待する。
それと、希にコンパイルができない場合は、Tools→OptionsからXC8のパスを再検索すると直る事がある。その時はMPLABXを一回再起動し直した方が良いだろう。
開発環境は、マイクロチップに限らず、どのメーカーのマイクロコントローラーを使っても、それなりの問題は持っているものなので、こうやってブログなどで備忘録として書き留めて情報を共有しておくと良いかなと思っている。
最近のコメント