AVR Assembler ProgrammingTutorial 4
AVR Assembler ProgrammingTutorial 4
(1)
/* Write a program to find the sum of 8 bit variables A and B.
* For this programming problem the sum may be greater than 255 if A and B
* are unsigned or less than -128 and greater than 127 if signed.
* Store the sum into 16 bit variable C using little endian byte ordering.
* C = A + B
*/
.INCLUDE <m328pdef.inc>
.DSEG
A: .BYTE 1
B: .BYTE 1
C: .BYTE 2
.CSEG
Adder816:
; load
clr r1 ; r1:r0 = 0:A
lds r0,A
clr r3 ; r3:r2 = 0:B
lds r2,B
; add
add r0,r2 ; add least significant bytes
adc r1,r3 ; add with carry most significant bytes
; store
sts C,r0 ; store least significant byte first
sts C+1,r1
rjmp Adder816
(2) Adding 16-bit Numbers adding two 16-bit numbers and store in given RAM
Address 0x85 (in form of little endian). The code for this is shown below.
.include "m32def.inc"
.DSEG
A: .BYTE 1
B: .BYTE 1
C: .BYTE 1
.CSEG
Max2:
lds r16,A ; load
lds r17,B
cp r16,r17
brlt elseMax2 ; if (A >= B)
sts C,r16 ; then C = A
rjmp endMax2
elseMax2:
sts C, r17
endMax2:
(4)Finding a given number in an Array store in Flash Rom and output to PORTC and
PORTB
.include "m32def.inc"
.ORG $0
.MACRO IO_CONFIG
LDI R20,@1
OUT @0,R20
.ENDMACRO
IO_CONFIG DDRB,0XFF
IO_CONFIG DDRC,0XFF
LDI ZH,HIGH(TABLE<<1)
LDI ZL,LOW(TABLE<<1)
LDI R16,0
LDI R18,9
LDI R17,0
LOOP:
LPM R17,Z+
CPI R17,'.'
BREQ HERE
CP R16,R18
BREQ RUN
INC R16
RJMP LOOP
RUN:
OUT PORTC,R17
OUT PORTB,R17
HERE: RJMP HERE
.ORG $500
TABLE: .DB 0,1,2,3,4,5,6,7,8,9,'.'
(5) CONVERTING 4 PACKED BCD NUMERS IN FLASH ROM TO ASCII CODE AND STORE TO RAM
ADDRESS $80
.INCLUDE "M32DEF.INC"
.EQU RAM_ADDR = 0x80
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16 ;SP = RAMEND
RCALL BCD_ASCII_COV
HERE: RJMP HERE
LDI XL,LOW(RAM_ADDR)
LDI XH,HIGH(RAM_ADDR) ;X = RAM_ADDR
(6) CHECKSUM
.INCLUDE "M32DEF.INC"
; Init
INIT_OPTIONS:
LDI ZL,LOW(FLASH_OPTIONS<<1)
LDI ZH,HIGH(FLASH_OPTIONS<<1) ;Z points to FLASH OPTIONS
LDI YL,LOW(RAM_OPTIONS)
LDI YH,HIGH(RAM_OPTIONS) ;Y points to RAM_OPTIONS
LDI R16,OPTION_SIZE ;COUNTER = OPTION SIZE
H1: LPM R18,Z+ ;load R18 with program mem. location Z
ST Y+,R18 ;store R18 in loc Y of RAM
DEC R16 ;decrement COUNTER
BRNE H1 ;if COUNTER is not zero go to H1
RET
;-------EEPROM
.ESEG
.ORG $0
E_OPTIONS: .DB 0x25,0x62,0x3F,0x52
;--------------main program
.ORG 0
LDI R18,HIGH(RAMEND)
OUT SPH,R18
LDI R18,LOW(RAMEND)
OUT SPL,R18
LDI R16,0x00
OUT DDRA,R16 ; PORTA is Input Port
RCALL BIN_DEC_CONVRT
RCALL DEC_ASCI_CONVRT
END: RJMP END
DEC QUOTIENT
ADD NUM, DENOMINATOR
RET
;--------------main program
.ORG 0
LDI R18,HIGH(RAMEND)
OUT SPH,R18
LDI R18,LOW(RAMEND) ; SP = RAMEND
OUT SPL,R18
LDI R16,0x00
OUT DDRA,R16 ; PORTA is Input Port
RCALL BIN_ASCI_CONVRT
END: RJMP END
DEC QUOTIENT
ADD NUM, DENOMINATOR
RET
.MACRO LOADIO
LDI R20,@1
OUT @0,R20
.ENDMACRO
;--------------------------program starts
.ORG 0
.LISTMAC
LOADIO DDRB,0xFF ;make PORTB output
L1: LOADIO PORTB,0x55 ; PORTB = 0x55
DELAY R18,0x70 ;delay
LOADIO PORTB,0xAA ; PORTB = 0xAA
DELAY R18,0x70 ;delay
RJMP L1
(10)EEPROM PROGRAM TO WRITE AND READ
LDI R16,0XFF
OUT DDRB,R16
LDI R20,0x55
WAIT_WRITE:
SBIC EECR,EEWE
RJMP WAIT_WRITE
LDI R18,0
LDI R17,0x5F
OUT EEARH,R18
OUT EEARL,R17
OUT EEDR,R20
SBI EECR,EEMWE
SBI EECR,EEWE
WAIT_READ:
SBIC EECR,EEWE
RJMP WAIT_READ
LDI R18,0
LDI R17,0x5F
OUT EEARH,R18
OUT EEARL,R17
SBI EECR,EERE
IN R16,EEDR
OUT PORTB,R16
HERE: JMP HERE