PIC×PICCによるシリアル通信(3)
長かったがPICCがインストール出来た。
さっそくbuild。ソースのコメントに日本語も使えるし、2バイト目に0x5cが来る文字も大丈夫そうだ。
なんかCSC Cのほうはシリアル通信のためのライブラリが用意されているようだが、PICCのほうには無いようだ。仕方がないのでデータシートを見ながら書いていくことにする。なるべくならAVR用に書いた usart.h とコンパチにしたいし…。
出力に設定したいピンは TRISのbitを0にしなければならない。普通逆じゃないの?と思わなくもない。
C++ではないのでintがここで宣言できない。ムカっときた。AVRのほうはnew/deleteは使えないものの、一応はC++だったんだけど…。
その後、私のテンションはもっとも低いところまで落ち込み、忠実に缶詰工場のロボットになった気分でAVR用のソースを置き換えていく。
データシートとにらめっこしながら書き換え終わるのに2時間。
・inconsistent type → PICCでは変数名「bit」は予約語のようだ。
static volatile bit GIE @ (unsigned)&INTCON*8+7;
bit型というのが存在するようで、上のように定義すれば
GIE = 1;
と書いたときにINTCONのbit7がsetされるようだ。これは、面白いアイデアだと思った。
・undefined identifier "FOSC" → 周波数として変数名FOSCを使ってるPIC用のプログラムのサンプルがあったのだが。設定するところもわからないので、仕方ないので自前のusart.hをincludeする前にdefineで設定することにした。どうせ自前で定義するならAVRと同じようにF_CPUという名前にする。
・non-prototyped function declaration for "sei" →Cでは、引数が無いときはvoidと書かないといけないんだったか…。(´ω`)
・illegal conversion between pointer types→ダブルクオートで囲まれた文字列をchar*を引数にとる関数に渡したらこのエラー。暗黙のconst→非const変換は許されないんだっけか。char*の引数をconst char*に書き直しておいた。
・受信割り込みと送信割り込みが分かれていない。両方とも
void interrupt serial_isr(void)
という関数に書いて、TXIFとRXIFを見て受信か送信かを判別する必要があるようだ。なんかダサい気がしなくもない。
・あと、こんなエラーが出た。
どうもBANK0に配列が入りきっていないようだ。いまどきBANKだなんて、何というCコンパイラ泣かせの腐ったアーキテクチャなんだ…。
bank1 volatile char usart_recvData[32]; // USARTで受信したデータ。ring buffer
bank1と配列の配置場所を指定することでこのエラーは回避できて、やっとコンパイルが通った。
しかし、PICをやると全く本質的ではないところで時間食われすぎる!PICめ!PICめ!!また一段とPICが嫌いになった。
ここまで書いてから気づいたが、PICCのincludeフォルダにstdio.hがあって、printfが使えるようだ…。*1 また思いっきり車輪の再発明をしてしまったのか?
おまけに、
C:\Program Files\HI-TECH Software\PICC\LITE\9.60\samples\usart
C:\Program Files\HI-TECH Software\PICC\LITE\9.60\samples\serial
には、usart.hやシリアル通信のサンプルコードがあった。こちらは、受信バッファなしなので、車輪の再発明ってこともないのかも知れない。
ところでこのusart.hを見ると…
#define DIVIDER ( (int)(FOSC/(16UL * BAUD) -1) )
これまた丸め処理がされてないよ…(´ω`) (関連記事→http://d.hatena.ne.jp/yaneurao/20080711)
HI-TECH社は、ハイテクという名前だけあってこの手のローテクは苦手そうだな、などとコンパイラベンダーのソースを添削して気を紛らわせてみたり。
(つづく)
*1:PICC-LiteとPIC16F84Aに依る組み込みC言語
http://www.geocities.jp/jk1brk/MISC/PIC/PIC_Index.htm