AVR_ASM/src/main.asm

101 lines
3 KiB
NASM

; Author: Jake Goodwin
; Date: 2023
; Description: An assembly file for an avr328 chip.
;Needed for uc info and defines
;This is in the /opt/microchip/mplabx/v6.05/packs/Microchip/ATmega_DFP/3.0.158/avrasm/inc/m328Pdef.inc
;.device m328p
.include "m328Pdef.inc"
;The device is setup with 1Mhz internal clock.
.def mask = r16 ; mask register
.def ledR = r17 ; led register
.def loopCt = r18 ; loop count register
.def iloopRl = r24 ; inner loop register high.
.def iloopRh = r25 ; inner loop register low.
;.equ iVal = 39998 ; inner loop value
.equ iVal = 10000 ; inner loop value
.cseg
;.org 0x0000
.org 0x00
ldi r16, LOW(RAMEND) ;init
out SPL, r16 ;stack pointer
ldi r16, HIGH(RAMEND) ;to ramend
out SPH, r16 ; "
;setup the led
clr ledR ;clear led register
;ldi mask,(1<<PIND0) ;load 00000001 into register.
ldi mask, 255
out DDRD, mask ;set pinD0 to output.
ldi r30, 0x1
sts 0x200, r30
;ldi ledR, 1
;jmp start
;jmp ledchaser
jmp check_address
;checks to see if an address in RAM location 0x200 contains value 0.
check_address:
.equ myloc =0x200
lds r30, myloc ;loads data from ram into register 30
tst r30 ;sets flags basedo n r30
brne ledchaser ;branch if r30 isn't zero.
sbi DDRD, 1 ;set led pin for output.
sbi PORTD, 1 ;turn on the led pin.
done: jmp done
ledchaser:
out PORTD, ledR ;write led register to portd
lsl ledR
ldi loopCt,25
rcall delay10ms
tst ledR
brne ledchaser
ldi ledR, 1
rjmp ledchaser
start: eor ledR,mask ; toggle PIND0 in led register
;indicate it's in start.
sbi DDRD, 1
sbi PORTD, 1
out PORTD,ledR ; write led register to PORTD
;ldi loopCt,50 ; initialize delay multiple for 0.5 sec
ldi loopCt,25 ; initialize delay multiple for 0.5 sec
rcall delay10ms ; call delay subroutine
rjmp start ; jump back to start
delay10ms:
ldi iloopRl, LOW(iVal) ;initialize inner loop registers
ldi iloopRh, HIGH(iVal) ;high and low.
;sbiw, subtract imediate from word.
iLoop: sbiw iLoopRl, 1 ; decrement inner loop register.
brne iLoop ;branch to iLoop if iLoop register zero.
dec loopCt ;decrement outer loop reg
brne delay10ms ;branch to oloop is zero.
nop ;no operation, do nothing.
ret ;return from subroutine.