May 27, 2006

PIC 16F648Aと闘う日々

プロポとPCを接続するためのマイコン入りアダプタを作っていました。

このアダプタを作ることが最終目的では全くないので、お金と時間は惜しむことにしました。
チップは秋月電子で200円で売っていた安いながらも比較的高性能なPIC 16F648Aを、開発環境はそこら辺に転がっていたMicrochipのIDEであるMPLABCCS社のC言語の有償コンパイラ(バージョンが多少古く(3.174)、最新版(3.249)ではありません)を使用して、さくさくとやってしまうつもりでいたのですが、これが鬼門でした。どうやらCコンパイラのバクに遭遇してしまったようなのです。

とりあえず前回の記事にあるとおり、プロポに送るパルスをマイコンで作り、PCからそのパルス幅をコントロールすることができれば、目的を達成できます。今回はパルス幅の精度が命なのでタイミングにはこだわることにし、パルスを生成するためのタイマー、PCとシリアル通信するための機構であるUSARTはすべて割り込みを使って処理することにしました。

タイマーの割り込みについてはすんなりと動きました。ところがです、USARTの割り込みが全く動きません。CCS社のC言語規約によれば

#use RS232(baud=9600, rcv=PIN_B1 xmit=PIN_B2)

#INT_RDA
void invoked_by_sci_recieved(){ /* do some operation */}

void main(){
    enable_interrupt(INT_RDA);
    enable_interrupt(GLOBAL);

    while(TRUE);
}

のように記述すれば、USARTからのデータ受信割り込みを認識し、処理が行えるとのことです。しかしこのように記述しても全く動く気配がありません。

Webでこのような症状を調べてみると、次の2点が重要のようです。

  • データ受信割り込みはシリアル通信をUSART(ハードウェア)を利用して行うときのみ有効となる
  • use RS232を使用した際、送受信のピン(xmit, rcvで指定する)をUSARTのTX/RXに割り当てることにより、コンパイラが自動的にUSARTを使ったルーチンを生成する。さもなくば割り込みを使用することはできないが、シリアル通信をソフトウェア的に実現するためのルーチンが生成される。
僕のコードを見返してみると、確かにuse RS232のxmit、rcvは16F648A内蔵USARTのTX、RXに割り当てられています。

さらに調査をすすめてみると、同じ現象に遭遇している人がいました。CCS社のユーザーフォーラムによると、古いバージョンのコンパイラでは16F628に対してuse RS232がうまく働いていないようです。
16F628というのは、16F648Aと同じ18ピンマイコンで、親戚のようなものです。USARTを持っているコンベンショナルなPICは、PORT_Cにこの機能が割り当てられています。ところが、16F628や848Aは比較的新しいものであり、PORT_Bに割り当てられています。従って、古いバージョンのコンパイラでは、628や648Aに対しては、間違って内蔵USARTを使用しないソフトウェア的ルーチンを生成してしまっているものと思われます。このことはコンパイラが吐き出すアセンブラ(*.LST)を見てみるとわかります。

そういうわけで、コンパイラのバージョンをあげることを検討していますが、CCS社のコンパイラは購入後30日しかアップデートを受けられないようです。有償のソフトウェアなのだから、無償でアップデートできて当然(しかもバグなわけで)だと思うのですが、いわゆ保守の一環ということで駄目なのでしょう。

横着せずにフリーのコンパイラを使っていればよかったと反省しています。仕方がないので、別のコンパイラを使うことにしました。
またPICは安いなりに問題が発生するようで、H8とかSHの素晴らしさが改めて実感できるようになりました。PICで製品を作るというのは、よほど勇気が必要な気がします。

07:50 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/489
コメント

おめでとう!ついにきみもPIC用コンパイラのbugの餌食になりましたね。
誰もが一度は通る道ということで負けずに精進しましょう。
(そりゃもうひでぇ目に何度遭ったことか...)

Posted by: あおき : May 28, 2006 10:01 PM

はじめまして
不具合のあったコンパイラーのバージョンはいくつでしょうか?

628系のバグだとすると結構古いような気もしていますけど・・・?

PICはデバイスのバグもありますし、コンパイラーのバグもあります。
その当たりがじゃじゃ馬といわれる所以かも?
そうそう、コンパイラーはバージョンアップによって出グレードする場合もあります。(-o-;
登録したら、とにかく30日間の差分ファイルはすべてダウンロードするのが必須です。
あと、1年間のメンテナンス契約を申し込む方法もあります。(半額くらいの金額で1年間ダウンロードし放題)

Posted by: 軽石 : May 30, 2006 11:42 PM

>あおきさん
精進しましたよ、疲れました。例のブツはとても役に立ちましたが、あれはあれでApplication Designerで足されるシリアルが微妙のような気がします。ということで最終的にまたCCSに落ち着いてしまいました。

>軽石さん
はじめまして。バージョンは3.174で、現時点での最新版3.249にあげたら解消しました。同じような事態にあわれたことがあるのでしょうか、仲間を見つけた気がして非常にほっとしています(笑)。
PICとはチープソリューションの一環で長いこと付き合わざるを得ない気がしますので、今回の一件がこれから先の心構えということなのでしょう。

Posted by: fenrir : June 1, 2006 05:20 PM
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。