P/ECE研究室〜S1C33分室


* Tue Jan 15 22:02:13 JST 2002 Naoyuki Sawa

シリアルコントローラ、DMAコントローラ、A/Dコンバータ、...
たくさんある周辺回路の中から、最初の題材として取り上げるのは、
8ビットプログラマブルタイマ(以下、8ビットタイマ)です。

S1C33は、6チャネルの8ビットタイマを持っています。
各チャネルは、それぞれ少しづつ違う特色を持っています。

Ch. S1C33での用途 クロック出力 割り込み発生 最低レート P/ECEでの用途
0 DRAMリフレッシュ、A/D変換開始トリガ 366Hz 未使用
1 OSC3の発信安定待ち時間 23Hz OSC3の発信安定待ち時間(スタンバイ解除)
2 シリアルCh.0へのクロック供給 23Hz 未使用(USB転送に使おうとした形跡あり)
3 シリアルCh.1へのクロック供給 366Hz 未使用
4 シリアルCh.2へのクロック供給 不可 不可 23Hz 未使用
5 シリアルCh.3へのクロック供給 不可 不可 366Hz シリアルCh.3へのクロック供給(LCD転送)
「PIECE ハードウェア割り込み/周辺機能 使用状況」では、8ビットプログラマブルタイマ0が スタンバイ解除に使用となっていますが、8ビットプログラマブルタイマ1の誤植と思われます。
2002/01/16追記: Ch.0〜3の割り込みレベルは、P8TM0〜2にて共通の設定となります。 各チャネルに異なる割り込みレベルを設定することはできません。 16ビットタイマでは、各チャネルに異なる割り込みレベルが設定できるようです。
2002/01/16追記: T8CH4S1、T8CH5S1の設定により、Ch.4、Ch.5も割り込みを生成できるかも知れません。 しかし、かなり面倒そうなので、とりあえず使わない方がよさそうです。
さて、実験に利用するチャネルは、どれがいいでしょうか? まず、Ch.1とCh.5はシステムが使っているので、除外します。 また、Ch.4とCh.5は割り込みを発生できないため、面白くないので、除外します。 Ch.2は、今後のバージョンアップでUSB転送に使われそうな気がするので、除外。 残ったCh.0とCh.3のうち、今回はCh.0を使うことにします。 プログラムの流れとは非同期に、タイマ割り込みを生成してカウントアップを行い、 そのカウンタ値を表示するプログラムを作ってみました。こちら pceAppProcの呼び出し間隔は1/10秒、8ビットタイマCh.0を366Hzに設定して、 割り込み毎にカウントアップを行い、pceAppProcが100回呼ばれたときのカウンタ値を確認します。 3660回前後なら、正しく動作していることになります。それでは、実験! 微妙に違いますが、まあ誤差の範囲でしょうか。うまく動いたようです。 プログラミング上の注意点(というか、僕がハマッた点^^;)については、ソースをご覧ください。 8ビットタイマに限らず、S1C33の周辺回路は、いくつかのブロックが協調して動作するようです。 例えば8ビットタイマの場合も、割り込みコントローラ、プリスケーラの設定が必要です。 僕は、プリスケーラから8ビットタイマへのクロックONを忘れて、タイマが動かずかなり悩みました。 最後に、8ビットタイマに関するカーネルソース(BIOS 1.14)を読んで、ちょっと気になった点を挙げておきます。 powerman.cにて、「8ビットタイマ ch1 カウンタ値設定」、「(同) リロード値設定」として、 0x40166と0x40167にリロード値を書き込んでいますが、これは0x40165の間違いではないでしょうか? 0x40166は現在のカウント値読み出し専用、0x40167にはレジスタが割り当てられていません。 この推測が正しければ、スタンバイからの復帰時に、正しい安定待ち時間が取られていないことになります。 まあ、ちゃんと動いているので文句は言えないのですが... また、割り込み要因フラグのクリア方式が、わざわざR/W方式に変更されているのも、理由がわかりません。 恐らく、現在の仕様では、同一バイトに割り当てられた割り込み要因を利用していないので問題にならないのでしょうが、 R/W方式では原理的に間違った割り込み要因クリアが避けられないので、マズイのではないかと思います。 と、ちょっと文句をつけてしまいましたが、きっとやむを得ない理由があったのでしょうね。 僕も、もっとS1C33を勉強したら、「やむを得ぬ理由」がわかるかも知れません。 次回は、16ビットタイマか、DMAを試してみたいと思います。 (続きます...)

nsawa@piece-me.org