編集履歴一覧に戻る
4558Dのアイコン画像

4558D が 2023年12月03日12時29分53秒 に編集

初版

タイトルの変更

+

Z80 CTCとSIO用の拡張ボードの作成

タグの変更

+

Z80

+

ワンボードコンピュータ

+

CTC

+

タイマー割り込み

+

Lチカ

+

SIO

+

シリアル通信

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

Lチカの変更

Lチカが設定されました

ライセンスの変更

+

(CC BY-NC-SA 4+) Creative Commons Attribution-NonCommercial-ShareAlike CC BY-NC-SA version 4.0 or later

本文の変更

+

# はじめに 先日記事を投稿した[Z80ワンボードコンピュータ](https://elchika.com/article/c4dee540-a1ad-4876-bff0-df620e168b67/)は、Z80 CPU、Z80 PIO、仮想ROM&RAM(PIC16F877A)だけのシンプルなアーキテクチャを取っていた。この構成は、トラブルが起きづらくプログラミングが容易になる反面、使用できる周辺LSIがPIOしかなく、Z80ファミリーの実力を引き出しきれない、という課題があった。 この課題を克服するために、Z80ファミリにラインナップされているCTC(4ch 8bit タイマー)とSIO(シリアルインターフェース)を搭載した拡張ボードを設計・制作した。本記事では、作成した拡張ボードの回路構成とその動作を紹介していきたい。 # 回路構成 ## 全体のアーキテクチャ [Z80ワンボードコンピュータ](https://elchika.com/article/c4dee540-a1ad-4876-bff0-df620e168b67/)に接続するサブボードとして、CTC、SIO、および、それらLSIを動作させるための周辺回路を搭載した。搭載した機能は以下の通りである。 - CTC:4ch 8bit タイマー。SHARP製のLH0082Aを使用した。カウンタモードのトリガ入力(TRGx)、および、ゼロカウント出力(ZCx)出力はコネクタでボード外に引き出せるようにしている。 - SIO:シリアル入出力ポート。SHARP製のLH0084A(SIO/0)を使用した。SIOにはAポートとBポートの2個のチャネルがあるが、本ボードではAポートのみを使用した。TX/RX、および、RTS/CTS信号を出せるようにしており、PCのシリアルポートに接続できるようになっている。 - レベル変換回路:SIOとPCを接続するために、RS-232C規格に準じた信号レベルに変換する回路。MAX232を用いたチャージポンプにより実現している。 - ボーレートクロック:SIOのボーレートクロックを生成する回路。74HC4060と4.9152MHzの水晶発振子を使用し、300Hz~30.72kHzまで出力できる。 - アドレスデコーダ:アドレスバスのA5-A7(3bit)から、8種類のCE信号を生成する回路。CTCとSIOへのCE信号もこの回路から生成される。 これらの機能を、なるべく汎用性を損なわないように搭載し、以下のようなアーキテクチャに決定した。 ![全体構成](https://camo.elchika.com/a74a0850880ebe4f2a87dd677f4d3a0d0f2db305/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38623938623232322d616463342d343636332d616530342d6361303264303433383638322f66663432633438322d666263372d346232312d626337382d656635303563643435333466/) ## 回路図・PCBパターン アーキテクチャから回路図を以下のように決定した。 ![作成した回路図](https://camo.elchika.com/4cc52c8bb7dd8e071579d99b7b21b2f9608cae38/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38623938623232322d616463342d343636332d616530342d6361303264303433383638322f66343531623662312d326331332d346261332d383037392d373935623631306163636331/) また、PCBパターンは以下のようにした。回路図の回路に加え、空き領域に2.54mmピッチのユニバーサル基板領域を仕込み、簡単な拡張や回路修正ができるようにしている。 ![作成したPCBパターン](https://camo.elchika.com/17f88d37db2f303ea97d87e5841f8341a5f293b9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38623938623232322d616463342d343636332d616530342d6361303264303433383638322f64336237326263622d656261662d343062612d626435352d396465343566353237666532/) ## 制作した基板 制作した基板は以下のとおりである。 ![表面](https://camo.elchika.com/82f7ef5b83e03c17181c4618a6b70b7aee4fe545/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38623938623232322d616463342d343636332d616530342d6361303264303433383638322f31396235336135632d613862662d346635652d386466322d626363353831613762333137/) ![裏面](https://camo.elchika.com/2fcabe7b413efdbf1b39477cc160b9fa64ea480a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38623938623232322d616463342d343636332d616530342d6361303264303433383638322f39386232653631642d323433332d343931652d613135642d666233346138656536343966/) # 使用実験 作成したサブボードをメインボードに接続し、CTC、および、SIOを動かすプログラムを動かすことに成功した。以下では、作成したサブボードを用いて動かしたプログラムと実行結果を簡単に紹介する。 ## CTCを用いたLチカ CTCのタイマーモードを用いて一定間隔で割り込みを発生させ、割り込み時にLEDの点灯/消灯を切り替えることでLチカするプログラムを作成し実行させてみた。以下のツイートのように周期的にLチカができた。 @[twitter](https://twitter.com/electrotelecast/status/1716455888121381296) ```arduino:CTCを用いたLチカプログラム ;*** Title: CTC_test1.txt ;*** Date: 2023/10/22 ;*** Author: 4558D ;Address,opecode,mnemonic PIOAD1 EQU 00H PIOAC1 EQU 01H PIOBD1 EQU 02H PIOBC1 EQU 03H CTC0 EQU 80H CTC1 EQU 81H CTC2 EQU 82H CTC3 EQU 83H ;***** 初期設定 ***** 0000 313001 LD SP, 0130H ; スタッカポインタのアドレスを指定(RAMアドレスの終端を指定) 0003 3e00 LD A, 0 ; Iレジスタに転送するデータをAレジスタに転送 (LD I,n がないため) 0005 ed47 LD I, A ; 割り込みアドレス上位8bit = 00 ;***** PIO A portの設定 ***** 0007 215000 LD HL, INTPA ; HLレジスタにOTIRの開始レジスタを書き込み 000a 0603 LD B, 3 ; OTIRの繰り返し回数を指定 000c 0e01 LD C, PIOAC1 ; OTIRの書き込み先にPAの制御レジスタを設定 000e edb3 OTIR ; PAのモード書き込み (モード3, 全出力) ;***** PIO B portの設定 ***** 0010 215300 LD HL, INTPB ; HLレジスタにOTIRの開始レジスタを書き込み 0013 0605 LD B, 5 ; OTIRの繰り返し回数を指定 0015 0e03 LD C, PIOBC1 ; OTIRの書き込み先にPBの制御レジスタを設定 0017 edb3 OTIR ; PBのモード書き込み (モード3, 全出力) ;***** CTC0の設定 0019 215800 LD HL, INTCTC ; HLレジスタにOTIRの開始レジスタを書き込み 001c 0603 LD B, 3 ; OTIRの繰り返し回数を指定 001e 0e80 LD C, CTC0 ; OTIRの書き込み先にPBの制御レジスタを設定 0020 edb3 OTIR ; CTC0の設定 ;***** 割り込み許可 ***** 0022 ed56 IM 1 ; 割り込みモードを1に設定する。 0024 fb EI ; 割り込み許可 ;***** 割り込み待ちループ ***** 0025 3e0f LD A, FFH 0027 d300 OUT (PIOAD1),A ; LEDをすべて点灯 0029 c32900 INTWT JP INTWT ; 割り込み待ち (その場でジャンプ) ;***** 割り込み処理(モード1) ***** ORG 0036H 0036 3800 DEFW PBINT ; PIO B 割り込みの開始アドレスを指定 0038 eeff PBINT XOR FFH ; Aレジスタ反転 003a d300 OUT (PIOAD1),A ; LEDの点灯反転 003c fb EI 003d ed4d RETI ; ;***** PIO・CTC設定 ***** 0050 cf INTPA DEFB 0CFH ; PIO A port: Mode 3 0051 00 DEFB 00H ; PIO A port: All Output 0052 07 DEFB 07H ; PIO A port: No Interrupt 0053 36 INTPB DEFB 36H ; PIO B port: INT Vector = 59H 0054 cf DEFB 0CFH ; PIO B port: Mode 3 0055 ff DEFB FFH ; PIO B port: All Input 0056 97 DEFB 97H ; PIO B port: INT Enable, Trigger=OR, Mask=1 0057 00 DEFB 00H ; PIO B port: No Mask 0058 85 INTCTC DEFB 84H ; CTC: タイマーモード、プリスケーラ1:16、時間定数書き込み後起動 0059 19 DEFB 19H ; CTC: 時間定数25(=19H) 005a 70 DEFB 70H ; CTC: 割り込みベクトル70H ;***** ノンマスカラブルインタラプト ORG 0066H 0066 3e03 LD A, 03H 0068 d300 OUT (PIOAD1),A 006a 76 HALT ;***** CTC割り込み開始アドレス ***** 0070 38 DEFB 36H ``` ## SIOを用いた文字列送信 SIOを用いて、PCのシリアルポートに"Hello, World!"を送り続けるプログラムを作成し実行してみた。システムクロックを25kHz、ボーレートを4800bpsにすることで、以下のツイートの1枚目の動画のようにPCの端末(TeraTerm)に"Hello, World!"を送ることができた。 @[twitter](https://twitter.com/electrotelecast/status/1728073431973757049) ```arduino:SIOを用いて"Hello,World"を送信するプログラム ;*** Title: SIO_test2.txt ;*** Date: 2023/11/24 ;*** Author: 4558D ;Address,opecode,mnemonic PIOAD1 EQU 00H PIOAC1 EQU 01H PIOBD1 EQU 02H PIOBC1 EQU 03H CTC0 EQU 80H CTC1 EQU 81H CTC2 EQU 82H CTC3 EQU 83H SIOAD EQU 90H SIOAC EQU 91H ;***** 初期設定 ***** 0000 313001 LD SP, 0130H ; スタッカポインタのアドレスを指定(RAMアドレスの終端を指定) 0003 3e00 LD A, 0 ; Iレジスタに転送するデータをAレジスタに転送 (LD I,n がないため) 0005 ed47 LD I, A ; 割り込みアドレス上位8bit = 00 ;***** PIO A portの設定 ***** 0007 217000 LD HL, INTPA ; HLレジスタにOTIRの開始レジスタを書き込み 000a 0603 LD B, 3 ; OTIRの繰り返し回数を指定 000c 0e01 LD C, PIOAC1 ; OTIRの書き込み先にPAの制御レジスタを設定 000e edb3 OTIR ; PAのモード書き込み (モード3, 全出力) ;***** PIO B portの設定 ***** 0010 217300 LD HL, INTPB ; HLレジスタにOTIRの開始レジスタを書き込み 0013 0603 LD B, 3 ; OTIRの繰り返し回数を指定 0015 0e03 LD C, PIOBC1 ; OTIRの書き込み先にPBの制御レジスタを設定 0017 edb3 OTIR ; PBのモード書き込み (モード3, 全出力) ;***** SIO A portの設定 ***** 0019 217600 LD HL, SIOAST ; HLレジスタにOTIRの開始レジスタを書き込み 001c 0609 LD B, 9 ; OTIRの繰り返し回数を指定 001e 0e91 LD C, SIOAC ; OTIRの書き込み先にPBの制御レジスタを設定 0020 edb3 OTIR ; PBのモード書き込み (モード3, 全出力) ;***** メインループ ***** 0022 3eff LD A, FFH 0024 d300 OUT (PIOAD1),A ; LEDをすべて点灯 0026 0e90 LD C, (SIOAD) ; データレジスタセット 0028 218000 MLOOP LD HL, (STRG) ; 文字列のアドレスにセット 002b 160f LD D, 15 ; 送信文字数セット 002d 46 SDSTR LD B, (HL) ; Bレジスタに送信文字読み込み 002e db91 XMIT IN A, (SIOAC) ; RR0を読み込み 0030 cb57 BIT 2,A ; TXバッファがEmptyか? 0032 28fa JR Z,XMIT ; FullならEmpty判定に戻る。 0034 ed41 OUT (C), B ; データを送る 0036 23 INC HL 0037 15 DEC D 0038 c22d00 JP NZ,SDSTR 0032 c32800 JP MLOOP ; メインループの開始地点に戻る。 ;***** 100サイクル待機 ***** 0050 0664 WT100 LD B, 64H313 ; Bレジスタに100を格納 0052 05 LOOP DEC B ; Bレジスタをデクリメント 0053 c25200 JP NZ, LOOP ; 0になるまで戻る 0056 c9 RET ; 0になったら待機をやめる ;***** ノンマスカラブルインタラプト ORG 0066H 0066 3e03 LD A, 03H 0068 d300 OUT (PIOAD1),A 006a 76 HALT ;***** PIO・CTC設定 ***** 0070 cf INTPA DEFB 0CFH ; PIO A port: Mode 3 0071 00 DEFB 00H ; PIO A port: All Output 0072 07 DEFB 07H ; PIO A port: No Interrupt 0073 cf INTPB DEFB 0CFH ; PIO B port: Mode 3 0074 ff DEFB FFH ; PIO B port: All Input 0075 07 DEFB 07H ; PIO B port: INT Enable, Trigger=OR, Mask=1 0076 18 SIOAST DEFB 18H ; SIO A port; WR0 CH-Aリセット 0077 01 DEFB 01H ; SIO A port; WR0 次書き込みをWR1に指定 0078 00 DEFB 00H ; SIO A port; WR1 割り込みなし 0079 03 DEFB 03H ; SIO A port; WR0 次書き込みをWR3に指定 007a c1 DEFB c1H ; SIO A port; WR3 受信設定, 8bit 007b 04 DEFB 04H ; SIO A port; WR0 次書き込みをWR4に指定 007c 04 DEFB 04H ; SIO A port; WR4 *1 STP=1, Parity None (300~4800bps) 007d 05 DEFB 05H ; SIO A port; WR0 次書き込みをWR5に指定 007e ea DEFB EAH ; SIO A port; WR5 送信設定, 8bit, DTR on ;***** 送信文字リスト (15文字) 0080 48 STRG DEFB 'H' 0081 65 DEFB 'e' 0082 6c DEFB 'l' 0083 6c DEFB 'l' 0084 6f DEFB 'o' 0085 2c DEFB ',' 0086 20 DEFB ' ' 0087 57 DEFB 'W' 0088 6f DEFB 'o' 0089 72 DEFB 'r' 008a 6c DEFB 'l' 008b 64 DEFB 'd' 008c 21 DEFB '!' 008d 0a DEFB '\n' 008e 0d DEFB '\r' ``` # まとめ 今回作成したサブボードにより、Z80で使用された主要な周辺LSIを用いることができるようになった。最後に、成果と今後の課題を以下にまとめる。 ==成果 ・以前作成したZ80ワンボードコンピュータと組み合わせることで、Z80 CTC、および、Z80 SIOを使用できるようになった。 ・CTCを使用してタイマー割り込みを掛けられるようになった。 ・SIOを使用してPCと通信できるようになった。== ++今後の課題 ・Z80シリーズ以外のICとZ80を接続できるようにすること。 ・UVEPROMやDRAM・SRAM等を使用できるようにすること。++ # 参考文献 [1] 横田英一, Z-80の使い方, オーム社, 1993 [2] 額田忠之, Z80ファミリ・ハンドブック, CQ出版, 1985 [3] 機器開発入門 - 秋月電子 Z80 Cコンパイラ (https://side2949be.web.fc2.com/ref/Z80.html)