R6522:DDRBが入力モードでも矩形波出力がされる。

JR-100ではR6522のPB7に生成される矩形波をスピーカーに接続し、音声出力として用いています。このR6522のPB7に矩形波を出力するための条件として、データシートには以下の記載があります。

A precaution to take in the use of PB7 as the timer output concerns the Data Direction Register contents for PB7.  Both DDRB bit 7 and ACR bit 7 must be 1 for PB7 to function as the timer output.  If one is 1 and the other is 0, then PB7 functions as a normal output pin, controlled by ORB bit7.

PB7に矩形波出力するためには、DDRBレジスタでbit7を出力モードにし(DDRBのbit7を1にする)、かつACRレジスタでタイマー1をPB7出力を有効にするモード(ACRのbit7~6を1xにする)にしなければならない、ということが書いてあります。

ところでJR-100のBASIC ROMでDDRBの設定している部分とBEEPの処理部分を抜き出すと以下のようになっています。

BEEP1の処理ではACRに0xE0をセットしているので、ACRのbit7は1です。一方DDRBに0x20をセットしているということは、DDRBのbit7は0、つまり入力モードに設定されています。これでなぜ矩形波が出力されるのか?

そこでテストプログラムを作って実験してみます。

ACR7のbit7は1に固定(bit6も1にして矩形波出力モードとする)にしておいて、DDRBのbit7を1と0にしてどうなるか試すものです。矩形波が出力されれば、JR-100のスピーカーから”ド”の音が約1秒間再生されます。

結果、DDRBのbit7が1でも0でも音は再生されました。ということは、

Both DDRB bit 7 and ACR bit 7 must be 1 for PB7 to function as the timer output.  If one is 1 and the other is 0, then PB7 functions as a normal output pin, controlled by ORB bit7.

これの”one is 1 and the other is 0″という部分は、「一方が1、他方が0」という意味ではなく、「DDRB bit7が1、ACR bit7が0」という意味に捉えざるを得ません。そうであればそのあとに続く”PB7 functions as a normal output pin, controlled by ORB bit7″も理解できます。「DDRB bit7が0、ACR bit7が1」の場合はDDRBのbit7は入力モードなのでORBに制御されるというのはおかしく、IRB(またはポートB)のbit7の値を反映しないといけないからです。

ということで結論は、「PB7に矩形波出力するにはACRのbit7を1にする。DDRBのbit7の値には依存しない」、ということになりました。

投稿者: けむしろう

プログラミング、サーバ構築、電子工作、旅行が好きです。

コメントを残す

メールアドレスが公開されることはありません。