|
以前から考えていたものの、なかなか着手せずにいた、MSXによるシリアル通信に着手。 ■1 仕様 (1) ベースはBASIC やっつけ仕事に柔軟に対応できるBASICをベースとする。当然、USR関数による引数渡し。 CLEAR 200,&HBFFF:DEFUSR=&HC000 A$="ABC":DUMMY$=USR(A$) てな調子である。 (2) RS232Cっぽい仕様 転送速度は9600bps固定。スタートビット1、データビット8、パリティなし、ストップビット1。フロー制御なし。 なぜ9600bps固定かというと、転送タイミングを機械語命令数に依存しているため。 今どきの機器は9600bpsでも十分こなせるはず。 PC/AT互換機のシリアルポートに似ていることもあり、例によって汎用入出力ポートを使用。 (3) RS232Cぽくない仕様 12Vレベル変換は行わず、TTLレベルのまんまとする。 今どきの機器は、内部では5Vとか3.3Vで処理しているくせに、シリアルポート部分だけは12Vに上げたり下げたりしている。んな面倒なことはしない。 ■2 ソフトウエア ざっと仕様を書いたところで、アセンブラソースを書き始める。いつものとおり、ASM.COM用である。 動作の概略は次のとおり。 (1) USR関数の変数型チェック。文字列でなければリターン。 (2) 文字列の長さをチェック。ゼロならリターン。 (3) 文字列の長さがゼロになるまで、信号を送出する。 ※ここまでは、「MSX2テクニカル・ハンドブック」と、ほぼ同じ。PSGレジスタ#15のデータ保存を紛れ込ませている程度の改変。 (4) まず8ピンを下げて、ストップビットの送出。 (5) LSBから順番に8ピンを上げ下げ。 (6) 最後に8ピンを上げて、ストップビットを送出。 ※「上げ下げ」とソースコードが逆ではないかと思っている人がいるかもしれないが、その点は後述。 (7)サブルールーチンは、PSGレジスタ#15のデータセーブ。8ピンの上げ下げ。ウエイトループ。 ※NOP命令を繰り返しているが、DJNZで結構時間を喰ってしまい、大味なウエイトループになっている。もうちょびっとウエイトがほしいので、ループ外にもNOPを足している。 ■3 ハードウエア (1) 主な部品 ・Dサブ9ピンコネクタ(メス):金属部分を外して、ポートに接続しやすくした。 ・74LS14:MSXの起動時点では8ピンはLOWであることに後から気が付いて、論理を反転するために入れたもの。このため、上述のソフトウエアの論理をもう一度反転するさせた。考えてみれば、サブルーチンの中で反転しておけば読みやすかったかもしれない。CPLなんて命令も入っていて、まるで「反対の反対なのだ!」状態である。 ・USBシリアル変換アダプタ:ここではFT232RLを使ったsparkfunの製品を使用。 (2) 結線 ・MSXの5VとGNDを74LS14に結線。 ・MSXの8ピンを74LS14の1ピンに結線。 ・74LS14の2ピンをアダプタのRXに、GNDをGNDに結線。 ・パスコンとかプルダウンは適宜。 ■まとめ さて、どうなることやら。続きはコマーシャルのあとで。 http://art19.photozou.jp/pub/378/247378/photo/29273001.jpg 赤くてかわいいブレッドボード。これがインターフェース。 74LS14とsparkfunのFTDI Basic Breakout(5V)が載っている。後者は秋月のUSB-シリアル変換モジュールも使えるはず。 |
過去の投稿月別表示
-
詳細
コメント(0)
|
Aruduinoはお手軽でいいのだが、少々割高である。
最もスタンダードなArduino Duemilanoveで、3200円ぐらいか。 ちょこちょこっと実験(いたずら)してみる分にはいいのだが、完成品に組み込んでしまうのは、そのお値段故に気が引ける。 というわけで、もう少し安上がりそうな製品を試しているところである。 http://art22.photozou.jp/pub/378/247378/photo/28932153.jpg 中央の小さいのは、Arduino Pro Mini。 プログラムの書き込みには、別途USB-シリアルアダプタが必要となるが、本体だけなら2,100円。純正Arduinoの中では、最も安いのではなかろうか? 写真では、1.5V→5Vの昇圧DC/DCコンバータ付きの電池ボックスを使って、単三電池1本で駆動している。 左側の細長いのは、トランジスタ技術2008年8月号に付属していた78K基板。 今年(2009年)8月に刊行された「USBマイコンでパソコンI/O!」(CQ出版)にも付属しており、3,800円。 書籍込みではArduino Duemilanoveより高くなるが、マルツでボードだけ買えば1,980円で済む。 開発環境は、書籍付属のCDに収められている。ボードにはトラ技BIOSなるモニタが書き込まれており、作成したHEXファイルをターミナルソフトから転送して書き込むことができる。 拡張RAM領域に転送した場合は、電源を切るとプログラムも消えてしまうが、ROM領域に転送すれば、電源を供給するだけでパソコン不要の使い方もできる。 これら以外にも、秋月のUSBマイコンボードPIC18F2550(1,000円)や PIC18F4550(1,100円)も近いことができるかもしれないが、別途、プログラムの書込み機が必要で、AKI-PICプログラマーVer.4(完成ボード)の場合、5,700円也である。面倒なんだなあ。せっかくUSBコネクタを装備しているのだから、USB経由で書き込みさせてほしいところである。 http://art22.photozou.jp/pub/378/247378/photo/28932144.gif ということで、78K基板を試してみた。 PM+という統合環境で、サンプルプログラムの「ledmain.c」を改変。ビルド後に出来上がったHEXファイルをTera Termから転送。 「かえるのうた」を演奏するプログラムであるが、オリジナルはタイミングがかなりヘンである。 修正後もまだヘンではあるが、オリジナルよりマシであろう。文末のアイコンをクリックすると再生されるはず。 元の音色は安っぽいので、ちょいとエフェクトをかけておいた。(くれぐれも音量には注意されたい。) 音が小さいかもしれないが、そのときは音量を上げるように。大きすぎるときは下げるように。 以下はソースの一部。ブログシステムの都合上インデントが効かないので、全角スペースで代用した。 音程と音長をどちらもwait()で処理しているので、正確なタイミングがとり辛いのじゃ。 #pragma sfr #include "types.h" #include "trgbios.h" // トラ技BIOSのサービスルーチンを呼び出すのに必要 void wait(U16 len) { // len回のNOPを実行してWAITを行う while(len--){ #asm NOP #endasm } } void buzz(U16 tone,U16 len) { // P01端子を操作してブザーを鳴らす U16 x; for(x = 0; x < len; x ++){ P0.1 ^= 1; wait(tone); } } const char KAERU[] = "かえるの歌を演奏します。P01端子に圧電サウンダを接続してください。\n"; void main() { // メイン U16 i; PM0 = 0xfc; // ブザーの端子 trg_puts(KAERU); P6.1 = 1; buzz(1000,100); P6.1 ^= 1; buzz( 900,100); P6.1 ^= 1; buzz( 800,100); 〜音楽データ中略〜 while(1){ trg_puts("zキーを押してください\n"); if(trg_getc() == 'z') break; } trg_puts("\n"); P6.1 = 0; } |


