avr microcontroller family assembly language programming

29
AVR Microcontroller Family Assembly Language Programming University of Akron Dr. Tim Margush

Upload: flashdomain

Post on 05-Dec-2014

2.771 views

Category:

Documents


20 download

DESCRIPTION

 

TRANSCRIPT

Page 1: AVR Microcontroller Family Assembly Language Programming

AVR Microcontroller Family

Assembly Language ProgrammingUniversity of Akron

Dr. Tim Margush

Page 2: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

2

AVR

• Atmel AVR 8-Bit Processors come in a variety of configurations and packages› They all share a common core – registers,

instructions, basic I/O capabilities

• Our focus is the ATMega16

Page 3: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

3

ATMega16 Specs

• 131 Instructions

• 32 8-bit GP registers

• Throughput up to 16 MIPS

• 16K programmable flash (instructions)

• 512Bytes EEPROM

• 1K internal SRAM

• Timers, serial and parallel I/O, ADC

Page 4: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

4

AVR CPU

• PC: address of next instruction

• IR: prefetched instruction

• ID: current instruction• GPR: R0-R31• ALU: Note internal

data path

Page 5: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

5

AVR Memory

• Flash: Machine instructions go here

• SRAM: For runtime data› Note bus independence for

data and instructions

• EEPROM: Secondary storage› EEPROM and Flash

memories have a limited lifetime of erase/write cycles

Page 6: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

6

Flash Memory

• Programs reside in word addressable flash storage› Word addresses range from 0000-1FFF (PC is 13 bits)› Byte addresses range 0000-3FFF (0x4000=16K)

• Harvard Architecture› It is possible to use this storage area for constant data as

well as instructions, violating the true spirit of this architecture

• Instructions are 16 or 32-bits› Most are 16-bits and are executed in a single clock

cycle

Page 7: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

7

SRAM

• The ATMega16 has 1K (1024 bytes) of byte addressable static RAM› This is used for variable storage and stack space

during execution› SRAM addresses start at $0060 and go through

$045F• The reason for not starting at zero will be covered

later

Page 8: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

8

EEPROM

• Electrically Erasable Programmable Read Only Memory› Programs can read or write individual bytes› This memory is preserved when power is

removed› Access is somewhat slow; it serves as a form of

secondary storage

Page 9: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

9

Clock

• All processors are pushed through their fetch execute cycle by an alternating 0-1 signal, called a clock

• The ATMega16 can use an internal or external clock signal› Clock signals are usually generated by an RC oscillator

or a crystal• The internal clock is an RC oscillator programmable to 1, 2, 4,

or 8 MHz• An external clock signal (crystal controlled) can be more

precise for time critical applications

Page 10: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

10

AVR Machine Language

• AVR instructions are 16 or 32-bits• Each instruction contains an opcode

› Opcodes generally are located in the initial bits of an instruction

• Some instructions have operands encoded in the remaining bits› Opcode and operands are numbers, but their containers

are simply some of the bits in the instruction

Page 11: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

11

Load Immediate

• LDI Rd, K› Load a constant into a register (Rd = K)› 1110 bbbb rrrr bbbb

• Limitations: 16 <= d <= 31; 0x00 <= K <= 0xFF

› Opcode is 1110› The register number is coded in bits 7-4

• Only the last 4 bits of the register number are present; a leading 1 is assumed (1rrrr)

› The constant is split into two nybbles

Page 12: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

12

LDI Examples

• LDI R16, $2C› 1110 0010 0000 1100 or 0xE20C

• LDI R27, $0F› 27 is 11011› 1110 0000 1011 1111 or 0xE0BF

• Note that this instruction always › starts with E, › has the two nybbles of K at positions 2 and 0, › and encodes the register in nybble 1

Page 13: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

13

Add Registers

• ADD Rd, Rr› Add the contents of two registers, store result in

Rd (Rd = Rd + Rr)› 0000 11rd dddd rrrr

• Any registers: 0 <= r <= 31; 0 <= d <= 31

› The opcode is 000011› The register numbers are coded in binary

• Rr has its high bit split off from the others

Page 14: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

14

ADD Examples

• ADD R16, R3› ddddd is 10000 and rrrrr is 00011› 0000 1101 0000 0011 or 0x0D03

• ADD R27, R17› ddddd is 11011, rrrrr is 10001› 0000 1111 1011 0001 or 0x0FB1

• Note that this instruction always › starts with 0, › followed by C, D, E, or F› and can have any values in the second byte

Page 15: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

15

Expanding Opcodes

• The following are not legal opcodes› 1, 11, 111

• No opcode longer than 4 bits starts 1110› Except ser Rd

› 1110 1111 dddd 1111

• Similarly, no prefix of 000011 is an opcode and no opcode longer than 6 begins with this sequence› Except lsl Rd

› 0000 11dd dddd dddd

LDI: 1110011110110011ADD: 0000111100101101

How does the processor "know" where the opcode portion stops?

Page 16: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

16

A Machine Language Program

• Load program into memory› At address 0 we place the word $E20C› At address 1 we place the word $E01F› At address 2 we place the word $0F01

• Execute the three instructions in sequence› Set PC to 0 and perform 3 fetch-execute cycles

• Observe result› R16 has the sum of $2C and $0F, $3B

Page 17: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

17

A Machine Language Program

0000: $E20C LDI R16, $2C

0001: $E01F LDI R17, $0F

0002: $0F01 ADD R16, R17

R16 = R16 + R17

= $2C + $0F

= $3B

Page 18: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

18

AVR Studio

• An integrated development environment › Provides a text editor› Supports the AVR assembler› Supports the gnu C compiler› Provides an AVR simulator and debugger› Provides programming support for the AVR

processors via serial interface

Page 19: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

19

AVR Studio: New Project

• Start AVR Studio

• Click New Project

• Select type: Assembler

• Choose a project name

• Select create options and pick a location

• Location should be a folder to hold all project folders

• Each project should be in its own folder

Page 20: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

20

AVR Studio: New Project

• On the next dialog, select the Debug platform: AVR Simulator

• Pick the device type: ATMega16

• Finish

Page 21: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

21

AVR Studio: Interface

• Enter the program in the assembly source file that is opened for you.

• Click the Assemble button (F7)

Assemble

Workspace

Output

Editor

Page 22: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

22

AVR Studio: Assembler Report

• Assembler summary indicates success› 6 bytes of code, no data, no errors

Page 23: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

23

AVR Studio: Debugger

• Start the debugging session› Click Start Debugging› Next instruction is shown with yellow arrow

• Choose I/O View› View registers 16-17

• Step through program› F10 is Step Over

Start Debugging

Page 24: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

24

AVR Studio: Debugger

• The first 2 instructions are completed› R16 and R17 have the expected values from the

LDI instructions

• The sum is placed in R16› $3B is the sum

Page 25: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

25

AVR Studio: Memory

• Memory contents may be viewed (and edited) during debugging› You can view program (flash), data (SRAM),

or EEPROM memory› You can also view the general purpose and I/O

registers using this tool The Program

Page 26: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

26

Using Mnemonics

• Rather than code the machine language program as a sequence of numeric word values expressed in hexadecimal, assembly language programmers usually use instruction mnemonics

• This program will assemble and run identically to the first› ldi R16, $2C› ldi R17, $0F› add R16, R17

Page 27: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

27

What's Next?

• In our sample program, we executed three instructions, what comes next?› Undefined! Depends

on what is in flash

• How do we terminate a program?› Use a loop!

0000: $E20C LDI R16, $2C

0001: $E01F LDI R17, $0F

0002: $0F01 ADD R16, R17

0003: $???? ???

If a program is to simply stop, add an instruction that jumps to its own address

Page 28: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

28

Relative Jump

• RJMP K 1100 kkkk kkkk kkkk› -2048 <= K < 2048

• According to the manufacturer specifications, this instruction causes this action: › PC = PC + 1 + K

• We want K = -1› This will cause a jump to the address from which the

instruction was fetched

Page 29: AVR Microcontroller Family Assembly Language Programming

04/09/23 Dr. Tim Margush - Assembly Language Programming

29

Relative Jump

• Here: RJMP Here 1100 kkkk kkkk kkkk› K = -1 ($FFF)› 1100 1111 1111 1111 or $CFFF

0000: $E20C LDI R16, $2C

0001: $E01F LDI R17, $0F

0002: $0F01 ADD R16, R17

0003: $CFFF RJMP -1

0004: $???? ???This distance is -1 word

Remember that the program counter is incremented before the instruction is executed