added hello world
This commit is contained in:
commit
135f785aab
1
README.md
Normal file
1
README.md
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# Here are some of my attempts to learn how AVR architecture works
|
12
hello_world/Makefile
Normal file
12
hello_world/Makefile
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
all:
|
||||||
|
avr-as -g -mmcu=atmega328p -o hello_world.o hello_world.s
|
||||||
|
avr-ld -o hello_world.elf hello_world.o
|
||||||
|
avr-objcopy -O ihex -R .eeprom hello_world.elf hello_world.hex
|
||||||
|
|
||||||
|
upload:
|
||||||
|
avrdude -C /etc/avrdude.conf -p atmega328p -c arduino -P /dev/ttyACM0 -b 115200 -D -U flash:w:hello_world.hex:i
|
||||||
|
|
||||||
|
run: all upload
|
||||||
|
|
||||||
|
clean:
|
||||||
|
ls | grep hello_world | grep -v *.s | xargs rm -f --
|
3
hello_world/README.md
Normal file
3
hello_world/README.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
This program blinks the LED on pin 5 at an interval of approximately .7 seconds.
|
||||||
|
It comes with a Makefile to build and upload the code into the Arduino board
|
||||||
|
using binutils-avr for building and avrdude for uploading.
|
90
hello_world/hello_world.s
Normal file
90
hello_world/hello_world.s
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
; RAMEND is pretty self explanatory.
|
||||||
|
|
||||||
|
.equ RAMEND, 0x08FF
|
||||||
|
|
||||||
|
; Check [1] and [2] for more info about the following three
|
||||||
|
; symbols
|
||||||
|
|
||||||
|
.equ SREG, 0x3F
|
||||||
|
.equ SPL, 0x3D
|
||||||
|
.equ SPH, 0x3E
|
||||||
|
|
||||||
|
; Check [3] for more info about the following three symbols.
|
||||||
|
|
||||||
|
.equ PORTB, 0x05
|
||||||
|
.equ DDRB, 0x04
|
||||||
|
.equ PINB, 0X03
|
||||||
|
|
||||||
|
.org 0x0000
|
||||||
|
rjmp MAIN
|
||||||
|
|
||||||
|
MAIN:
|
||||||
|
|
||||||
|
; Reset system status. Check this link for more details:
|
||||||
|
; http://www.rjhcoding.com/avr-asm-sreg.php [1]
|
||||||
|
|
||||||
|
clr r16
|
||||||
|
out SREG, r16
|
||||||
|
|
||||||
|
; Initialize stack pointer. Put the low byte of RAMEND in SPL (Stack Pointer Low)
|
||||||
|
; and the high byte in SPH (Stack Pointer High). Check this link for more details:
|
||||||
|
; http://www.rjhcoding.com/avr-asm-functions.php [2]
|
||||||
|
|
||||||
|
ldi r16, lo8(RAMEND)
|
||||||
|
out SPL, r16
|
||||||
|
|
||||||
|
ldi r16, hi8(RAMEND)
|
||||||
|
out SPH, r16
|
||||||
|
|
||||||
|
; Set port bits to output mode. We will use LED 5, so we need to set the fifth bit
|
||||||
|
; in DDRB (Data Direction Register B). Check this link for more details:
|
||||||
|
; https://web.ics.purdue.edu/~jricha14/Port_Stuff/PortB_general.htm [3]
|
||||||
|
|
||||||
|
ldi r16, 0x20
|
||||||
|
out DDRB, r16
|
||||||
|
|
||||||
|
; In the main loop we will toggle the fifht bit in PORTB to turn the LED on and off
|
||||||
|
; using exclusive or. After that we will wait for some time because we won't be able
|
||||||
|
; to see the LED blink otherwise.
|
||||||
|
|
||||||
|
ldi r17, 0x20
|
||||||
|
clr r16
|
||||||
|
|
||||||
|
MAINLOOP:
|
||||||
|
|
||||||
|
eor r16, r17
|
||||||
|
out PORTB, r16
|
||||||
|
call WAIT
|
||||||
|
rjmp MAINLOOP
|
||||||
|
|
||||||
|
WAIT:
|
||||||
|
|
||||||
|
push r16
|
||||||
|
push r17
|
||||||
|
push r18
|
||||||
|
|
||||||
|
; Loop 0x400000 times which takes approximately 12 milion cycles which is
|
||||||
|
; approximately 0.7s. For cycles/instruction info check this link, this is
|
||||||
|
; actually the AVR Instruction Set Manual:
|
||||||
|
; http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf [4]
|
||||||
|
|
||||||
|
ldi r16, 0x20
|
||||||
|
ldi r17, 0x00
|
||||||
|
ldi r18, 0x00
|
||||||
|
|
||||||
|
_WAIT:
|
||||||
|
|
||||||
|
dec r18
|
||||||
|
brne _WAIT
|
||||||
|
|
||||||
|
dec r17
|
||||||
|
brne _WAIT
|
||||||
|
|
||||||
|
dec r16
|
||||||
|
brne _WAIT
|
||||||
|
|
||||||
|
pop r18
|
||||||
|
pop r17
|
||||||
|
pop r16
|
||||||
|
|
||||||
|
ret
|
Loading…
Reference in New Issue
Block a user