101 lines
3 KiB
NASM
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.
|
|
|