AT90S2313はもう廃品種になっているようですが、秋月電子で100円(2021.10.1現在)で売られていますので、いろいろ試してみました。(アセンブラオンリーです。^^;)
開発環境は、RaspberryPi上のRaspbian(OS)です。
書き込み器はUSBaspで書き込みソフトはavrdudeです。
アセンブラはasxxxxのasavrを使用します。
asavrはAVRの初期の品種に対応しているようです。
AT90S1200 AT90S2313 AT90S2323 AT90S2343 AT90S2333 AT90S4433 AT90S4414 AT90S4434 AT90S8515 AT90C8534 AT90S8535 ATmega103 ATmega603 ATmega161 ATmega163 ATtiny10 ATtiny11 ATtiny12 ATtiny15 ATtiny22 ATtiny28
では早速、asavrをインストールします。
asxxxxはVersion5.40にバージョンアップしているようなので最初からインストールします。
ソースコードを取得します。
$ wget http://shop-pdp.net/_ftp/asxxxx/asxs5p40.zip
展開します。
$ unzip -L -a asxs5p40.zip
ビルド会場に移動します。
$ cd asxv5pxx/asxmak/linux/build
コンパイルします。ちょっと時間がかかります。コーヒーブレイクしましょう!
$ make
生成された実行ファイルの場所に移動します。
$ cd ../exe
$ ls
_exe as6500 as6809 as78k0s as89lp asf2mc8 aspic asxcnv
as1802 as6800 as6811 as8008 as8x300 asf8 asrab asxscn
as2650 as6801 as6812 as8008s as8xcxxx asgb asscmp asz280
as430 as6804 as6816 as8048 asavr ash8 asst6 asz8
as6100 as6805 as740 as8051 ascheck aslink asst7 asz80
as61860 as6808 as78k0 as8085 asez80 asm8c asst8 s19os9
asavrとaslinkをシステムのbinフォルダーにコピーします。
$ sudo cp asavr /usr/local/bin
$ sudo cp aslink /usr/local/bin
$ cd ~
$ asavr
ASxxxx Assembler V05.40 (Atmel AVR 8-Bit RISC)
Copyright (C) 2021 Alan R. Baldwin
This program comes with ABSOLUTELY NO WARRANTY.
Usage: [-Options] [-Option with arg] file
Usage: [-Options] [-Option with arg] outfile file1 [file2 ...]
-h or NO ARGUMENTS Show this help list
以下略
$ aslink
ASxxxx Linker V05.40
Copyright (C) 2021 Alan R. Baldwin
This program comes with ABSOLUTELY NO WARRANTY.
Usage: [-Options] [-Option with arg] file
Usage: [-Options] [-Option with arg] outfile file1 [file2 ...]
以下略
これでアセンブラ環境はできました。
次にavrdudeをインストールします。
(前回の記事「USBaspのファームウェアをRaspberryPiで書き込みしてみる。」でインストールしている場合は必要ではありません。)
$ sudo apt-get install avrdude
次に一般ユーザーがavrdudeを使用できるようにします。(sudoで実行、または、piでloginしている場合は必要ありません。)前の記事「avrdudeをsudoを使わずにユーザーでも実行できるようにする」を参照してください。
書き込み器USBaspはamazon、aitendouなどでも販売していますが、自作も可能です。
前回記事を参照ください。
「USBaspフリスク自作しました^^」
「 USBaspのファームウェアをRaspberryPiで書き込みしてみる。 」
USBaspとターゲットAT90S2313との接続は下記のとおりです。
USBaspーーーーーーターゲットAT90S2313
MISO ーーーーーーPB6(MISO)18pin
VCC ーーーーーーVCC 20pin
SCK ーーーーーーPB7(SCK)19pin
MOSI ーーーーーーPB5(MOSI)17pin
RST ーーーーーーーRESET 1pin
GND ーーーーーーーGND 10pin
なお、電源は、USBaspから供給しています。
開発環境が整いましたので早速、LEDの点灯を行ってみます。
まずは、I/Oレジスタを登録しました。
;I/O regster
SREG .equ 0x3f ;Status Register
SPL .equ 0x3d ;Stack Pointer Low
GIMSK .equ 0x3b ;General Interrupt MaSK register
GIFR .equ 0x3a ;General Interrupt Flag register
TIMSK .equ 0x39 ;Timer/Counter Interrupt MaSK register
TIFR .equ 0x38 ;Timer/Counter Interrupt Flag register
MCUCR .equ 0x35 ;MCU general Control Register
TCCR0 .equ 0x33 ;Timer/Counter 0 Control Register
TCNT0 .equ 0x32 ;Timer/CouNTer 0
TCCR1A .equ 0x2f ;Timer/Counter 1 Control Register A
TCCR1B .equ 0x2e ;Timer/Counter 1 Control Register B
TCNT1H .equ 0x2d ;Timer/CouNTer 1 High byte
TCNT1L .equ 0x2c ;Timer/CouNTer 1 Low byte
OCR1AH .equ 0x2b ;Output Compare Register 1 High byte
OCR1AL .equ 0x2a ;Output Compare Register 1 Low byte
ICR1H .equ 0x25 ;T/C Input Capture Register High byte
ICR1L .equ 0x24 ;T/C Input Capture Register Low byte
WDTCR .equ 0x21 ;WatchDog Timer Control Register
EEAR .equ 0x1e ;EEPROM Address Register
EEDR .equ 0x1d ;EEPROM Data Register
EECR .equ 0x1c ;EEPROM Control Register
PORTB .equ 0x18 ;Data Register, Port B
DDRB .equ 0x17 ;Data Direction Register, Port B
PINB .equ 0x16 ;Input Pins, Port B
PORTD .equ 0x12 ;Data Register, Port D
DDRD .equ 0x11 ;Data Direction Register, Port D
PIND .equ 0x10 ;Input Pins, Port D
UDR .equ 0x0c ;UART Data Register
USR .equ 0x0b ;UART Status Register
UCR .equ 0x0a ;UART Control Register
UBRR .equ 0x09 ;UART Baud Rate Register
ACSR .equ 0x08 ;Analog Comparator Control and Status Register
割り込みベクタを設定します。
resetのみ、resetへジャンプし、その他の割り込み要因はすべて、retiとしています。
start :
rjmp reset ;reset
reti ;INT0
reti ;INT1
reti ;Timer/Counter1 CAPT1
reti ;Timer/Counter1 COMP1
reti ;Timer/Counter1 OVF1
reti ;Timer/Counter0 OVF0
reti ;UART RX
reti ;UART UDRE
reti ;UART TX
reti ;Analog Comparator ANA_COMP
スタックポインタを設定します。
reset:
ldi r16, RAMEND ;Stack pointer setting
out SPL, r16
PBポートのPB2のみ出力にし、他bitは入力とします。
ldi r16, 0b00000100 ;PB2 output setting
out DDRB, r16
PB2ポートをHigh レベルにします。
ldi r16, 0b00000100 ;PB2 high level outpit
out PORTB, r16
PB2ポートに接続したLED(PB2ーLED-1KΩーGND)が点灯します。
次回は、LEDの点滅を試してみたいと思います。
ソースは下記のとおりです。
;AT90S2313 LED ON
;
;; AT90S2313 cpu
;; rom 0000h -- 03ffh
;; ram 0000h -- 00dfh
;; eeprom 0000h -- 007fh
;; External clock 8MHz
;;
;;
;; assemblers ASxxxx and ASlink V5.40
;; file name 2313_led.asm
;; $ asavr -l -s -o 2313_led.asm
;; $ aslink -i 2313_led
;; $ (sudo) avrdude -v -p 2313 -c usbasp -P usb -F -e -U flash:w:2313_led.ihx
;I/O regster
SREG .equ 0x3f ;Status Register
SPL .equ 0x3d ;Stack Pointer Low
GIMSK .equ 0x3b ;General Interrupt MaSK register
GIFR .equ 0x3a ;General Interrupt Flag register
TIMSK .equ 0x39 ;Timer/Counter Interrupt MaSK register
TIFR .equ 0x38 ;Timer/Counter Interrupt Flag register
MCUCR .equ 0x35 ;MCU general Control Register
TCCR0 .equ 0x33 ;Timer/Counter 0 Control Register
TCNT0 .equ 0x32 ;Timer/CouNTer 0
TCCR1A .equ 0x2f ;Timer/Counter 1 Control Register A
TCCR1B .equ 0x2e ;Timer/Counter 1 Control Register B
TCNT1H .equ 0x2d ;Timer/CouNTer 1 High byte
TCNT1L .equ 0x2c ;Timer/CouNTer 1 Low byte
OCR1AH .equ 0x2b ;Output Compare Register 1 High byte
OCR1AL .equ 0x2a ;Output Compare Register 1 Low byte
ICR1H .equ 0x25 ;T/C Input Capture Register High byte
ICR1L .equ 0x24 ;T/C Input Capture Register Low byte
WDTCR .equ 0x21 ;WatchDog Timer Control Register
EEAR .equ 0x1e ;EEPROM Address Register
EEDR .equ 0x1d ;EEPROM Data Register
EECR .equ 0x1c ;EEPROM Control Register
PORTB .equ 0x18 ;Data Register, Port B
DDRB .equ 0x17 ;Data Direction Register, Port B
PINB .equ 0x16 ;Input Pins, Port B
PORTD .equ 0x12 ;Data Register, Port D
DDRD .equ 0x11 ;Data Direction Register, Port D
PIND .equ 0x10 ;Input Pins, Port D
UDR .equ 0x0c ;UART Data Register
USR .equ 0x0b ;UART Status Register
UCR .equ 0x0a ;UART Control Register
UBRR .equ 0x09 ;UART Baud Rate Register
ACSR .equ 0x08 ;Analog Comparator Control and Status Register
RAM .equ 0x60
RAMEND .equ 0xdf
.AT90S2313
start :
rjmp reset ;reset
reti ;INT0
reti ;INT1
reti ;Timer/Counter1 CAPT1
reti ;Timer/Counter1 COMP1
reti ;Timer/Counter1 OVF1
reti ;Timer/Counter0 OVF0
reti ;UART RX
reti ;UART UDRE
reti ;UART TX
reti ;Analog Comparator ANA_COMP
reset:
ldi r16, RAMEND ;Stack pointer setting
out SPL, r16
ldi r16, 0b00000100 ;PB2 output setting
out DDRB, r16
ldi r16, 0b00000100 ;PB2 high level outpit
out PORTB, r16
loop:
rjmp loop
.end