PIC16F628でGKA-98ATを動かす


GKA-98AT

まごの手本舗さんのお造りになった、PC-98用のキーボードをPC/AT互換機のPS/2ジャックに挿して使う変換アダプタGKA-98ATをもう一つ作りたい。GKA-98ATに必要な部品は、PIC16F84以外は手持ちので間に合う。もうちょい新しくて付加機能のある手元にPIC16F628が幾つも残っている(とはいえ何年も前に買ったものですが)。大変ありがたいことにソースを公開して下さっています。PIC16F84をわざわざ買うのも面倒ですしピン互換ぽいので置き換えてみました。したことはPIC16F628A事始に解説頂いてるまんましただけです。参照元が見つからないので、追記すると、ポートがデフォルトでアナログになっているのでデジタルIOに変更することと、アドレス、バンクの変更です。レジスタファイルの先頭アドレス書き換えと、EEPROMアクセスの箇所だけ書き換えたら動きました。当然ながら自己責任で、トラブルが起きてもまごの手本舗さんにご迷惑おかけしないようにお願いします。最近のWindows10で動かしているcore-i7機などでもPS/2ポートがあると動きます。ただ、(そもそも活線挿抜するポートでもないですが)PCのBIOSが走る段階でPS/2に繋がってないとまったく認識されないようです。

ICSP

ICSP周りを追記している2018年現在、PIC16F628も相当過去のチップになりましたが、最近のPICに手持ちのCHIPMAXは対応していないので、開発環境にPICKIT3Aを導入しました。PIC16F84Aの時点でICSPは対応のようです。当時はそれを活用するような環境は整っていないようでしたが。PIC16F628からICSPでの書き込みは対応しているので、MCLRピン周りをF少し修正するとソケットからいちいち抜き差ししなくても書き込みが可能になります。6pinのケーブルがあると書き込みに便利です。まごの手本舗さんで書かれている図に、ICSPDATとICSPCLK相当のICSP用の配線を追加しただけの図ですが、回路図をうpします。運の良いことに、追加配線の13ピンと12ピンは未使用のため、プログラムは下記修正は必要ですが、ポートの変更などは不要です。

ICSP書き込み、PICKIT接続用のピンヘッダを基板上に追加します。また、MCLRにVPPをかけるので、書き込みモードと通常運転モードを切り替えるピンヘッダをMCLRピンの隣に追加します。通常運転モードの際にはジャンパピンでMCLRをリセットIC出力あるいは4.7kを介してVDDにつなぎます。特に、VPPがかかるのでリセットIC保護のためこのジャンパは必要でしょう。LVPモードの書き込みも可能かもしれませんが検証していません。

PS/2-USB変換

USB-PS/2変換三種昔購入したPS/2-USB変換のArea コンバティーノ(ベンダID 0A81 デバイスID 0205)ではうんともすんともいわず、全く動作しませんでした。最近Aliexpressでいろいろ出ているので、だめもとで買ってみたところ、どれもベンダID 13BA デバイスID 0018でGKA-98ATから変換できてあっさり動きました。ただし、何の違いなのか、1個のGKA-98ATでは動作しましたが、もう1個は怪しい動作でまともに動作しているとはいえない状態でした。大昔に作ったものなので何の違いかは分かりませんが、前者は16F628Aを使ったもの、後者は16F84Aを使ったもので動作周波数も10MHzで同じはずですが、PICの違いが原因ではなく、configurationレジスタや設定の違いなどが関係しているかもしれません。それか、mini-DIN 8pinの切り替え経由で使って信号が劣化しているなどの原因かもしれません。良く分かりませんが、動く場合がある、という程度で動作報告とします。

書き換え箇所

プロセッサ選択(108〜112行目)

	RADIX		DEC
	PROCESSOR	16F84A
	INCLUDE		"P16F84A.INC"
	__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON
	__IDLOCS	H'0001'

☆☆☆書き換え後☆☆☆
	RADIX		DEC
	PROCESSOR	16F628
	INCLUDE		"P16F628.INC"
	__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON & _MCLRE_ON & _LVP_OFF
	__IDLOCS	H'0001'

システムクロック(116行目)

#DEFINE	SYS_CLK 	0	; システムクロック 0=6.144MHz 1=10MHz

☆☆☆書き換え後☆☆☆
#DEFINE	SYS_CLK 	1	; システムクロック 0=6.144MHz 1=10MHz

ワークエリアの割り当て(142〜184行目)

WAIT0		EQU	0Ch
(中略)
PS2_DBAK	EQU	25h	; 直前に送信されたPS/2データ
☆☆☆書き換え後☆☆☆
WAIT0		EQU	20h
(中略)
PS2_DBAK	EQU	39h	; 直前に送信されたPS/2データ

スタートアップ(307〜308行目)

	ORG	00h
	BSF	STATUS,RP0	; SELECT PAGE 1

☆☆☆書き換え後☆☆☆
	ORG	00h

        clrf    PORTA           ; @Chg
        movlw   0x07            ; @Chg コンパレータOFF
        movwf   CMCON           ; @Chg ディジタルI/Oとして定義

	BSF	STATUS,RP0	; SELECT PAGE 1

EEPROM処理関連(1735〜1766行目)

EE_WRITE
	BCF	STATUS,RP0	; PAGE 0
	MOVWF	EEDATA
	MOVF	E_ADR,0
	MOVWF	EEADR
	BSF	STATUS,RP0	; PAGE 1
	BSF	EECON1,B2	; WRITE ENABLE
	MOVLW	55h		; EEPROM WRITE 1st PASSWORD 1
	MOVWF	EECON2
	MOVLW	0AAh		; EEPROM WRITE 2nd PASSWORD 2
	MOVWF	EECON2
	BSF	EECON1,B1	; WR BEGIN WRITE
WAIT_EEW
	BTFSC	EECON1,B1	; WAIT FOR WRITING
	GOTO	WAIT_EEW
	BCF	STATUS,RP0	; PAGE 0
	RETURN
;
; DATA EEPROM READ
; IN: W=EEPROM ADDRESS OUT: W=EEPROM DATA
;
EE_READ
	BCF	STATUS,RP0	; PAGE 0
	MOVWF	EEADR		; SET ADDRESS
	BSF	STATUS,RP0	; PAGE 1
	BSF	EECON1,B0	; READ BEGIN
WAIT_EER
	BTFSC	EECON1,B0	; WAIT FOR READING
	GOTO	WAIT_EER
	BCF	STATUS,RP0	; PAGE 0
	MOVF	EEDATA,0
	RETURN

☆☆☆書き換え後☆☆☆
EE_WRITE
	BSF	STATUS,RP0	; PAGE 1
	MOVWF	EEDATA
	BCF	STATUS,RP0	; PAGE 0
	MOVF	E_ADR,0
	BSF	STATUS,RP0	; PAGE 1
	MOVWF	EEADR
	BSF	EECON1,B2	; WRITE ENABLE
	MOVLW	55h		; EEPROM WRITE 1st PASSWORD 1
	MOVWF	EECON2
	MOVLW	0AAh		; EEPROM WRITE 2nd PASSWORD 2
	MOVWF	EECON2
	BSF	EECON1,B1	; WR BEGIN WRITE
WAIT_EEW
	BTFSC	EECON1,B1	; WAIT FOR WRITING
	GOTO	WAIT_EEW
	BCF	STATUS,RP0	; PAGE 0
	RETURN
;
; DATA EEPROM READ
; IN: W=EEPROM ADDRESS OUT: W=EEPROM DATA
;
EE_READ
;	BCF	STATUS,RP0	; PAGE 0
	BSF	STATUS,RP0	; PAGE 1
	MOVWF	EEADR		; SET ADDRESS
	BSF	EECON1,B0	; READ BEGIN
WAIT_EER
	BTFSC	EECON1,B0	; WAIT FOR READING
	GOTO	WAIT_EER
	MOVF	EEDATA,0
	BCF	STATUS,RP0	; PAGE 0
	RETURN

パッチファイル

Winmergeで作ったパッチファイルをうpして置きます。


Valid HTML 4.01 Strict