[新連載]CPLD入門!
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使うことになるだろうと思ってはいたのですが。
何を今頃になって、というようなものですが。
ようやく本気で、CPLDと四つに取り組みます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第37回]
●割込み機能はありません
前回の終わりに、まだもうひとつ気が付いたおかしな動作がありました、と書いたこととは別件ですが、前回説明しましたスタックとの関連で先に書いておくことにします。
前回はCALL〜RETLWのためのスタックが、Stack Level 1、Stack Level 2の2層しかないと書きました。
ということは、「割り込みのためのスタックはない」ということになります。
実はPIC16F57では割り込みは使えないのではないか、ということはもっと前の時点で気が付いていました。
PIC16F57のPINレイアウトにINT端子が無いことと、PIC16F5XのData Sheetに割り込みについての説明が全く無いからです。
PIC16F57には、スタックがStack Level 1、Stack Level 2の2層しかなく、かつそれはCALL〜RETLWのための専用スタックである、ということでもPIC16F57では割込みは使えないということが結論づけられました。
●パワーON時に異常表示になる
前回の終わりに書いた「もうひとつ気が付いたおかしな動作」は起動時の異常についてです。
前回PIC16F57のプログラムを直した結果、キー入力時には7セグメントLEDに正しく表示されるようになりました。
ところが一旦電源をOFFにしたあと、再び電源をONにすると、異常表示になってしまいます。
リセットしても変化はありません。
しかしその状態でキー入力をすると、それ以後は正常に表示されるようになります。
ND80Zモニタプログラムは電源ON、またはリセット時に7セグメントLEDにオール0を表示します。
どうもそれが行なわれていないようです。
EPM7128SLC84を使った7セグメントLED表示/5X5キー入力/USBインターフェース回路はND80ZSMの増設用に使うのがとりあえずの目的です。
ND80ZSMに接続した場合には見かけ上はND80Z3.5と同機能になります(ただし82C55など一部の機能はありません)。
しかしハードウェア回路はCPLDを使っているということを別にしても、ND80Z3.5とは大きく異なっています。
ND80Z3.5は7セグメントLED表示をDMAで行なっています。
RAMの特定アドレス(83F8〜83FF、FFF8〜FFFF)に書いたセグメント表示データが、タイマー回路が発生するパルスによるDMAアクセスによってLED表示回路に読み出されることでLEDにダイナミック表示されます。
DMAアクセスですから、LED表示にはCPUのプログラムは直接は関わりません(単にRAMの表示アドレスに表示データを書き込むだけです)。
一方このところ説明をしております7セグメントLED回路はI/O回路なので、プログラムで出力しなければLEDにデータを表示させることはできません。
LEDのダイナミック表示はPIC16F57が行ないますからCPUが常時表示データを出力する必要はありません。
8桁分の表示データを1度送れば、PIC16F57がそれを保持して、次に別の表示データが送られてくるまで、同じ表示データをそのまま繰り返しダイナミック表示します。
その意味は、7セグメントに表示するデータを変更する都度、プログラムで表示回路に送る必要がある、ということです。
上で説明したように、ND80Z3.5のDMA回路ではRAMの表示用アドレス(前記)のデータを更新するだけでDMA回路によって自動的に7セグメントLEDに表示されますが、いま説明中の7セグメントLED表示回路はそれとは大きく異なっています。
そのためND80ZSMのシステムモニタプログラムにそのLED表示を行なうためのプログラムを追加しました。
下はその追加部分です。
左が表示プログラム(LEDDP)を追加したND80Zモニタプログラムで、右は追加前のプログラム(ND80Z3.5のモニタプログラム)です。
START1:〜START2:はリセット後に最初に実行される部分で、左側のプログラムではSTART2:でLED表示を行なったあとキー入力待ちになります。
右側のプログラムではLED表示はDMAで自動的に行なわれるためSTART2:ですぐにキー入力待ちになります。
どちらのプログラムも、キー入力が数値(0〜F)のときはそれが7セグメントLED表示データに変換されてLED表示アドレスに書き込まれたあと、START2:に戻ってきます。
説明が長々と続きましたが、それは以下の説明で予備知識として必要と考えたからです。
さて。
電源ONのときだけ7セグメントLED表示が正しく行なわれないのは、このときだけPIC16F57が表示データを正しく受け取っていないらしい(START2:のCALL LEDDPが実行されているにも関わらず)としか考えられません。
そのココロは。
ひょっとしてPIC16F57はリセットまたは電源ON時の立ち上がりが遅いのではないか、という疑いです。
Z80は電源ONまたはリセット後にすぐに起動します。
一方、PIC16F57は起動して安定動作を開始するまでに、ある程度の時間が必要なのではあるまいか?
そう考えれば辻褄が合います。
そしてもしそうならば、ND80Zモニタプログラムの先頭に一定の時間待ちルーチンを置くことでこの問題は解決するはずです。
説明が長くなりましたので、今回はここまでとします。
続きは次回にいたします。
CPLD入門![第37回]
2019.4.21upload
前へ
次へ
ホームページトップへ戻る