SDRの新タコメーターをつけたところ、水温計がチャカチャカ動いて面白い。
iPhone 001

けど、やっぱりちょっと眩しいかな、、、。特に赤いデジタル水温系は目立つ。
スモークのアクリルに加えて、更にフィルム貼ってるんだけど、まだ明るい。
メーターなんて、前方視界を妨げない様に、必要最低限の明るさであるべきなので、今後考慮が必要かも。
作るときの理想と動体での現実。



CDIの方はインターフェイス部分を書いてる途中。
後で後悔しないために色々と仕様を検討しながら作ってるので、遅筆。

やり取りするのは
1) CDIの動作に必要なデータをフラッシュメモリへの書き込み
2) 同じく読み込み
以上が必須のもので、追加で
3) 動作中のステータス(回転数とか点火時期とか)

この3点だけ。


例えばフラッシュメモリをPC側で読み出すのはこんな感じ。
PC側。HIDAPIを利用。

printf( "GET DATA selected\ninput address?>" );
input = get_number();
packet.bin[0] = 0x00;
packet.bin[1] = 0x80;
packet.bin[2] = input;
puts("--->send packet");
putbin((unsigned char*)&packet);
retval = hid_write(handle, (unsigned char*)&packet, 65);
retval = hid_read(handle, (unsigned char*)&packet, 64);
puts("--->read packet");
putbin((unsigned char*)&packet);


これを受けてPIC側。
こちらはmicrochip社のbootloaderフレームワークを流用。

switch(PacketFromPC.Command)
case 0x80:
if(!mHIDTxIsBusy()) {
Addr = 0x1D00 + (PacketFromPC.Contents[1]*32);
if( Addr > 0x1FFF ) {
PacketToPC.Contents[0] = 0xFF;
} else {
PacketToPC.Contents[0] = 0x00;
}

PMADR = Addr;
for(ii=4; ii<32+4; ii++) {
PMCON1bits.CFGS = 0;
PMCON1bits.RD = 1; // Enable read operation
NOP();NOP();
PacketToPC.Contents[ii+0] = PMDATL;
// ignore hi byte
PMADR++;
}
HIDTxReport((char *)&PacketToPC, USB_PACKET_SIZE);
ReadState = IDLE;
}
break;


こうやって、PCからのリクエスト、PIC側での返答をボチボチ実装していく。
PIC側から能動的にPCに返す事は無い。

フレームワークが何とか動き始めたので、後は必要な部分を書いていけば良いので気持ちは楽。
USBのプロトコルに真面目に取り組んでイチから実装してみたい気もするけど、先にやる事やってからか。

チョイ覚書:
PICのデータメモリとプログラムメモリのアクセス速度は微妙に違う。
例えば

const int a=0;
int b=0;
int x;

x=a;   --(1)プログラムメモリからデータメモリへのコピー
x=b;   --(2)データメモリからデータメモリへのコピー

とした場合、(1)は4サイクル、(2)は6サイクル必要。
リマップが可能なCDIを考えた場合、設定はconst領域(フラッシュメモリ領域)に入れないと書き換えが出来なくなるし、電源オフした瞬間に全て忘れてしまう。

たった2サイクルだけどループで回す時等はちょいと考慮しておけばよいと思う。