標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第419回]

●MYCPU80基板に配線オチがみつかりました

たまたま基板の動作テスト中に、またとんでもないミスがみつかりました。
一部ICにVcc電源ラインが供給されていませんでした。
以前([第356回])ご購入者さまからのご指摘でみつかったミスと同種のミスです。
IC268(74HC244)とIC270(PIC16F88)、それとFT232RL基板のVccラインが、その他のVccラインとつながっていません。

お手数をおかけして申し訳ありません。
写真のように適当な被覆線(もともとつながっていなくても動作していたくらいですから、それほど太くなくても、細い線でも構いません)で、IC267(74HC373)とIC268の20pinをつないでください(写真黄色の被覆線)。


オシロで確認してみたのですが、配線していなくてもしっかり5V近くあるのですよねぇ。
どこから引っ張ってきてるのでしょうか。
全く平気で動いてしまうものですから、余程気をつけてチェックしないと、試作基板を作っていても見落としてしまいます。
ご購入いただいた皆様、申し訳ありません。
お手数をおかけしますが、よろしくお願いいたします。

●POSTINC0…奇妙だけれども便利な「レジスタ」(前回からの続きです)

前回、POSTINC、POSTDEC、PREINC、PLUSWの各レジスタの動作とその使い方について、ざっと説明をしましたが、いつものことで、時間切れになってしまいましたので、DataSheetを参照してお見せするところまではできませんでした。
あらためて、PIC18F4550のDataSheetの該当部分のコピーをお見せいたします。


[出典]Microchip社PIC18F4550DataSheet

POSTDEC、POSTINC、PREINCについては前回説明した通りですが、PLUSWについては不正確なコメントだったようです。
むむむ。
PLUSWはそういう使い方をするのですねぇ。
POSTDEC、POSTINC、PREINCはそれぞれアクセスの後または前でFSRレジスタをインクリメント、デクリメントし変化させます。
これに対して、PLUSWはFSRレジスタの値を変化させない、と書いてあります。
FSRレジスタペアの現在の値は変化させないで、Wレジスタの値を符号付の増分(−127〜+128)として、そのFSRレジスタペアに加えてアドレスを算出し、そのアドレスでメモリにアクセスするのだそうです。
ああ、そうか。
Z80で、インデックスポインタIX、IYの値を変化させないで、(IX+d)、(IY+d)としてメモリアクセスしたのと全く同じ使用法なのですね(これは、前回そうではないか、と書きましたが、やっぱりそういうことのようです)。
でもその増分としてWレジスタを使ってしまいますから、これは「テーブル参照」専用ということになりそうです。
FSRレジスタペアにテーブルのトップアドレスを与えておいて、そのテーブルのアクセスキーをWレジスタに入れて、

movf PLUSW,w

を実行すれば、Wレジスタには、そのアクセスキーに対応した値が得られることになります。
この命令の実行によって、FSRレジスタペアの値は変化しませんから、繰り返しこの処理を行うことができます。
おお。これは、コード変換に使えるではありませんか!
たとえば、0〜Fの16進数をASCIIコードの30〜39、41〜46に変換する処理を考えてみます。

30、31、32、…、39、41、…46の順にデータが並んだテーブルを用意しておいて、たとえばFSR0H、FSR0Lレジスタペアにデータトップの30の置いてあるアドレスを入れておきます。
ASCIIコードに変換したい、もとの16進数00〜0Fを、Wレジスタに入れて、
movf PLUSW,w
を実行すると、Wにはもとの16進数に対応するASCIIコードが入るはずです。

本当にそうなるのかどうか、時間をみつけて試してみることにします。

ところで、上記DataSheetコピー右側の5.4.3.3は、またまた苦しい説明が書いてあります。
[第417回]で、PIC16F88DataSheetには「INDFレジスタはバーチャルなレジスタなので、FSRにINDFレジスタのアドレス(00)を入れてINDFレジスタを間接的にアクセスしても、期待した結果は得られません」という意味のことが書いてある、と紹介しました。
でも、FSRでINDFのアドレスをアクセスすることに一体何の意味があるのだろうか、とかえって疑問に思えてしまいます。
しかし今回のPIC18F4550にはFSR、INDFレジスタペアが3組もあるのですから、PIC16F88の例よりは余程現実的です。
今回はFSR0H、FSR0LレジスタペアにINDF1のアドレス(FE7)を入れて、INDF0をアクセスしたら、INDF1に間接的にアクセスできるのではないだろうか、という考えに対して、「やっぱりそういうことは無意味ですよ」、という説明がされています。
うん、まあ、そうですよね。
FSR0レジスタペアでINDF1をアクセスする処理なんて、何か意味のあることだとは思えませんですよね。
それでも、わざわざそういう注意書きというか余計な説明を書かなくてはいけないのは、「バーチャルなレジスタ」なのに、それを他のレジスタと同じ実メモリアドレスに割り付けてしまったりするからなのだと思います。
そこのところは隠しておいて、「ぜーんぶバーチャルなんだから、これ以上詮索しないで」とでも書いておけばよろしいのに。
まあ、なんといいますか。
Microchipの技術屋さんたちは、根っからの技術屋といいますか、律儀な方たちなのでしょうね。

あ、しかし、その次のくだり、On the other handから:FSR2L.まではちょいと意味不明です。
FSRレジスタはバーチャルなレジスタではないから、それを間接アドレッシングすることは出来る、けれどもincrement、decrementはしないよって、はて、POSTINC、POSTDECを使った場合にそうなる、ということなのでしょうか?
で、後半のThus以下になると何をいってるのかさっぱり意味不明です。
まあ、前にも書きましたように、SFR(Special Function Register)エリアである、F60〜FFFの範囲に対してFSR、INDFを使って間接アドレッシングをすること自体に何の意味があるか(はなはだ疑問)、ということだと思いますから、こんな説明は理解できなくても構わないのですけれどね。

2010.1.14upload

前へ
次へ
ホームページトップへ戻る