PIC

ZK-80 mini (PIC32MXを使った1チップTK-80互換機)

2013年7月10日

ZK-80 miniを紹介します。NECのTK-80互換機で、Microchip社のPIC32MX120F032Bを用いて1チップで構成されています。

2013-07-10-AUT17703.jpg

実行中の動画です。


回路図は次の通りです(クリックで拡大表示)。
2013-07-10-schematic.png
PIC32MX120F032Bと基本構成のコンデンサー以外には、7セグメントLED・スイッチ・抵抗だけのシンプルな構成です。水晶は使わずに、PIC内部のRC発振を用いています。

LEDのダイナミック点灯では、一度に点灯するLEDを一つだけに絞ることで、トランジスターを使わない回路構成にしてあります。そのため、表示が若干暗めですが、実用上は差し支えない範囲に収まりました。なお、R2-R5の抵抗値を220 Ωまで下げると若干明るくなるかも知れません(PICの最大定格出力になります)。

ZK-80 mini ver 0.2のダウンロードはこちらから。
ZK-80 mini ver 0.22のダウンロードはこちらから。
ライセンスは、LGPL v2.0です。

コメント

Katsumi (2013年7月13日 14:02:54)

ver 0.22をアップロードしました。プログラムを微調整したので、動作安定性が向上しているはずです。また、リセットスイッチを押したときに編集したプログラムが変更されてしまわないようにしました。

e.naka (2013年7月18日 14:25:08)

アノードコモントカソードコモンの使い分けに目からうろこ。
スピーカーも欲しかった。

Katsumi (2013年7月19日 07:57:11)

e.nakaさん、こんにちは。

スピーカーとか、追加の部品が要る実装に関しては、なかなか情報が無くて…。

考えようによっては、そういった物は実機のTK-80と同じく、皆さんで追加とコードの終生という事でどうでしょう(笑)。ポートが3つ(RA2-4)、空いていますし。

プログラムのセーブとロードもまだ対応できていませんが、これに関してはRB0/RB1を介したシリアル通信で実装しようと思っています。

T.YANA (2015年6月14日 02:13:03)

作ってみました。圧電ブザーもつないでペリフェラルに割り当てました。TK-80のプログラムがほぼそのまま動いてとってもいいですね。
ついでにTK-80のモニタリストを打ち込んで差し替え、PIC32MX150F128Bのプログラムメモリ余裕分にデモプログラムをいくつか入れて簡易ロード機能をつけてみました。
後はEEPROMをI2Cでつないでセーブ・ロードを実現しようと奮闘中です。

Katsumi (2015年6月14日 13:37:20)

T.YANAさん

初めて製作の報告を頂いて、とっても嬉しいです。そうですか、TK-80のプログラムがそのまま動きますか。それは、良かったです。TK-80の実機を持っていない(購入を検討したことはありましたが)ので、そのあたりが分からなかったのです。

色々改造なさっているようで、このあたりもTK-80の醍醐味ですよね。もし良かったら、その様子も公開なさって頂けたらと思います。

今後ともどうぞよろしくお願いします。

T.YANA (2015年6月23日 07:08:35)

私のスキルではEEPROMをI2Cでつなぐことができずに断念し、代わりにSD-CARDを乗せました。無駄に大容量ですが、セーブ、ロードできる上にSD-CARDを挿し替えればパソコンでも読み書きできるので便利となりました。
ところでひとつ教えていただければありがたいのですが、プログラムを修正しているうちにいつの間にか、実行中にリセットを掛けると8000hから数バイト(7~11Byte)がゼロクリアしてしまうという現象が現れるようになりました。
回避方法について情報があればうれしいのですが。

Katsumi (2015年6月23日 12:10:44)

SDカードに繋げられるというのは、面白いですね。

リセットしたときにすべてのコードが無くなってしまうのならともかく、一部だけ書き換わってしまうというのは、変ですね。もしかしたら、コードの追加によりヒープ領域が足りなくなってて、グローバル領域まで進入してしまっているのかも知れません。もしこれが原因なら、次のような解決策が考えられます。

1)メモリー容量の大きいPIC、例えばPIC32MX130F064BとかPIC32MX150F128Bなどに置き換える。
2)TK-80で使用するRAMの容量を減らす。main.hの18行目付近と23行目付近を、両方とも"RAM[0x1700]"、あるいは両方とも"RAM[0x1600]"、等とする。

試してみて下さい。

T.YANA (2015年6月23日 15:15:31)

1)2)とか、オプティマイズレベルを変えてみるとか、いろいろ試してみてはいたのですが、改善しませんでした。
ですが、RAM[0x1800]の前に同量のRAM2[0x1800]を追加してやると直りました。
無駄な領域宣言でなんで直るのかわかりませんが、直ったのでよしです。
HANDY TK-80として当分の間楽しく遊べそうです。
ありがとうございました。

Katsumi (2015年6月23日 16:50:40)

解決方法が見つかって、良かったですね。何かの領域が、RAM領域と重なっているのでしょう。その部分に別の使用しない領域を割り当てることで直っているのですね。

原因として考えられるのは、追加したコードのグローバル関数の割り当て部分でしょうか。あるいは、ヒープ領域をはみ出している可能性があるので、ヒープ領域を少し大きく取ることで改善するかも知れません。

名無しさん (2015年11月10日 23:49:38)

カソードコモンのLEDを使いたいのですが、PICのIO足りませんよね。
BCDで出して74HC138でも付ければなんとかなりそうですが、極力外付けしたくありませんし、なにか良い案ありますでしょうか?

Katsumi (2015年11月12日 13:16:53)

すみません。状況がよく分からないので、PICの種類や使用目的など、説明頂ければと思います。

純粋に、足の数の多いPICを使えば解決するのではと思うのですが…。

T.YANA (2016年3月2日 04:24:09)

ふと、XC32を1.21にしてコンパイルしてみたところ、「8000hから数バイト(7~11Byte)がゼロクリアしてしまうという現象」がぴたりと直りました。
今まで1.31を使っていて特に不都合が無かったのでそんなところに問題があるとはちっとも思っていませんでした。
これでPIC32MX150F128BではTK-80として29kByteもの広大なメモリ空間が使えるようになるんですけど、どうしましょう(笑)。

Katsumi (2016年3月3日 11:37:59)

T.YANAさん

こんにちは。そうですか、コンパイラーのバージョンを下げるとうまく行ったわけですね。何が問題だったのかよく分かりませんが、とりあえず解決ということでしょうか。

29kByteもの広大なメモリ空間が出来てしまったのなら、それにぎりぎり収まる大きさのソフトを開発して、是非公開しましょう(笑)!

他には、こんな物をTwitterで教えて頂きました。試してみてはどうでしょうか?
http://triring.net/program/Assembler/Worm/index.html

かんぱぱ (2016年12月31日 06:22:18)

本物のTK-80のキーボードを接続したものを作ってみました。
https://kanpapa.com/today/2016/12/zk80-tk80kbd.html
LOAD/SAVEは実装してみたいですね。あと音も鳴らしたいです。
これからコンパイル環境をつくってみます。

コメント送信