ブログの練習

ブログを書く練習です。
最近はレトロな計算機(電卓、マイコン、パソコンなど)
に関することを書き始めました。

ZK-80(TK-80互換機)のLED改装

2020-01-05 18:43:35 | マイコン


ZK-80というTK-80互換機のキットがあったので作ってみました。小型版のZK-80ポケットというものもあり、こちらはLEDの輝度やセーブロード機能あたりが若干改良されています。
LEDが本物と全然違うのが残念だったので、本物に近いSN713B(本物はSN713A)に改装してみました。

まず,ZK-80で試してみたのですが,ZK-80はI/Oを節約するためにかなりトリッキーなことをしており,アノードコモンとカソードコモンを混在させている上に,キーボード入力にも同じポートを使うということをしています.
SEG_A-HとDIG_0-7を論理値として取り出すことはできたのですが,キー入力時に乱れてしまい,うまく動かないのであきらめ,ZK-80ポケットを入手して試してみました.

ZK-80Pの方は素直な作りになっているので,MAX7219の出力をトランジスタアレイに食わせてカソードコモンをアノードコモン(コモン側がソースでセグメント側がシンク)に変換できました.
シンク側はTBD62083,ソース側はTBD62783を使い,ソース側の入力は7404で反転させました.
TBD62785(もしくは62786)という負論理の石が入手できれば7404は不要なのですが,秋月や千石で売ってなかったのでそのようにしました.
(【2020/6/12補足】データシートの入力電圧を見たら62786は使えないような気がしてきました。)
(【2020/6/19補足】秋月でTBD62785が買えるようになったようです。)

MAX7219の基板の上に、本来のLEDと置き換えられるように作ったので、4段重ねになっています。



本物(といっても実はMK-80という互換機)と比べるとこんな感じ。



こちらの互換機は基板のパターンはTK-80と同じで、マニュアルもNECの純正品が付属という完コピ機です。小学生の頃にお年玉で買って組み立てたものなのですが、最近40年ぐらいぶりに電源を入れたところちゃんと動作してくれました。



写真だとわかりにくいですが、思ったより暗いので原因を調べたところ,各LEDのコモンの信号が1/8(8桁なので)のさらに1/6の幅しかアクティブになっていないようでした.(800Hz, パルス幅約26μs(DT比1/48))

ファームウェアのソースを見ると輝度10輝度2(10はレジスタ番号で値は2でした)という設定がされており,おそらくそれによるものと思われ,そこをいじれば良さそうではあります.

【2020/1/11 追記】
ファームウェアをいじってみました。以下、やったことのまとめ。

PICの開発環境をインストール。最新版はMPLAB X v5.30らしい。
microchip.co.jpの開発環境のページがリンク切れでエラー。microchip.comから取ってくる。
コンパイラは MPLAB XC32/32++ Compiler v2.30
デバッガ/プログラマは MPLAB Snap

plib.hが無いと言われる。どうやらlegacy libraryという位置付けになっているらしく、
PIC32 Legacy Peripheral Libraries - Windows を取ってきてインストール。
デフォルトだと1.40のフォルダにインストールされるようなのでインストール先を選ぶときに2.30に変更。
最初これに気づかずにハマってました。

新規プロジェクトを作成してデバイスにPIC32MX170F256Bを選択。空のプロジェクトができるので、
Header FilesとSource Filesに"Add existing item"でコピー。

ソースは、picosoftのZK-80のページから取ってきたファームウェア
2018-05-13-_ver023.zip
ZK-80Pのページ
ファームウェア差分
を上書きしたものを使用。

legacy periferal libraryがらみのwarningがうるさいので
main.hで
#define _SUPPRESS_PLIB_WARNING として抑制。
Max7219.cのfor文の中で変数宣言しているところでエラーが出たので修正。

peripheral.hでnvm.hが無いと言われたのでちょっと乱暴だけどコメントアウト。
最新版の開発環境でペリフェラルの機能を使うためにはHarmonyなるフレームワークを使うのが正攻法らしいのだが、
いまいち使い方がわからなかったので暫定対処。

割り込みの初期化をinit_LED()の前に入れないとタイマー割り込みでリセットに飛ばされるので、
main.cの
INTEnableSystemSingleVectoredInt()
INTEnableSystemMultiVectoredInt()
をinit_LED()の前に移動。
led.cにあるinit_LED()の中のIEC0bits.T1IE=1;が原因っぽい。(これは変更せずそのまま)
これを見つけるのに苦労しました。

以上で正常に動くものがビルド出来たので、最後にMax7219.cのsetIntensity(2)を8に変更。
コモンのパルス幅がDT比1/8*1/2ぐらいになってかなり明るくなりました。
(周囲の明るさが前回と違うので、この写真だと違いがわからないですが。)



【2020/7/4追記】
基板を作りました。
OGPイメージ

ZK-80P用LED表示盤完成 - ブログの練習

修正版の基板が届きました。10枚注文で12枚入っているのでラッキー!っと思ったら、傷ありが1枚。不良品混在を見越して余分に入っているのでしょ...

ZK-80P用LED表示盤完成 - ブログの練習

 


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« PC-8033を自作する | トップ | 昔のマイコン雑誌 »
最新の画像もっと見る

コメントを投稿

マイコン」カテゴリの最新記事