時間の単位 4MHzの水晶を使うため、1M命令/sの性能を持つ。 プリスケーラを1/256とすると、タイマの繰り上がりは毎秒15.258789回になるので、16回繰り上がるたびに単位時間が経過するとみなして、1.048576秒を時間の単位とする。 データを記録する形式 ICタグは32768通りまで作れることにする。 時間の経過は255単位時間まで作れることにする。 センサなどの情報は、14ビットまで使えるようにする。 データ終端は0xff 0xffで表すことにする。 データは2バイト単位で記録することにする。 前のバイト 後ろのバイト 0XXXXXXX XXXXXXXX: カードの挿入(0-32767) 01111111 11111111: カードの挿入(転送成功:7f ff) 01111111 11111110: カードの挿入(転送指令:7f fe) 10XXXXXX XXXXXXXX: センサの記録(14ビット:拡張用) 11111110 XXXXXXXX: 時間の経過(0-255) 11111111 11111111: 終了コード 11111111 11111110: 再起動コード 何もしない場合は、32単位時間が経過すると、時間の経過とセンサからの読みとり値を記録する。(センサがない場合はセンサのことは記録しない) 何かあった場合は、時間の経過があれば、経過した時間を記録した後で、行動の記録をする。 センサの記録は、32単位時間ごとに1回とする。 最後のワードに書いたら、次は先頭のワードから引き続いて書く。 書くときは、次の流れでやる。 ・0xffffを、現在の0xffffの次に書く。Incadr, write, Decadr ・今までの0xffffを本来のデータに書き換える。write, Incadr 内部状態として、最終ポイントの0xffffがある場所のアドレスを持つ。 cpth:上位アドレス cptl:下位アドレス アドレスは2バイト単位で管理。PICの変数には上位の16ビットが入る。 データは16ビット単位で、上8ビットを先に、後8ビットを後に書く。 電源が入ると、100ms待ってから、最初にffffが出てくる場所を見つける。 そこに、再起動符号fffeを書いて、その次にffffを書いて、 スタートする。ffffが見つからない場合は、再起動符号をアドレス0に書いてスタートする。 データを転送する形式 --最初に改行を2つ HELO --転送開始の意味 V=0001 --ファームウエアのバージョンコード(16進数4桁) A=f7d8 --転送開始時点での終端アドレス(16bit表記) D --ここからデータ(ここまでを送信開始ルーチンが書く) 9283 --最初のデータ(アドレスf7d7: Aより1つ手前から書き始める) 7394 5837 3262 9adc 7a6d be82 7fff --最後のデータ P=2ec6 --最後のデータのアドレス(16bit表記) END --終わりを意味する(送信終了ルーチンが書く) データは、アドレスを逆にたどりながら出力される。 S=0は、全部送信するモードで、最後のアドレス(0x01ffff)から最初のアドレス(0x0000)までを転送する。 S=1は、部分的に送信するモードで、現在0xffffがあるアドレス(終端アドレス)の1つ手前から、「転送成功」のカードの記録0x7fffか、終端データ0xffffが出てくるまでのデータを送り出す。 データは、2バイト単位で送る。 最初は、部分的に転送するモードしか実装しない。(ヘッダにS=1と書いたりもしない。) データを転送する通信方式 EIA-574インターフェースを用いる。 38400bpsに固定。 RTSを用いたハードウエアフロー制御に対応。 PICマシンからパソコンへの転送のみ対応(RTSとRxDのみ実装)。 およそ8秒間通信不能な場合は、送信が失敗したとしてあきらめるようにする。serrorが255になる。 改行コードはH'0a'とする。 転送を始める時には、必ずserrorを0にクリアする。 232の電源を入れる前には、100msは待つようにする。 232の電源を切る時にも、100msは待つようにする。 転送開始時にserrorを0にする。 転送中にserrorが発生したら、転送完了時点まで転送ルーチンは空回りし、何も出さない。 ICタグを読みとる方法 毎回ICタグにアクセスする。 アクセスして、ICがあることが分かれば読みとりを続ける。 読みとった後は、ICにアクセスできなくなって1.04秒たったら、再び読みとることができるようになる。 読みとった後は、1.04秒間LEDが点灯する。 ICには、 アドレス 値 0先 A'S' 0後 byteh: バイナリ 1先 bytel: バイナリ 1後 A'E' の順でデータを読む。 4バイトのデータを2回読んで、全てのデータが一致することが必須。 メモリは16ビットモードになっているので、アドレスは0と1の2種類しかない。 アドレス0の前半をバイト0、後半をバイト1とし、 アドレス1の前半をバイト2、後半をバイト3とする。 バイト0がA'S'、バイト3がA'E'でかつ、バイト1のビット7が0であることが求められる。 ICタグのIDは、バイト1が高位バイト、バイト2が低位バイトである。 途中でエラーになった場合は、ICが差し込まれていないとみなしてスキップする。 待機状態では、送信中でなければ1ループごとに50ms休止する。 ICタグを作るときの記録内容 送信指令 537ffe45 送信成功 537fff45 E1024メモリへの書き込み直後に、Verifyを行うことにした。 次のアドレスにffffを書いた直後にチェック。 目的のアドレスに目的の値を書いた直後にチェック。 違っている場合は、正しい結果を書き込めるまで、書き込みルーチンを繰り返させる。