低速シリアル通信(2)

タイマーを使ってシリアル通信実装してみました。RS-232Cの仕様では、負論理になっていたり、いろいろややこしいですが、ここではソフト面から見た話をします。詳しくは、http://www.nahitech.com/nahitafu/mame/mame5/rs232c.html にあります。で、ソフト側からは、

  • スタートビット0
  • 下位から順番に8ビット
  • ストップビット1

を受ければよいようです。細かく言うと、ビット数が7だったり、パリティがあったり、などなどいろいろあるようですが、今回扱う対象はこんな感じみたいです。で、RS-232Cは非同期なので、ビットレートに合わせたタイミング(今回は4800bpsなので、1/4800secごと)でデータを受け取ってやればよいようです。
GBAのタイマーは、オーバーフローしたときに割り込みを発生させられるようなので、1/4800secでオーバーフローするように初期値を与えてやればできるはず、ということで作りました。今回は以下の点ではまりました。

  • タイマーの値を読み出したときは今の値が得られるが、書き込んだときには、現在の値は変わらず、オーバーフローしたあと、もしくはタイマーを動かし始めたときの初期値を設定する。
  • タイマーがオーバーフローしたあとは、0ではなく、初期値として与えた値から始まる。

タイマーがオーバーフローしたとき、0になると思っていて、毎回4800bpsになるように値を足してたんですね。で、おかしな結果になってたわけです。資料をよくみたら書いてあったんですが。

とにかく、試行錯誤の結果、パソコンと、4800bpsなどハードウェアで実装されていない速度で通信できるようになりました。