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


16ビットマイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第88回]



●PIOの設定(2)

前回からの続きです。
前回説明しましたように、PIO MODE REGISTERとPIO DIRECTION REGISTERの対応するビットに0または1をセットすることで、そのビットに対応するPIO端子を入力または出力に設定できます。
入力に設定したPIO端子に入力された値を読んだり、出力に設定したPIO端子から値を出力するには、PIO DATA REGISTERの対応するビットの値を読む、またはPIO DATA REGISTERの対応するビットに値を書き込みます。


[出典]Advanced Micro Devices,Inc. Am186EM and Am188EM Microcontrollers User’s Manual

PIO DATA REGISTERもMODE REGISTERやDIRECTION REGISTERと同じように16ビットのレジスタが2個あって、PIOナンバーとレジスタのビットとの対応もMODE REGISTERやDIRECTION REGISTERと同じです。
入力に設定したPIO端子に入力された値はDATA REGISTERの対応するビットに反映されますから、PDATA0(アドレス FF74)またはPDATA1(アドレスFF7A)に対してIN AX,DX命令を実行したのちAND AXを実行することで、入力された値を読むことができます。
レジスタに書き込む場合はちょっと面倒です。
特定のビットのみ変化させ、そのほかの関係のないビットは変化させてはいけませんから、先にまずIN AX,DXで現在の出力値を読み込んで、0を出力するならAND AX、1を出力するならOR AXを実行したのち、OUT DX,AXを実行します。
MODE REGISTERやDIRECTION REGISTERの設定の場合も同じ操作をすることになります。

ところで上の12.5にありますOPEN−DRAIN OUTPUTSですが、しっかり読めばよかったのに中身を読む前に見出しだけで早飲み込みをしてしまいました。
なんだぁ?
OPEN DRAIN OUTPUT?
なんでそんな設定になるのぉ?
普通のOUTでなければ困るじゃないの。
INTELもAMDも何考えてるの。
困ったもんだ。
OPEN DRAINでは仕方がありませんから、LCDIFのテストをするために出力端子にプルアップ抵抗をつけてしまったのでした。

困ったちゃんは私めでありました。
文章はよく読みましょお。
私が勝手に思い違いをしてしまっただけで、OUTPUTは普通のOUTPUTでありました。
12.5の文は、もしOPEN DRAIN OUTPUTにしたければこうするといいよ、という説明だったのでした。
どうするのかといいますと。
そのビットに対する出力値をDATA REGISTERにセットするとともに、同じ値をDIRCTION REGISTERにセットすると、OPEN DRAIN OUTPUTになる、と書いてあります。
なるほど。

この場合MODE REGISTERの該当するビットは1に設定します。
0を出力する場合には、DATA REGISTERには0を書き込みます。
同時にDIRECTION REGISTERにも0を書くと、MODE及びDIRは1,0となるので、普通の出力となり、該当するPIO端子は0になります。
1を出力する場合には、DATA REGISTERには1を書き込みます。
同時にDIRECTION REGISTERにも1を書くと、MODE及びDIRは1,1となるので、該当するPIO端子は「プルアップなしの入力」になり、ハイインピーダンスとなります。
結果としてOPEN DRAIN OUTPUTになります。

せっかくここまで説明しましたので、PIO制御の見本としてLCDIFプログラムをお見せするつもりだったのですが、本日も時間がありません。
次回に見ていただくことにいたします。

16ビットマイコンボードの製作[第88回]
2018.9.14upload

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