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			

おすすめの記事