OpenStickファームウェア更新(PIC18F2553対応)

OpenStickのファームウェアを更新した。

少し前まで秋月電子でのPIC18F2550の価格は¥350程度だったが、最近みたら¥500になっている(円安のせい?)。 一方、兄弟品種のPIC18F2553は現在¥420で若干安く、でこちらを使いたい。 何が違うか調べたらA/Dコンバータが18F2550では10bitに対し18F2553は12bitになっておりそれ以外の違いは見当たらない。

試しに18F2553をそのままOpenStickとして動作させてみるとブートローダやファーム、コンフィグファイルは同じ様に書き込める。問題はA/Dが12bitの部分。
OpenSitckでのアナログ値は10bit(0~1023)のA/D変換結果を4で割り、8bit値(0~255)としてPCに送っていた。しかし18F2553の場合A/D変換結果が12bit(0~4095)なので16で割る必要がある。
そこでデバイスIDを基に幾らで割るかを決定する様に変更し、これで同じファームを両方に使える様になった。

ところでデバイスIDを読み取る部分で少しハマった。
C18(未だにMPLAB-IDEのC18を使っている)で次の様に書くと、デバイスIDは正常に読めるのだがこの後の動作がおかしくなりUSB機器としてPCに認識されなくなった。

unsigned char dev;
dev = *((rom char far *)0x3fffff);

どうやら原因はTBLPTRU(SFRの0xfe8番地)の内容が書き換わる事が影響している模様。そこで・・・

unsigned char dev;
unsigned char tblbuf;
tblbuf=TBLPTRU;    // 退避
dev = *((rom char far *)0x3fffff); 
TBLPTRU=tblbuf;    // 復帰

・・・の様に退避/復帰させると正常動作する様になった。
これってC18のバグではないかと思うが、いつまでも古い環境を使うのがイケナイのだろう。