Top Page Index About Link Mail Form

MMCカードでゲームをお気楽選択

"LED Game for AVR" に MMCブートセレクタを追加する

→DC-DCコンバータ編へ

久しぶりの AVRの本

 2007年2月1日に電波新聞社から「わかるマイコン電子工作 AVRマイコン活用ブック」という本が発売されました。難しいしくみはまあ、置いといて、とにかく作って遊ぼう、という主旨の初心者・中級者向けの本です。その中に「LED Game for AVR」というマイコンボードが載っていて、キットも発売されています。6つのボタンと 16x16ドットの LEDパネルがあるだけのものですが、リンク先の LEDの動きを見るとなんかわくわくしてきます。→LED Game for AVR(YouTube)

 この本でうちのページの MP3プレーヤーなどのソースを参考にされたこともあり、執筆者の松原さんからこのキットを1台ゆずっていただきました。「Space Fight」「Missile」とか入れてみて遊んでみると結構楽しい。わたしの場合は8ビットパソコン華やかなりし頃を知っているのですが、なんかそれを思い出したりして。

LED Game for AVR  さて、このキットはあくまでも自作をする人向けなので、ゲームを入れ換える際は AVRプログラマをつないでパソコンでファームウェアを書き換えなければなりません。自作野郎であってもさすがにめんどくさい。というわけで、MMC/SDメモリーカードからファームウェアを読み込んで書き換える物を作ってみました。

回路図と作り方

MMCを使うための追加回路図

 回路的には上記のものを追加するだけです。今回は初心者向けの本が元ネタですので、いつもより詳しく紹介します。MMC/SDメモリーカードコネクタは秋月で 150円で売っているものを使います。今のところこれが一番安くて入手しやすいでしょう。抵抗は上の図では 51kΩを使っていますが、50〜100kΩの間であれば結構です。コンデンサは 10μFの電解コンデンサと 0.1μFのセラミックコンデンサをつけます。セラミックコンデンサはできるだけ MMC/SDメモリーカードコネクタに近い位置につけてください。

メモリーカードコネクタのまわりの配線 メモリーカードコネクタのまわりの配線

 片面の万能基板を LED Game基板と同じサイズに切り出し、四隅に穴を空けて重ねる状態にします。万能基板のはんだ面にメモリーカードコネクタや抵抗などをはんだづけします。片面の万能基板は熱を加えすぎるとパターンが簡単に剥がれてしまいますので注意してください。

信号名 ATmega168 CN1 MMCコネクタ
VCC 7 2 4
MISO 18 1 7
SCK 19 3 5
MOSI 17 4 2
CS 26(PC3の場合)
5(PD3の場合)
- 1
GND 8 6 3, 6

 6本のリード線で LED Game基板と接続します。メモリーカードコネクタの反対側は CPU(ATmega168)と配線します。直接 CPUソケットの足にはんだづけしてもいいですが、この写真では ISPコネクタに接続しています。また、ついでに圧電スピーカーも実装しています。特にコンデンサも抵抗もなしに直結していますが、3.3V駆動の場合はこれでちょうどいいようです。

 ところで大事なことを忘れていましたが、MMC/SDメモリーカードは耐圧が 3.6Vしかありません。3.6V以上をかけるとメモリーカードが壊れてしまいます。低い方も 2.7Vを割ると動作しなくなるので、電源電圧は 3.0〜3.3Vの範囲で動作させる必要があります。3.0〜3.3Vで安定化された ACアダプタを使うか、低飽和型の 3.3V三端子レギュレータを入れる必要があります。3Vの ACアダプタであってもトランス式の安価な物は電圧が安定せず、高い電圧が出ることがありますので使わないでください。ちなみにわたしはこれも秋月の 3.3V ACアダプタを使っています。

 2007.2.10追記。

 DC-DCコンバータ追加しました。

LED Game基板側の配線 配線した全体図

 2007.2.8 追記。

 PD3は OC2B, INT1, PCINT19とピンを共用しています。これらはタイマ/PWM出力や外部割り込み信号として、何かと便利に使えます。これを MMC/SDメモリーカードの CS信号として占有するのはもったいないので使わないことにしました。代わりに PC3を CS信号として使うことにします。

 上記の画像の「PC3」の所に MMC/SDメモリーカードの CS信号をつなぐようにして下さい。

ファームウェアとその解説

 ソースと Intel Hexファイルは↓こちら。

 ↑これを解凍して出てくる Hexファイルを書き込めばいいわけですが、それだけではありません。ヒューズ設定を書き換える必要があります。

 今回のブートセレクタはあくまで脇役なので、実行コードはフラッシュ ROMエリアの後半の 2048word(4KB)に押し込めます。その代わり、電源を入れて起動する時はそちらを最初に実行し、メモリーカードからプログラムを読み込んでエリアの前半を書き換えてから、そのプログラムを実行するようにします。その為、拡張ヒューズビットの BOOTSZ1, BOOTSZ0, BOOTRST をクリアする必要があります。また、カードが 2.7V以下では動作しませんから、低電圧検出(BOD)リセットを 2.7Vで有効にした方がいいでしょう。

 avrspを使ってヒューズを書き換える場合は -FX11111000 -FH11011101 と指定することになるかと思います。なお、ヒューズ上位バイト(-FH……)の設定を間違えると ISPでの書き込みが不可能になることもありますので、設定は慎重に行って下さい。不安な場合はヒューズ上位バイトは変更しなくてもかまいません。

 ブートローダ領域は 1024wordなのですが、さすがにこれだけでは入らなかったので、その前の 1024wordも使っています。

 ところでこの MMCブートセレクタを使っているうちはいいのですが、ブートセレクタを使わず、ISPで別のプログラムを書き込んだ場合は、必ず拡張ヒューズビットを元に戻すようにして下さい。

 2007/2/9追記。

 BINファイルの格納位置をドットで表す LED表示を追加しました。どういうことかは動かしてみればわかります。

操作方法

完成写真 メモリーカードの部分
 MMCか SDメモリーカードを用意してください。なにせ 12KB以下のプログラムばかりですから、使い古しの 8MBのカードでも十分に広大です。フォーマットは FAT12か FAT16が使えます。FAT32は使えません。購入したままなら FAT12か FAT16になっているはずです。

 カードの抜き差しは電源を切った状態で行ってください。電源を入れたまま抜き差しすると壊れるかもしれません。

 ゲーム等のアプリケーションファイルは Hexファイルではなく、バイナリファイルにする必要があります。詳しくは後述します。

 回路を追加し、CPUに上記のファームウェアを書き込み、ヒューズ設定も済んでカードにバイナリファイルを入れたら電源を入れます。うまくいけばファイル名の先頭8文字が表示されるはずです。(ドットと拡張子は表示しない)

 サブフォルダは対応していません。ルートにバイナリファイルが複数ある場合はL、Rボタンでファイルを選択できます。ファイル名を表示した状態でAボタンを押すとそのファイルを読み込んで瞬時に自己書き換えをして実行します。Bボタンはキャンセルです。既にアプリケーションが書き込まれているのなら、それを実行します。

 一度アプリケーションを書き込んだら、次回からは電源投入後、自動的にそれを実行します。他のアプリケーションに切替える場合は、一旦電源を切り、Bボタンを押したまま電源を入れるとまたファイルが選択できるようになります。

AボタンBボタンL, R, UP, DNボタン
電源投入時-押されているとブートセレクタ起動-
ブートセレクタ実行時プログラム書き換え・実行キャンセルファイル選択

アプリケーション側の対応と制限

 できるだけアプリケーション側で不自由しないように作りましたが、それでも次のような制限があります。

  1. プログラムサイズは最大 6144word(12KB)。
  2. メモリーカード上のファイルは Hexファイルではなく、バイナリファイル。
    また、ファイル名は半角大文字英数字の8+3文字形式、つまり、昔の DOS形式。拡張子は BIN 。
  3. プログラムは0番地から始まり、0番地は jmp命令が書き込まれていること。
  4. 上記の回路をそのまま作る場合は PC3を操作しないで放っておくこと。

 3は普通にC言語でプログラムを組む場合は意識しなくてもかまいません。アセンブラのみで組む場合も割り込みベクタの関係から、通常は0番地は jmp命令を配置すると思います。プログラムサイズが 12KBまでなのはどうしようもありませんが、「Space Fight」が 8KBも無いことを考えれば、12KBあればかなりのものが作れると思います。

 PC3はメモリーカードの CS(チップセレクト)に使っています。これが L になるとメモリーカードからデータが出力される可能性があります。通常は SPIは使わないのであまり支障は無いとは思います。なお、未使用ピンはブートセレクタ側で入力+プルアップに設定しておきますのでアプリケーション側では放っておいてもかまいませんが、念のため設定しておいた方がいいでしょう。

 バイナリファイルは WinAVR/avr-gccの場合は avr-objcopy を使います。makefileに記述を追加してコンパイルするとよいと思います。「Space Fight」の場合は、makefileの「##Build」にバイナリファイルのファイル名を追加します。

## Build
all: $(TARGET) test.hex test.eep size SPCFIGHT.BIN

 更に、「##Link」の所に以下を追加します。

SPCFIGHT.BIN: $(TARGET)
	avr-objcopy -O binary --gap-fill 0xFF $< $@

 ##Buildのファイル名と ##Linkのファイル名は一致させる必要があります。なお、今回のブートセレクタは DOS形式しか扱えませんので、半角大文字8+3形式、拡張子 BIN でファイル名をつけてやります。

 また、elfファイルが既にある場合は avr-objcopy を個別に実行してバイナリファイルを作ることもできるでしょう。ベクターにも使えそうなツールがあるようです。

おまけ Missileちょこっと修正版

 「Missile」は好きなゲームですが、ターゲットスコープの斜め移動ができないのと、エンディングのちらつきが気になるのでちょっと直しました。それ以外はオリジナルと同じです。

 →Missileちょこっと修正版・ソース・バイナリ・Intel Hex


 履歴

2007.2.4 新規
2007.2.8 CS信号を PD3から PC3に変更
2007.2.9 ファームウェアに機能をちょっと追加
2007.2.10 おまけ追加
2007.2.15 ファイル名半角カナ対応・MMC読み込みルーチン最適化