最近、秋葉原にあるマイコンでいじったことがあるものばかりになってしまいました。。。digikey とかを使うと考えているのですが、身近でないのでなんか手が出ません。
ということなので、最近欲求不満であらゆるお店をマイコン屋さんとして見てしまいます。もう元には戻れない。
さて、色々とマイコン屋さんたちでマイコンを探していると、aitendo で ABOV 社(韓国)の 8bit マイコンを見つけました。
CPU コアは Intel 8051 が入っているようであまり目新しくはないですが、ペリフェラルをいじってみたいなあということで買ってみました。
最強らしいです(笑)
8bitマイコンなので...
8bit マイコンといったら、書き込み方法が特殊というのがよくあるパターンです。最近の 32bit マイコンだったら共通のデバッグ規格とか、容易にシリアル通信できるのがほとんどですがね。8bit マイコンは独自規格がお好きなわけです。例を上げると...
- AVR: SPI or TPI(米粒AVR)
- STM8: SWIM
- PIC: ICSP
まぁこんなもんです。
今回もご多分に漏れずそうなっています。回路構成は以下のような感じです。線が2本あって、双方向のデータとクロックです。そしてそれをオープンドレインとして駆動し、VDD との間に抵抗器を入れて吊っておきます。I2C みたいですね。
開発環境を作る
いつもどおり、コンパイラと書き込み環境を作りましょう。ただ、今回はちょっとばかし特殊です。
コンパイラ
コアが Intel 8051 ということで、例によって sdcc
を使います。こいつ結構癖が強いんだよなぁ
$ brew install sdcc
書き込みソフト
z51dude というものを使います。このソフトについては Hackaday.io の記事でも紹介されていますが、当記事でもご紹介したいと思います。
構成
z51dude
を使うためには回路を構築する必要があります。その時に使うのが あの忌まわしきArduino です。書き込みのための通信プロトコルが特殊なので、USB - シリアル変換IC で直接利用できないということが理由だと考えられます。なので PC -> Arduino -> マイコン とすることで、いい感じに通信方式を変換しているのです。
個人的には、Arduino Micro が小さくて使いやすいと思いますね。実際僕が使っているのもそれです。先日落ちてた Arduino Micro を拾い、持って帰ってきたのですが、ここで役立つとは。
クローン・ビルド
このソフトのリポジトリは GitLab にあります。いつも通りに clone
するだけです。
$ git clone https://gitlab.com/hb9xar/z51dude
クローンが終わったら、ビルドを進めておきましょう。まずは PC で起動する方のソフト。
$ cd z51dude/z8051_dude
$ make # PCサイドの書き込みソフトをビルド
続いて Arduino に書き込むプログラムをビルドします。ここで、avr-gcc
が必要になりますので要注意。
$ cd ../z8051_ocd_adapter/ocd_arduino
$ make # Arduinoサイドのファームウェアをビルド
できたら書き込んじゃいましょうか。サクッとできましたね。
$ avrdude -P /dev/cu.usbserial-AC01RUQ9 -c arduino -p m328p -U z51dude.elf
回路構成
上の Hackaday.io に掲載されている回路図は間違っているので(ひょっとして過去のコミットでは合っていた?)、正しいピンアサインを掲載いたします。まずは Hackaday.io の回路図です。トランジスタ・プルアップ抵抗の構成はこの通りにしてください。Arduino 側のピン番号はこれとは違います。
正しいピン番号はこちら。正直 Q5+ の存在意義が分からんが。
Arduino ピン名 | マイコンピン番号 | マイコンピン名 | 備考 | |
---|---|---|---|---|
D2 | → | - | - | 電圧センス端子。PNP トランジスタのコレクタに。 |
D9 | → | - | - | マイコンへの+5供給スイッチ。PNP トランジスタのベースに。 |
D10 | → | 36 | DSCL | プルアップ抵抗で吊る |
D11 | → | 37 | DSDA | プルアップ抵抗で吊る |
で、接続ができているか確認するには以下のコマンドを叩けばいいです。
$ z8051_dude -d /dev/cu.usbserial-AC01RUQ9 --bl-arduino -i -e
waiting for target to power up...
0x80 0x86 0x01 ← 0x00だけ/0xFFだけじゃなければ良い
send echo
cmd_echo: send echo
received echo
echo ok ← echo okと出れば良い
やってみよう
取り敢えず無駄ループで LED チカチカしちゃいますか。
#include <stdint.h>
// P10(#22): LED
__sfr __at(0x88) P1;
__sfr __at(0xB1) P1IO;
int main(void){
P1IO = 1;
P1 = 1;
while(1) {
for(volatile uint16_t i=0; i<10000; i++);
P1 ^= 1;
}
}
はいはい、ビルド。
sdcc -mmcs51 --std-c99 a.c
そして書き込んじゃいましょう。
$ z8051_dude -d /dev/cu.usbserial-AC01RUQ9 --bl-arduino -i -x -w ~/a.ihx --reset --go
これで動くはずです。地味にこのコマンドがハマりポイント(というか僕が勝手にハマっていたのか?)なのですが、書き込み時に -x
(イレース)をつけないと、書き込みが正常にできません。ソフト側から見たら正常に終わっているように見えるのですが、そうではないようです。
最後に --reset --go
を付けることで、書き込み後即座にリセットをしてプログラムの起動を行っています。