AT89S52を以前入手していましたので、開発環境とUSBaspで書き込み、Lチカのプログラム実行を行って見たいと思います。
AT89S52は、8bitマイクロコントローラで、8051コアで動作し、プログラムメモリサイズ8KB、データRAMサイズ256B、5V動作の40ピンDIPです。
入手先は、マルツ、Mouser、Digkey、オレンジピコショップ、AliExpress、Amazonなど
開発環境は、Raspberry Pi3 上のRaspbianです。まずは、アセンブラをインストールします。
アセンブラは、これまで使用していた、ASxxxxを使用します。
バージョンが5.5になっているようなので、ここでは、再度コンパイルしています。
ASxxxxのホームSHOP-PDF.NETからThe ASxxxx Cross AssemblersのXの部分をクリックし、Get the "ASxxxx Cross Assemblers"のリンクマークをクリック、ASxxxx Cross Assemblers Source Code as a zipped file (9363K)をクリックして、ダウンロードするか、下記のWgetコマンドでダウンロードします。
$ wget https://shop-pdp.net/_ftp/asxxxx/asxs5p50.zip
--2024-10-02 16:48:25-- https://shop-pdp.net/_ftp/asxxxx/asxs5p50.zip
shop-pdp.net (shop-pdp.net) をDNSに問いあわせています... 76.189.128.19
shop-pdp.net (shop-pdp.net)|76.189.128.19|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 9587782 (9.1M) [application/zip]
`asxs5p50.zip' に保存中
asxs5p50.zip 100%[=====================================>] 9.14M 793KB/s 時間 11s
2024-10-02 16:48:36 (863 KB/s) - `asxs5p50.zip' へ保存完了 [9587782/9587782]
解答展開します。
$ unzip -L -a asxs5p50.zip
ビルド会場に移動します。
$ cd asxv5pxx/asxmak/linux/build
コンパイルします。
コンパイルには少々時間が掛かります。コーヒーブレークしながら待ちましょう。
$ make
gcc -Wall -funsigned-char -O3 -I../../../asxxmisc/ -c ../../../asxxsrc/asmain.c -o asmain.o
gcc -Wall -funsigned-char -O3 -I../../../asxxmisc/ -c ../../../asxxsrc/asmcro.c -o asmcro.o
gcc -Wall -funsigned-char -O3 -I../../../asxxmisc/ -c ../../../asxxsrc/asdata.c -o asdata.o
・・・続きます。
生成された実行ファイルの場所に移動します。
$ cd ../exe
$ ls
_exe as6100 as6804 as6812 as78k0 as8051 asavr asez80 aslink asrs08 assx asz80
as1802 as61860 as6805 as6816 as78k0s as8085 ascheck asf2mc8 asm8c asscmp asxcnv s19os9
as2650 as6500 as6808 as68cf as8008 as89lp ascop4 asf8 aspdp11 asst6 asxscn
as4040 as6800 as6809 as68k as8008s as8x300 ascop8 asgb aspic asst7 asz280
as430 as6801 as6811 as740 as8048 as8xcxxx asez8 ash8 asrab asst8 asz8
as8051とaslinkをシステムのbinフォルダーにコピーします。
$ sudo cp as8051 /usr/local/bin
[sudo] **** のパスワード:
$ sudo cp aslink /usr/local/bin
as8051とaslinkを確認します。
$ as8051 -h
ASxxxx Assembler V05.50 (Intel 8051)
Copyright (C) 2023 Alan R. Baldwin
This program comes with ABSOLUTELY NO WARRANTY.
Usage: [-Options] [-Option with arg] file1 [file2 ...]
-h or NO ARGUMENTS Show this help list
・・・続きます。
$ aslink -h
ASxxxx Linker V05.50
Copyright (C) 2022 Alan R. Baldwin
This program comes with ABSOLUTELY NO WARRANTY.
Usage: [-Options] [-Option with arg] file1 [file2 ...]
-h or NO ARGUMENTS Show this help list
・・・続きます。
これでアセンブラ環境はできました。
次は、書き込みのためのUSBaspを用意します。
AT89S52では、リセットのレベルが’H’でアクティブになるので、通常のUSBaspが使えません。
USBaspのファームウェアを変更することで、AT89S52対応にすることができます。
まずは、USBaspを2つ用意します。1つは通常のUSBasp用、もう一つはAT89S52ファームウェア変更用のUSBaspです。
ここではAmazonで販売されているUSBaspを用意しました。
「KeeYees USB AVRプログラマ USBasp AVRライタ 51 52 AVRシリーズ 専用ダウンロード用ケーブル付属 10ピン-6ピンISPアダプタ付属 2セット入り」
この製品では、JP2をショートすることで、ファームウェアを変更することができます。
ということで、JP2にピンを立てハンダ付けし、ショートバーでショートできるようにしました。
まずは、USBaspがちゃんと認識されているか、確認します。
ベンダーIDが16c0に プロダクトIDが05dcになっていればOKです。
lsusbを実行します。
$ lsusb
Bus 001 Device 006: .....
Bus 001 Device 007: ID 16c0:05dc Van Ooijen Technische Informatica shared ID for use with libusb
Bus 001 Device 005: .....
Bus 001 Device 004: .....
Bus 001 Device 003: .....
Bus 001 Device 002: .....
Bus 001 Device 001: .....
デバイス007でID 16c0:05dcと認識されています。
次にファームウェアを用意します。
AVR Freaks コミュニティのこちらのページを参照します。
下の方に移動して、Attachments:usbasp_AT89.zip を探します。
クリックして、ダウンロードします。
適当なディレクトリーを作成してその中で解凍します。
$ unzip -L -a usbasp_AT89.zip
解凍すると同じディレクトリーに、main.hexとavrdude.at89及びfirmwareのディレクトリーが作成されます。
$ ls
avrdude.at89 firmware main.hex usbasp_AT89.zip
main.hexはファームウェアとして、avrdude.at89はAT89S52の書き込みの際に、avrdudeの書き込みコマンドの中で指定します。
まずはAT89S52ファームウェア変更用のUSBaspのファームウェアを書き込み準備します。
Raspberry PiのUSBに通常のUSBasp(JP2はオープン)を差し込み、AVR書き込みの差し込み口にもう一つのAT89S52用USBasp(JP2はショート)をAVR書き込みケーブルでお互いを接続します。
main.hexを書き込みします。
$ sudo avrdude -c usbasp -p m8 -U flash:w:main.hex:i
[sudo] **** のパスワード:
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e9307 (probably m8)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "main.hex"
avrdude: writing flash (4572 bytes):
Writing | ################################################## | 100% 2.75s
avrdude: 4572 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex contains 4572 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 2.38s
avrdude: verifying ...
avrdude: 4572 bytes of flash verified
avrdude: safemode: Fuses OK (E:FF, H:D9, L:9F)
avrdude done. Thank you.
これで、AT89S52用USBaspのファームウェアを書き込みしたので、JP2はオープンに設定します。
Lチカする回路図は下記のようになります。
電源は、usbaspの電源から補給しています。
31pin(/EA_VPP)はVCCに接続しないと動作しません。(動作しないのでちょっと悩みました)
Lチカのプログラムを用意します。
以前に作成したSTC12C2052のプログラムを1部変更(LED出力するpin番号とdelayの数値変更)したものです。
同じ8051コアなどで再利用が可能です。
; AT89S52 LED by Pinecone 2024/09/26
;
; AT89S52 cpu
; Flash ROM 8Kbyte
; RAM 256byte
; External clock 12MHz (max33MHz)
; assembler
; program start 000H
; main 100H
;
; assemblers ASxxxx and ASlink V5.50
; file name AT89S52_led01.asm
; $ as8051 -l -s -o AT89S2_led01.asm
; $ aslink -i AT89S52_led01
; program download $sudo avrdude -C avrdude.at89 -p s52 -c usbasp -P usb -U flash:w:AT89S52_led01.ihx:i
;
.area TEST(ABS)
.org 0x0000
ljmp main
.org 0x0100
main:
loop: setb p1.0
lcall delay
cpl p1.0
lcall delay
sjmp loop
delay:
clr a
mov r0,a
mov r1,a
mov r2,#0x2
delay1:
djnz r0,delay1
djnz r1,delay1
djnz r2,delay1
ret
アッセンブル、リンクします。
$ as8051 -l -s -o AT89S52_led01.asm
$ aslink -i AT89S52_led01
ASlink >> -i
ASlink >> AT89S52_led01
書き込みします。
アッセンブル、リンクした同じディレクトリにavrdude.at89をコピーします。
先ほど用意したAT89S52用USBaspを使用してRaspberry PiのUSBに接続して書き込みします。
$ sudo avrdude -C avrdude.at89 -p s52 -c usbasp -P usb -U flash:w:AT89S52_led01.ihx:i
[sudo] **** のパスワード:
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e5206 (probably s52)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "AT89S52_led01.ihx"
avrdude: writing flash (280 bytes):
Writing | ################################################## | 100% 0.38s
avrdude: 280 bytes of flash written
avrdude: verifying flash memory against AT89S52_led01.ihx:
avrdude: load data flash data from input file AT89S52_led01.ihx:
avrdude: input file AT89S52_led01.ihx contains 280 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.10s
avrdude: verifying ...
avrdude: 280 bytes of flash verified
avrdude: safemode: Fuses OK (E:FF, H:FF, L:FF)
avrdude done. Thank you.
約0.3秒ごとに点滅します。