ここから本文です
Dr.KIKKIE(KIKI) MSX DeuxLaque
免責:記載誤りによる損害一切

書庫過去の投稿月別表示

全2ページ

[1] [2]

[ 前のページ ]

シリアル通信(1)

イメージ 1
以前から考えていたものの、なかなか着手せずにいた、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-シリアル変換モジュールも使えるはず。

いろいろ試み中

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;
}

全2ページ

[1] [2]

[ 前のページ ]

1 2 3 4 5 6
7
8 9 10 11 12
13
14
15 16 17 18
19
20
21
22 23
24
25 26 27
28
29 30
Dr.KIKKIE(KIKI)
Dr.KIKKIE(KIKI)
非公開 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について

よしもとブログランキング

もっと見る
本文はここまでですこのページの先頭へ
みんなの更新記事