KZ80-IOB(I/Oボード)でLEDチカチカ(Lチカ)

KZ80-IOB

Z80コンピューターが動き出しましたので、やはりここはI/Oボード経由でLEDチカチカ(Lチカ)させてみたいと思いまして、LEDテストボードを作りました。

LEDチカチカボードを作ってみたい

LEDチカチカさせるボードは以前もユニバーサル基板で作ったことがありましたが、KZ80-IOB(I/Oボード)の入出力端子(14ピンコネクタ)の1つ分のものでした。KZ80-IOB(I/Oボード)は2つの端子を装備してましてPPIのAポート、Bポート、Cポートそれぞれ8bit分 計24bit分のI/Oポートが出ています。

つまり全部のポートにLEDをつなぐと24個のLEDを制御できるのです。これはやってみたい。前回、前々回動かしたZ80マイコン(KZ80-CPUB REV1+SBC8080 SUBルーズキット)に だいぶ昔に組んだKZ80-IOB REV1.1をつないでみます。記事中のプログラムをKZ80-IOB REV2で使う場合は適宜I/Oアドレスを変更して再アセンブリしてください。

LEDテストボードの回路はこんな感じ

LEDチカチカテストボードですが、KZ80-IOBの入出力端子(14ピン)の2ポートとフラットケーブルでつなぐかたちで回路を考えました。Kicad6の練習もかねて回路図を引いてみました。

ちなみに、いつもどおりgithubにKiCADデータなどといっしょに情報をUPしています。ご参照ください。

GitHub - kuninet/LED-Test-Board
Contribute to kuninet/LED-Test-Board development by creating an account on GitHub.

回路としては、8255 PPI(パラレルIC)の入出力線のさきに、トランジスタアレイ(ULN2803AまたはTD62083APG)を接続してLEDを駆動します。

シンク型(8255へ電流引きこみ)の回路にして直結でもイイカナ?と思ったのですが、ひとまず間にICをかませることにしました。

基板試作

回路図ができたので、ユニバーサル基板で試作してみようと思いまして、はたと気がついたのですがわたしの手持ちのLEDは一般的な3mm径のもので、2.5mm幅のユニバーサル基板に隙間なく配置していくのが難しいのであります。角形で並べて配置できるLEDがあるとよいのですがあいにく手持ちはなく…

基板をじー-っと見てて、ふと思いついたのが、むかしトラ技の付録基板を作ろうと買ってあった表面実装用LEDがあるじゃないかと。ユニバーサル基板のランド間に敷き詰めれば24個のLEDを並べることができそうです。1608型ですので老眼の私にはなかなかキツイですが、ルーペとかで拡大しながら手はんだで行けそうと思い立ちました。

両面ユニバーサル基板で試作してみた結果がこちらです。
電源はKZ80-IOB(I/Oボード)の端子から5Vをもらいます。くみ上げたあとLEDが点灯しないと悲しいので、1つづつ点灯試験を実施しました。最初はうまくはんだ付けできず点灯しないLEDも多かったのですが、24個はんだ付けするころにはすっかり慣れましたw

LEDチカチカさせるテストプログラムの作成

LEDテストボードがユニバーサル基板で試作できましたので、一列に並んだ24個のLEDをチカチカさせてみたいと思います。

8255 PPI(パラレルI/O IC)ですが、以前も何度か記事を書いてますが I/Oポートとしては以下のような3ポートがあります。アドレスはKZ80-IOBでアドレスジャンパを$C0~に設定した例です。

I/Oポート機能
0C0hAポートの入出力
0C1hBポートの入出力
0C2hCポートの入出力
0C3hコントロールポート

8255 PPI (パラレルI/O IC)は、コントロールポートへコントロールワードを送って入出力を決定します。よって最初に上の例だと 0C3h番地に初期化コードを送ってあげる必要があります。

以下のデータシートから引用した図を見ていただくとわかりますが、AポートとCポートの一部、BポートとCポートの一部をまとめて設定するワードとなってます。また、全体的な動作モードとしてmode0~3を設定する必要があります。

Intersil 82C55A DataSheet より引用

今回は単純なI/Oモードであるmode0(ゼロ)を使用しまして、A~Cポートを全部「出力(output)」にしますので、080h を I/Oポート 0C3hへ出力してあげると良いことがわかります。

初期設定したのちはI/Oポート0C0h~0C2hに出力したいデータをセットすることで8255 PPI(パラレルI/O IC)の各ポートに出力されるという寸法です。

Z80アセンブラをつかってLEDを順次点灯させるデモプログラムをつくりました。以下のgithubにUPしてますので見てください。Z80アセンブラで書いてありまして、以前も紹介したThe Macroassembler ASで、Windows10のWSL2(ubuntu)で アセンブリしました。MakefileもUNIX系の環境で同クロスアセンブラが動くときに使えるものを添付しています。お試しください。

Z80_IOB/sample at master · kuninet/Z80_IOB
Z80マイコン用I/Oボードを作る. Contribute to kuninet/Z80_IOB development by creating an account on GitHub.

“led-blink.asm”がプログラムソースとなっていて、動かす場合はZ80マイコンのUniversal Monitorなどの”L”コマンドでIntelHex形式のデータ”led-blink.hex”をロードしてください。
※I/Oアドレスなどが違う環境で使う場合は、ソースを変更してIntel Hexファイルをリビルドしてください。

わたしはいつもWindows環境でTeraTERMをつかってIntelHexを流し込んでます。別のウィンドウでテキストエディタでIntelHex形式のファイルをひらいて ctrl+a(全選択)、ctrl+C(コピー)して、TeraTERMのウィンドウでモニターのLコマンドで待ち受け状態にした後、alt+v(貼り付け)して送信してます。

ちなみに、UniversalMonitorで9600bpsの場合短いIntelHexファイルならWAITなしでもOKですが、上記のように50msecぐらいの行待ちを入れると安心です。適宜調整してください。

LEDチカチカ動いた!

上記のIntelHexを流し込んだのち9000h番地からプログラムを Gコマンドで実行すると、KZ80-IOBの先につないでLEDがチカチカと点滅します。今回はソースのデータ部分を見ていただくとわかりますが、LEDを右から1つづつずらしながら光らせるパターンにしてます。
プログラムではデータを逆向きにも読む動きになってますので、LEDは右から左、左から右と光が流れていきます。別のパターンにしたい場合はデータ部分を書き換えてみてください。

24個のLEDがチカチカするのは楽しいので、根性がある方はぜひ作ってみてください。

コメント