PIC 16F648Aと闘う日々
プロポとPCを接続するためのマイコン入りアダプタを作っていました。
このアダプタを作ることが最終目的では全くないので、お金と時間は惜しむことにしました。
チップは秋月電子で200円で売っていた安いながらも比較的高性能なPIC 16F648Aを、開発環境はそこら辺に転がっていたMicrochipのIDEであるMPLABとCCS社の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 が投稿 :
固定リンク
|
|
|
トラックバックこのエントリーのトラックバックURL:
https://fenrir.naruoka.org/mt/mt-tb.cgi/489
はじめまして
不具合のあったコンパイラーのバージョンはいくつでしょうか?
628系のバグだとすると結構古いような気もしていますけど・・・?
PICはデバイスのバグもありますし、コンパイラーのバグもあります。
その当たりがじゃじゃ馬といわれる所以かも?
そうそう、コンパイラーはバージョンアップによって出グレードする場合もあります。(-o-;
登録したら、とにかく30日間の差分ファイルはすべてダウンロードするのが必須です。
あと、1年間のメンテナンス契約を申し込む方法もあります。(半額くらいの金額で1年間ダウンロードし放題)