試行錯誤の末の

とりあえず、構成は固まったかな。
SRAM一つにつきATTiny2313を一つ搭載して、データコピーや書き込み用拡張IOとして使う。
それの頭としてATMega64でデータ送信及びメモリアドレス発行、液晶クロック生成などを行う。
基本的にCでやりますよ、おいらは。速度がいるところはインラインアセンブラ使うけれど。

で、複数のAVRマイコンを並行して動かすときに、選択肢がいくつかって、

  • USART
  • SPI
  • TWI
  • ポートで接続(パラレル転送)
  • ソフトウェアで制御(シリアル伝送)

とまあ、今すぐに思いつくだけでもこれだけ。
SPIは3線、TWIは2線でデータを転送するんだけれど、これを実装するのにMega系のAVRであればたいていハードウェアでこいつらのっかっているのでいいんだけれど、Tiny系だとUSIというシフトレジスタやオープンドレインなポートを使って半分ソフトウェアで実装しないといけない。そこまで労力じゃないんだけれど、こういう言い方は嫌いなので、はっきり出来ないといいましょう。
ポートで直結させる方法を用いると、Tiny2313のポートの少なさから、それは出来ないんだよね。で、シリアル伝送を使うぐらいならUSI実装しろよという話でござる。
で、残るUSARTなんだけれど、これプロトコル自体はRS-232Cで、おいらはプログラムライタ用に買ったAE-UM232R(USB-シリアル変換チップFT232Rを内蔵したデバイス)があるので、こいつでデバッグできるわけだな。つまり、素ではなんも表示デバイスを持たないマイコンに2本線をつなげるだけでPCに情報を送ることが出来る。Tiny2313をいじくりまわしていたとき、これを使っていろいろやっていたのは過去の日記にも書いてある。
で、データシート読んでいたら「複数プロセッサ通信動作」という記述を発見。まず送信先バイスのアドレスを送って、それからデータを送る。データを受ける側はアドレスを読んでその後のデータを受けるか判断する。TWIも同じような仕組みで、というかIPも原理は同じだよな。
ヘッダのオーバーヘッドがある分少しだけ転送レートは下がるけれど、とりあえず動画をばばばーっと送るのはマイコンでは無理wwと思っているのでよしとしよう。

ATTiny2313のやることといえば、Mega64から来た命令に従ってメモリ操作を行う。例えばREADなんてコマンドが来た場合、メモリから出てきたデータを読み取ってそれを記憶する。その直後にCOPYというデータが来れば、直前にREADしたデータをメモリに書き込む、とか。
あと、これがたぶん基本となる操作で、Mega64から送られてきたデータをメモリに書き込む。WR0Fとかだと、0x0Fを書き込む。
この構成での一番のメリットは、メモリから液晶にデータを送るときに、Tiny2313を使わなくて済むこと。アドレスさえ発行してしまえば、既存データは吐き出せる。メモリに置いてあるデータを書き出すだけなら60fpsは余裕……だと思いたい。
一番よく使う、というか唯一使い物にあるであろう画面操作は別のアドレスに置いてあるデータをコピーして、既存画面に上書きするオーバーレイ操作でしょう。

と、取り留めない文章でした。
とりあえずATMega64は実装できないので、ATMega8で実験している次第です。Mega8のUART転送が実装できたので、Tiny2313と接続ですね(まだそこかよ……)。

ところでリングバッファ実装しようとしたら、割込みが暴走するんだけれど……。
送信だけ割込みにしてあとは、ポーリングで実装した。たぶんこれがバランスが取れているかも。