AT90S2313でLEDを点滅させたいと思います。

回路図は、前回の「AVRに萌えたい AT90S2313 Lチカその2 点滅」と同じ回路です。

今回は、点滅の周期はウェイトループで作成するのは同じですが、点滅のON/OFFを排他的論理和(exclusive or)を使用したことです。

正論理の排他的論理和の真理値表は下位のとおりになっています。

入力   出力
A B   X
0 0   0
0 1   1
1 0   1
1 1   0

ここで A入力が「0」の時のBの値に注目すると、Bの値はそのまま出力にXの反映されています。
今度は、A入力が「1」の時のBの値に注目すると、Bの値が反転した出力がXに反映されます
このことから、A入力が「0」の場合、Bの値がそのまま反映し、「1」の場合、Bの値が反転します

実際にレジスターに 設定してみます。
ここでは、 r16に0b10000000、r17に0b00000100を設定してみました。

AT90S2313での排他的論理和の命令表では、eorになります

eor   r16,r17

で、r16のの値を確認すると0b10000100になります。
さらに もう一度実行すると

eor   r16,r17

r16は 0b10000000になり無事反転することになります。

実際のブログラムでは下記のようになりました。

		ldi	r18,	0b00000100	;eor reg
loop:

		rcall	wait1s

		in	r16,	PINB
		eor	r16,	r18		;PB2 e-or
		out	PORTB,	r16
		rjmp	loop

では全体のブログラムは下記のとおりです。

;AT90S2313 LED Flashing (Exclusive OR and wait mode)
;
       	;; AT90S2313 cpu
        ;; rom 0000h -- 03ffh
	;; ram 0000h -- 00dfh
	;; eeprom 0000h -- 007fh
        ;; External clock 8MHz
        ;;
        ;;
        ;; assemblers  ASxxxx and ASlink V5.40
        ;; file name 2313_led_flashing_eor.asm
        ;; $ asavr -l -s -o 2313_led_flashing_eor.asm
        ;; $ aslink -i 2313_led_flashing_eor
        ;; $ (sudo) avrdude -v  -p 2313 -c usbasp -P usb -F -e -U flash:w:2313_led_flashing_eor.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
		ldi	r18,	0b00000100	;eor reg
loop:

		rcall	wait1s

		in	r16,	PINB
		eor	r16,	r18		;PB2 e-or
		out	PORTB,	r16
		rjmp	loop

wait1s:
		push	r17
		ldi	r17,0d10
wait1sloop:
		rcall	wait100ms
		dec	r17
		brne	wait1sloop
		pop	r17
		ret	

wait100ms:
		push	r17
		ldi	r17,0d100
wait100msloop:
		rcall	wait1ms
		dec	r17
		brne	wait100msloop
		pop	r17
		ret	


wait1ms:
		rcall	wait500us
		rcall	wait500us
		ret

wait500us:	push	r17
		ldi	r17,0d5
wait500loop:
		rcall	wait100us
		dec	r17
		brne	wait500loop
		pop	r17
		ret

wait100us:	push	r17
		ldi	r17,0d159
wait_loop:
		nop
		nop
		dec	r17
		brne	wait_loop
		pop	r17
		ret
		
		.end			

アセンブリします。

$ asavr -l -s -o 2313_led_flashing_eor.asm
$ aslink -i 2313_led_flashing_eor

ASlink >> -i
ASlink >> 2313_led_flashing_eor

AT90S2313に焼き付けます。

$ sudo avrdude -v  -p 2313 -c usbasp -P usb -F -e -U flash:w:2313_led_flashing_eor.ihx
[sudo] hogehoge のパスワード:

avrdude: Version 6.3-20171130
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "/etc/avrdude.conf"
         User configuration file is "/root/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : usb
         Using Programmer              : usbasp
         AVR Part                      : AT90S2313
         Chip Erase delay              : 20000 us
         PAGEL                         : P00
         BS2                           : P00
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom         4    12    64    0 no        128    0      0  4000  9000 0x80 0x7f
           flash          4    12   128    0 no       2048    0      0  4000  9000 0x7f 0x7f
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
           fuse           0     0     0    0 no          1    0      0     0     0 0x00 0x00
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00

         Programmer Type : usbasp
         Description     : USBasp, http://www.fischl.de/usbasp/

avrdude: auto set sck period (because given equals null)
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9101 (probably 2313)
avrdude: safemode: Fuse reading not support by programmer.
              Safemode disabled.
avrdude: erasing chip
avrdude: auto set sck period (because given equals null)
avrdude: reading input file "2313_led_flashing_eor.ihx"
avrdude: input file 2313_led_flashing_eor.ihx auto detected as Intel Hex
avrdude: writing flash (110 bytes):

Writing | ################################################## | 100% 1.85s

avrdude: 110 bytes of flash written
avrdude: verifying flash memory against 2313_led_flashing_eor.ihx:
avrdude: load data flash data from input file 2313_led_flashing_eor.ihx:
avrdude: input file 2313_led_flashing_eor.ihx auto detected as Intel Hex
avrdude: input file 2313_led_flashing_eor.ihx contains 110 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.63s

avrdude: verifying ...
avrdude: 110 bytes of flash verified

avrdude: safemode: Sorry, reading back fuses was unreliable. I have given up and exited programming mode

avrdude done.  Thank you.

書き込みが終了すると、PB2に接続したLEDが点滅すると思います。

次はタイマー割り込みを使用して、LEDの点滅を行ってみます。

おすすめの記事