PITこのページは[[OS-Wikiのページ:http://community.osdev.info/index.php?%28PIT%298254]]のコピーです。Timer」の略-AT互換機に1個、TONWSには2個(ただし8253)、PC-9801には1個(ただし8253)--8253にはリードバックコマンドがない(それ以外は同じ)-AT互換機ではPITに1.19318MHzのクロックが与えられている。-TOWNSではPITに307.2KHz(ch0-2)と1.2288MHz(ch4)のクロックが与えられている。--さらに上位機種には1.00MHzのインターバルタイマ2がある(註:これは8254系ではない)-PC-9801はPITに2.4576MHz(システムクロック5MHz系時)もしくは1.9968MHz(システムクロック8MHz系時)のクロックが与えられている。W):割込み制御レジスタ--bit0:ch0のタイムアウト割り込み許可(0でマスク、1で許可)--bit1:ch1のタイムアウト割り込み許可(0でマスク、1で許可)--bit2:BEEP出力制御(1でBEEP-ON)--bit3-6:リザーブ(0で書き込むことを強く推奨)--bit7:1でch0のタイムアウトフラグをクリア---0に戻す必要はない。書き込み時に1だと、そのときにタイムアウトフラグクリア動作が行われる、ということにすぎない。0だとその動作が起きないだけ。---TOWNSの割り込みは全てレベルトリガであり、この動作でタイムアウトフラグを下げないと、IRQ0がかかりっぱなしになる(もちろん、ch0の割り込みそのものが不要なら、bit0を0にすればよい)。---なお、ch1にはタイムアウトフラグを下げるためのコマンドビットはない。新しいカウントを書き込むと、自動的にタイムアウトフラグが下がる。これはch1は非周期的な割り込みを扱うために用意されたものであって、毎回カウンタの書き換えが必要だろうという設計思想に基づいている(すばらしい)。カウンタを書き換える際には、カウンタだけではなく、コマンドレジスタ、カウンタ、(カウンタ)、の順にアクセスすることをおすすめする。R):フリーランタイマレジスタ--bit0-15:カウント値---これは1マイクロ秒ごとに1ずつカウントアップされるレジスタで、たとえばある処理を挟んで2回読みとって差を求めることで、65ms以内の経過時間を測定するなどができる。非常に有用であるが、HG、HR、UG以降でしか利用できない。(IRQ0用)--モード3で使用。(メインメモリ・リフレッシュ用の機種と、BEEP用の機種とがある)--モード3で使用。(BEEP用)--モード3で使用。(多くの機種のノーマルモードでは、こちらでないとアクセスできない。BEEP用)--モード3で使用。[#x9a6f731]-8524は内部に16bitのカウンタを3つ持っている。それぞれに外部からクロックが与えられ(でもたいていは同一クロックを与えているようだけど)、またそれぞれを別々のモードで駆動させることができる。-カウントは原則としてデクリメントであり、周期的なモードではカウントが0になった瞬間に設定値が再ロードされる(つまり、カウント値0という値は読み出せない)。-ハードウェア的には、以下の3つの信号ピンが関係している(これらはカウンタの個数だけある)。--CLK:クロック(カウンタをデクリメントするためのクロック)--GATE:ゲート(カウンタを始動させたり一時停止させたり再開させたりするためのピン)--OUT:アウト(カウント値によって制御されるPITの出力ピン、これがIRQのトリガになったりBEEP出力になったりしている)-カウントは、2進数カウントモードと、BCDカウントモードがある。純粋な8254にはBCDモードがあるが、PCのチップセットに集積されたものについては、BCDモードが省略されている可能性があるのでお勧めできない。-8254は、現在のカウント値をラッチによって読み取ることができるが、設定値を読取る方法はない。設定値を知りたければ、カウンタを何度もリードして監視して、最大値を取得するしかない。--リードバックコマンドを使って、少ないサンプリング数で正確な設定値を推測するテクニックもある。-コントロールレジスタの各ビットの意味は次の通り。--bit0:カウントモード---0:2進数カウント---1:BCDカウント--bit1-3:カウントモード---000:モード0(ターミナルカウント)---001:モード1(プログラマブルワンショット)---x10:モード2(レートジェネレータ)---x11:モード3(方形波レートジェネレータ)---100:モード4(ソフトウェアトリガストローブ)---101:モード5(ハードウェアトリガストローブ)--bit4-5:カウンタアクセスモード---11:16bitリードロード(下位8bit、上位8bitの順)---10:上位8bitのリードロード---01:下位8bitのリードロード---00:カウント値ラッチ--bit6-7:カウンタチャンネル指定---00:カウンタ0---01:カウンタ1---10:カウンタ2---11:リードバックコマンド(後述)-カウント値を設定するには、一般に以下の手順で行なう。--コントールレジスタに設定したいチャンネルのモードを設定。直前と同じモードであっても、これを設定しないとうまく動作しないことがある。--そして、目的のカウンタに値をセット。8bitモードなら1回のアクセスになるし、16ビットモードなら、下位8bit、上位8bitの順に書き込む。--モード設定から、カウント値の設定完了までの間に、他のチャンネルのモード設定をしたり他のチャンネルのカウンタへ読み書きすると、設定も挙動も不定となる。-カウント値を読み取るには、一般に次の手順で行なう。--コントールレジスタを使って、読み取りたいチャンネルに対してラッチを実施。--読み取りのカウンタアクセスモードは、書き込み時のモードと同じになる。[#j1e80bb6]-ぶちゃっけ、読者の多くはAT互換機でタイマーとBEEPの設定をすると思うので、そこだけをぱぱっと説明。AL);--これでおしまい。--割り込み周期に0を指定すると65536を指定したとみなされる。実際の割り込み頻度は、クロック/設定カウント値。1000を指定すれば、1.19318KHz。10000なら119.318Hz、といった具合。11932を設定すれば、約100Hzになって、10msごとに割り込むようになるわけだ。AL);---設定値0は、65536として扱われる。---これで発振される音程は、クロック/設定カウント値。1000を指定すれば、1.19318KHz。10000なら119.318Hz、といった具合。2712を設定すれば、約440Hzになる。--BEEPのON/OFF:---これはI/Oポート0x61を使う。[#t393a94b]-ここにKさんが書いてくださった内容を参考にして''Mona''のpic.cpp内のタイマの設定はかかれる予定です。21:55:07}-少しは役に立ったようでうれしいです。}-タイマ割込み周期設定関数を作ってみました。03:51:43}-''Mona''で上記の関数をテストしましたがきちんと動いているようです。17:26:52}-実機でテストしたところカーネルが起動中に止まってしまったので現在調査中です。