8051コアの流れを汲む100円マイコンSTC12C2052(aitendoで販売)のLチカに挑戦しました。
このマイコンはSTC社製ですが、8051コアになっており製品のラインアップで機能が追加されているようです。
一番基本のSTC12C2052を調理することでいろんな応用が期待できます。
また、8051コアは、EZ-USBなどのCPUコアに使われており、ソフトの応用もできそうです。

STC12C2052へのソフトの書き込みは、書き込みの用のローダが内蔵しており、シリアルでの通信でダウンロードができるようですが、ホスト側は専用のソフトが必要のようです。

書き込み方法等についてYoshi様のブログを参考にさせていただきました。
貴重な情報ありがとうございます。(すみません勝手にリンクしました。)

まずは開発環境ですが、とりあえずアセンブラで挑戦することにします。
Z80でも使用していたASxxxxのas8051を使用します。

一応Linux使いなので、RaspberryPi3のRaspbian上で行います。
まずは、asxxxxですが バージョンが新しくなっていたので再インストールしました。

ソースコードを取得します。
wget http://shop-pdp.net/_ftp/asxxxx/asxs5p31.zip

展開します。
unzip -L -a asxs5p31.zip

ビルド会場に移動します
cd asxv5pxx/asxmak/linux/build

コンパイルします。
make

生成された実行ファイルの場所に移動します。
cd ../exe

as8051とaslinkをシステムのbinフォルダーにコピーします。
sudo cp as8051 /usr/local/bin
sudo cp aslink /usr/local/bin

これでアセンブラ環境はできました。
次は、作成したHexファイルをSTC12C2052にダウンロードするためのUSBシリアルケーブの設定を行います。
今回使用したのはamazonで格安な「オーディオファン シリアルケーブル USB-A - TTL シリアルコンソール USB変換ケーブル 1m」を使用しました。

USBシリアルケーブルをRaspberryPiに接続します。
lsusbを実行します。

$ lsusb
Bus 001 Device 006: ID 192f:0416 Avago Technologies, Pte. ADNS-5700 Optical Mouse Controller (3-button)
Bus 001 Device 004: ID 04f3:0103 Elan Microelectronics Corp. ActiveJet K-2024 Multimedia Keyboard
Bus 001 Device 007: ID 1bcf:0c31 Sunplus Innovation Technology Inc. SPIF30x Serial-ATA bridge
Bus 001 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 008: ID 0424:7800 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

リストの中からシリアルデバイスを確認します。
「Bus 001 Device 005: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port」が該当しますのでこの中の IDを控えます。
このシリアルケーブルはID 067b:2303  となります。

続いて一般ユーザーがシリアルポートを使えるようにするために、シリアルデバイスのルールを追加します。
下記のデレクトリィに移動します。
cd /etc/udev/rules.d/

ルールファイルを新規に作成します。ここでは54-udev.rulesとしました。
sudo vim 54-udev.rules

先ほど控えたシリアルケーブルのIDから、ATTRS{idVendor}==にIDNoの先頭067b、ATTRS{idProduct}==にIDNoの 後方2303にします

KERNEL=="ttyUSB*", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", GROUP="uucp", MODE="0666"

これで、シリアルポートを一般ユーザーが使用できるようになりました。

次に書き込み用のpythonで記述されているstcgalをダウンロードします。

sudo pip3 install stcgal

Lチカのサンプルプログラムを作成します。
今回はP3.5(9pin)にLEDを接続し、点滅するようにしました。

リセット後、0x0000からスタートするので、ljmp命令でmainに飛びます。
mainではポートの設定をしています。P3.5のみ出力で他は入力設定です。
setbで p3.5をHにして、時間待ちのdelayサブルーチン復帰後、p3.5のビット状態を反転し、ループします。
delayルーチンは、stc12c2052仕様書のサンプルプログラムを拝借しました。

全体的なプログラムは下記のようになります。
ファイルネームは 2052_led01.asm としました。

; STC12C2052  LED by Pinecone 2019/11/8
;
; STC12C2052 cpu
; Flash ROM 2Kbyte
; RAM       256byte
; External clock -
 
; assembler
;  program start 000H 0000H-07ffH
;  main          100H
;
; assemblers  ASxxxx and ASlink V5.31
; file name 2052_led01.asm
; $ as8051 -l -s -o 2052_led01.asm
; $ aslink -i 2052_led01
; $ program download  stcgl 2052_led01.ixh  
;       

P3M0	.equ	0xb1
P3M1	.equ	0xb2

	.area	TEST(ABS)

	.org	0x0000

	ljmp	main

	.org	0x0100
main:
	mov	P3M0,0b11011111		;P3.5 output 
	mov	P3M1,0b00100000		;P3.7 P3.6 P3.4-P3.0 input

	setb	p3.5
loop:	lcall	delay
	cpl	p3.5
	sjmp	loop

delay:
	clr	a
	mov	r0,a
	mov	r1,a
	mov	r2,#0x20
delay1:
	djnz	r0,delay1
	djnz	r1,delay1
	djnz	r2,delay1
	ret

アセンブルします。
as8051 -l -s -o 2052_led01.asm

リンクします。
aslink -i 2052_led01

これで、2052_led01.ihx が作成されて書き込みの準備ができました。

ハードウエアの準備をします。
回路図は下記の通りです。今回は書き込みのテストということで、ブレッドボードで作成しました。

電源はスマホ対応の電源アダプターから、USBソケット( 電源用マイクロUSBコネクタDIP化キット :秋月電子)を使用しました。


JP1,JP2は、書き込み用ローダを起動させるためにGNDに接続しておきます。 USBシリアルケーブルを接続し、電源アダプターを接続します。
VCC_SWを切りの状態で、書き込みソフトを起動します。
stcgal

実行すると
Waiting for MCU, please cycle power: とメッセージが表示されるので、VCC_SWをONして電源を接続します。

Waiting for MCU, please cycle power: done
Protocol detected: stc12a
Target model:
  Name: STC12C2052
  Magic: F202
  Code flash: 2.0 KB
  EEPROM flash: 4.0 KB
Target frequency: 5.762 MHz
Target BSL version: 5.8D
Target options:
  low_voltage_reset=low
  clock_source=internal
  watchdog_por_enabled=False
  watchdog_stop_idle=False
  watchdog_prescale=256
  eeprom_erase_enabled=False
  bsl_pindetect_enabled=False
Disconnected!

とメッセージが表示されれば、接続は正常です。

再度VCC_SWを切りVCCをOFFにします。

書き込みを行います。
stcgal 2052_led01.ihx

Waiting for MCU, please cycle power:の表示が出たら VCC_SWをONします。

Protocol detected: stc12a
Target model:
  Name: STC12C2052
  Magic: F202
  Code flash: 2.0 KB
  EEPROM flash: 4.0 KB
Target frequency: 5.766 MHz
Target BSL version: 5.8D
Target options:
  low_voltage_reset=low
  clock_source=internal
  watchdog_por_enabled=False
  watchdog_stop_idle=False
  watchdog_prescale=256
  eeprom_erase_enabled=False
  bsl_pindetect_enabled=False
Loading flash: 283 bytes (Intel HEX)
Switching to 19200 baud: checking setting testing done
Erasing 2 blocks: done
Writing flash: 640 Bytes [00:00, 2240.02 Bytes/s]
Setting options: done
Disconnected!

の表示で書き込み終了です。

書き込みが終われば、接続しているLEDが点滅するはずです。
なんとか Lちか することできました。

8051コア, STC12C2052の関連記事
  • 8051コアに萌えたい STC12C2052 LCD(キャラクタ)
  • 8051コアに萌えたい STC12C2052 シリアル通信
  • 8051コアに萌えたい STC12C2052 Lチカ
おすすめの記事
Z8S180
ハード的にマイコンとの通信がUSB経由でできるようになりましたので、Z80側に通信用確認プログラムを作成して、ちゃんと通信できるか確認したい...