ノート/8253の鳴らし方

提供: [na]なWiki
< ノート
2017年12月28日 (木) 13:04時点におけるEditor (トーク | 投稿記録)による版 (Merge branch 'squash' into export)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

基礎知識

8253の構成

同等のカウンタが3つと、その制御部からなります。 制御部はCPUからバスを介して接続するようになっており、 バスへはデータ8bit,アドレス2bit,WR#,RD#,CS#が出ています。

カウンタは各々16bitで独立に入力クロックを与えることができ、 各1本の出力、各1本のGATE#入力を持ちます。

カウンタは6種の動作モードがありますが、 周期的な信号を取り出せるのはモード2と3のみです。

モード2(分周)

入力クロック毎にカウント減算し、カウントが1である間だけLOを出力します。 例えば4を指定した場合HHHLHHHLといった出力になります

GATE#がLOの間は出力がHIになります

モード3(矩形波生成)

入力クロック毎にカウントし、カウンタ値/2毎にHI/LOが切り替わります。 ただし、カウンタ値が奇数の場合端数を整数に丸めるためデューティ比が50%からずれます。 例えば、7を指定した場合、4カウントHIで3カウントLOのパターンになります。

GATE#がLOならその間出力はHIに固定、HIになったときにカウントしなおしとなります。

書き込みについて

  • カウンタ値の書き込みは基本的に16bit書き込みモードを使用する。LOBYTE、HIBYTEの順。
  • 書き込みでWR#をLOにする期間、書き込み間で空けなくてはいけない時間はやや長い。
    • 具体的な時間は各互換チップで異なる模様。データシートを参照のこと。

通常の鳴らし方

  • まず、モード3を設定する。
  • カウンタ値を設定する
  • GATEをHIにする(発音)
  • GETEをLOにする(発音停止)

高度な鳴らし方

モード2を使え。以上。

…だと無愛想過ぎるのでもう少し噛み砕いて。 このモードではレジスタに指定した値(以下Nとしよう)で入力クロックを分周するが、 このとき波形は1クロックLOで残り(N-1)クロックがHIになる。

これは、1/NだけLOになるPWMと同じなので、後段のLPFを通した結果(N-1)/Nの電圧が出ているのと同等になる。

もちろん、これだけだと一定の電圧が出るだけなので、鳴らしたい周波数に応じて適宜ON/OFFしてやる必要がある。A4=440HzならONOFF合わせて1秒間に880回。

この方法の利点は8253クロックが十分に高ければその周波数がいくつであるかは関係ないところ。欠点は鳴らす周波数に合わせてキッチリON/OFFを制御しなくてはいけないところ。