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の点滅を行ってみます。