Professional Documents
Culture Documents
Microprocessor (μP)
• μC intended as a single chip solution, μP requires external
support chips (memory, interface)
• μC has on-chip non-volatile memory for program storage,
μP does not.
• μC has more interface functions onon-chip
chip (serial interfaces,
interfaces
analog-to-digital conversion, timers, etc.) than μP
• μC does not have virtual memory support (i.e., could not
Linux) while μP does
run Linux), does.
• General purpose μPs are typically higher performance
(clock speed, data width, instruction set, cache) than μCs
• Division between μPs and μCs becoming increasingly
blurred
V 0.2 1
Read the user manual for details
16 bit Architecture
16-bit General purpose registers
registers, 71 instructions
not including addressing mode variants
On-chip modules Async serial IO, I2C, SPI, A/D, three 16-
bit timers
timers, one 8-bit
8 bit timer
timer, comparator
V 0.2 2
Read the user manual for details
V 0.2 4
Read the user manual for details
Program Memory
V 0.2 6
Copyright Delmar Cengage Learning 2008. All Rights Reserved.
From: Reese/Bruce/Jones, “Microcontrollers: From Assembly to C with the PIC24 Family”.
Special Function Registers (SFRs)
Don’t consider the SFR as a whole
Each bit of SFR has a special name to represent one status (carry, interrupt, etc.) of the controller
Special Function Registers (SFR) are addressed like normal data memory
locations but have specified functionality tied to hardware subsystems in the
processor. We typically refer to SFRs by name (W0, T3CON, STATUS, etc)
instead of by address.
Read the user manual for details
There are many SFRs in the PIC24 μC – they are used as control registers and
data registers for processor subsystems (like the serial interface, or the analog-
to-digital converter). We will cover their use and names as we need to.
SFRs live in the address range 0x0000 to 0x07FE in data memory. See the
datasheet for a complete list of SFRs.
Other locations in data memory y that are not SFRs can be used for storage
g of
temporary data; they are not used by the processor subsystems. These are
sometimes referred to as GPRs (general purpose registers). MPLAB refers to
these locations as file registers.
V 0.2 7
88-bit
bit, 16
16-bit
bit, 32
32-bit
bit Data
We will deal with data that is 8 bits, 16 bits (2 bytes), and
32 bits (4 bytes) in size.
size Initially we will use only 8 bit and
16 bit examples.
Size Unsigned
g Rangeg
8-bits 0 to 28-1 (0 to 255, 0 to 0xFF)
2 digits
16-bit 16
0 to 2 -1 (0 to 65536, 0 to 0xFFFF)
4 digits
32-bit 32
0 to 2 -1 (0 to 44,294,967,295),
294 967 295) 0 to 0xFFFFFFFF)
8 digits
The addressing mode used for both the source and destination
operands
d is
i called
ll d register direct.
d Th mov instruction
The i i supports
other addressing modes which are V 0.2not shown. 12
MOV Wso,, Wdo Instruction Execution
V 0.2 15
MOV Wns, f Instruction Execution
Must be even
operand code
1 0 0 2
V 0.2 18
MOV f, Wnd Instruction Execution
V 0.2 19
Copyright Delmar Cengage Learning 2008. All Rights Reserved.
From: Reese/Bruce/Jones, “Microcontrollers: From Assembly to C with the PIC24 Family”.
A Note on Instruction Formats
• The instruction formats (machine code) of some
instructions will be ppresented for informational
purposes
– However, studying the machine code formats of the
instr ctions is not a priority;
instructions priorit ; understanding
nderstanding instruction
instr ction
functionality will be emphasized.
– All instruction formats can be found in the
dsPIC30F/dsPIC33F Programmers Reference manual
from Microchip
– The PIC24 familyy is a subset of the
dsPIC30F/dsPIC33FF instruction set – the PIC24
family does not implement the DSP instructions.
V 0.2 20
MOV{.B} WREG, f Instruction
W0
“Copy content of WREG (default working register) to data memory
location f”. General form:
MOV{.B} WREG, f (WREG) → f
This instruction provides upward compatibility with earlier PIC μC.
WREG is register W0, and f is a location within the first 8192 bytes of data
memory (near data memory)
MOV WREG, 0x1000 (W0) → 0x1000
Contents of register W0 copied to data memory location 0x1000.
0x1000
Can be used for either WORD or BYTE operations:
MOV WREG,, 0x1000 word operation
p
MOV.B WREG, 0x1001 lower 8-bits of W0 copied to 0x1001
Word copy must be to even (word-aligned) location.
Note: The previously covered MOV Wns, f instruction cannot be used for
byte operations! V 0.2 21
MOV.B WREG, f Instruction Execution
0x1000
0x1001
A byte
y copy
py operation
p is shown.
Copyright Delmar Cengage Learning 2008. All Rights Reserved.
V 0.2 22
From: Reese/Bruce/Jones, “Microcontrollers: From Assembly to C with the PIC24 Family”.
MOV{.B} WREG, f Instruction Format
V 0.2 23
Copyright Delmar Cengage Learning 2008. All Rights Reserved.
From: Reese/Bruce/Jones, “Microcontrollers: From Assembly to C with the PIC24 Family”.
MOV{.B} f {,WREG} Instruction
“Copy contents of data memory location f to WREG (default working
register) . General form:
MOV{.B} f, WREG (f ))→ WREG
MOV{.B} f (f )→ f
This instruction provides upward compatibility with earlier PIC μC.
WREG is register W0, and f is a location within the first 8192 bytes of data
memory (near data memory)
Can be used for either WORD or BYTE operations:
MOV 0x1000, WREG word operation
MOV.B 0x1001,, WREG only y lower 8-bits of W0 are affected.
Copies contents of 0x1000 back to
MOV 0x1000
itself, will see usefulness of this later
It can be used to set the Negative flag and Zero flag in the statues register (Chapter 4)
Word copy must be from even (word-aligned) data memory location.
Note: The MOV f,Wnd instruction cannot be used for byte operations!
V 0.2 24
MOV{ B} f {,WREG}
MOV{.B} { WREG} Format
Refer to previous example
V 0.2 25
Copyright Delmar Cengage Learning 2008. All Rights Reserved.
From: Reese/Bruce/Jones, “Microcontrollers: From Assembly to C with the PIC24 Family”.
MOV.{B} f, WREG Instruction Execution
0x1001 0x1000
V 0.2 26
Copyright Delmar Cengage Learning 2008. All Rights Reserved.
From: Reese/Bruce/Jones, “Microcontrollers: From Assembly to C with the PIC24 Family”.
Move a literal into a Working Register
Moves a literal
M l l into
i a working
ki register.
i The
Th ‘#’ indicates
i di the
h
numeric value is a literal, and NOT a memory address.
General form:
MOV #lit16, Wnd lit16 → Wnd (word operation)
MOV.B #lit8, Wnd lit8 → Wnd.lsb (byte operation)
The source operand in these examples use the immediate
addressing
dd i mode.
d
Examples:
MOV #0x1000, W2 0x1000 → W2
MOV.B #0xAB, W3 0xAB → W3.lsb
V 0.2 27
More on Literals
V 0.2 29
Copyright Delmar Cengage Learning 2008. All Rights Reserved.
From: Reese/Bruce/Jones, “Microcontrollers: From Assembly to C with the PIC24 Family”.
MOV Literal Instruction Formats Refer to previous example
Fixed
Fixed
Indirect Addressing
MOV E Example
ample
V 0.2 33
Indirect Addressingg Coverage
g
• There are six forms of indirect addressing
• The need for indirect addressing makes the most
sense when covered in the context of C pointers
– This is done in Chapter 5
• At this time, you will only need to understand the
simplest form of indirect addressing, which is
register indirect as shown on the previous two slides
slides.
mov [W0], [W1] and mov [W0], W1
V 0.2 35
ADD{.B} Wb, Ws, Wd Execution
( )E
(a) Execute:
t add
dd W0
W0,W1,W2
W1 W2
W0 0x1AF3 0x1AF3 W0 0x1AF3
W1 0x8B1A + 0x8B1A W1 0x8B1A
W2 0x64DE W2 0xA60D Modified
W3 0xFB90 0xA60D W3 0xFB90
Before After
SUB B
SUB.B W0
W0, W1,
W1 W2 Lower 8 bits of W0
W0, W1 are subtracted
and placed in the lower 8-bits of W2
V 0.9 37
SUB{.B} Wb, Ws, Wd Execution
V 0.2 40
Assembly Language Efficiency
The effects of the following instruction:
V 0.2 41
ADD{.B} f {,WREG} Execution
V 0.2 42
Copyright Delmar Cengage Learning 2008. All Rights Reserved.
From: Reese/Bruce/Jones, “Microcontrollers: From Assembly to C with the PIC24 Family”.
SUB{.B} f {,WREG} Instruction
Two operand subtraction form:
SUB{.B} f (f) – (WREG) → f
SUB{.B} f, WREG (f) – (WREG) → WREG
WREG is W0,
W0 f is limited to first 8192 bytes of memory.
memory
One of the operands, either f or WREG is always destroyed!
V 0.2
0.9 43
Increment
Increment operation,
operation register
register-to-register
to register form:
INC{.B} Ws, Wd (Ws) +1 → Wd
I
Increment
t operation,
ti memory to
t memory/WREG
/WREG form:
f
INC{.B} f (f) + 1 → f
INC{.B} f, WREG (f) + 1 → WREG
(f must be in first 8192 locations of data memory)
Examples:
INC W2,, W4 ((W2)) + 1 → W4
INC.B W3, W3 (W3.lsb) + 1 → W3.lsb
INC 0x1000 (0x1000) +1 → 0x1000
INC.B 0x1001,WREG V 0.2(0x1001)+1 → WREG.lsb 44
Decrement
Decrement operation
operation, register
register-to-register
to register form:
DEC{.B} Ws, Wd (Ws) – 1 → Wd
I
Increment
t operation,
ti memory to
t memory/WREG
/WREG form:
f
DEC{.B} f (f) – 1 → f
DEC{.B} f, WREG (f) – 1 → WREG
(f must be in first 8192 locations of data memory)
Examples:
DEC W2,, W4 ((W2)) – 1 → W4
DEC.B W3, W3 (W3.lsb) – 1 → W3.lsb
DEC 0x1000 (0x1000) – 1 → 0x1000
DEC.B 0x1001,WREGV 0.9(0x1001) – 1 → WREG.lsb 45
Read user manual
A GOTO iinstruction
t ti iis an unconditional
diti l jump.
j
Copyright Delmar Cengage Learning 2008. All Rights Reserved. V 0.2 48
From: Reese/Bruce/Jones, “Microcontrollers: From Assembly to C with the PIC24 Family”.
Valid addressing modes.
What are valid addressing modes for instructions?
The definitive answer can be found in Table 19-2 of the
PIC24H32GP202 datasheet.
datasheet
Table
bl 19-1: Symbols
b l usedd in
i opcode
d descriptions
d i i (partial
( i l list)
li )
V 0.2 50
ADD forms
ADD Wb, Ws, Wd
Legal:
ADD W0, W1, W2
ADD W0, [W1], [W4]
Ill l
Illegal:
ADD [W0],W1,W2 ;first operand illegal!
V 0.2 51
Video tutorials
A number of videos illustrate important concepts; all are listed on
the video page at http://www.reesemicro.com/site/pic24micro/Home/pic24-video-tutorials-1.
Available tutorials, which cover topics on the following pages of
these lecture notes:
• MPLAB IDE introduction at
http://www.ece.msstate.edu/courses/ece3724/main_pic24/videos/mplab_assem/index.htm
V 0.2 52
A Simple Program
In this class, will present programs in C form, then translate
(compile) them to PIC24 μC assembly language.
C Program equivalent A uint8 variable is
#define avalue 100 8 bits (1 byte)
uint8
u t8 i,j,k;
,j, ;
i = avalue; // i = 100
i = i + 1; // i++, i = 101
j = i; // j is 101
j = j - 1; // j--, j is 100
k = j + i; // k = 201
V 0.2 53
Where are variables stored?
When writing assembly language, can use any free data memory
location to store values, it your choice.
A logical place to begin storing data in the first free location in
d memory, which
data hi h is
i 0x0800 (Recall ( ll that
h 0x0000-0x07FF is i
reserved for SFRs). The first free location changes in different controllers, read user
manual before programing
Assign
A i i tot 0x0800,
0 0800 j to
t 0x0801,
0 0801 andd k to
t 0x0802.
0 0802 Other
Oth choices
h i
could be made.
V 0.2 54
C to PIC24 Assembly
i plus 1
j mins 1
V 0.2 56
.include "p24Hxxxx.inc"
.global __reset
.bss
i:
;reserve space for variables
.space 1
mptst_byte.s
p _ y
j: .space 1
k: .space 1
.text ;Start of Code section
__reset: ; first instruction located at __reset label
mov #__SP_init,
# S i it W15 15 ;;initialize
i iti li stack
t k pointer
i t
mov #__SPLIM_init,W0
mov W0,SPLIM ;;initialize Stack limit reg.
avalue = 100
; i = 100; This file can be assembled
mov.b #avalue, W0 ; W0 = 100 by the MPLAB™
mov.b WREG,i ; i = 100
assembler into PIC24
; i = i + 1;
inc.b i ; i = i + 1 machine code and
; j = i simulated.
mov.b
mov.b
i,WREG
WREG,j
; W0 = i
; j = W0
Labels used for memory
; j = j – 1; locations 0x0800 (i),
dec b
dec.b j ; j= j – 1 0 0801(j) 0x0802(k)
0x0801(j), 0 0802(k) tto
; k = j + i
mov.b i,WREG ; W0 = i increase code clarity
add.b j,WREG ; W0 = W0+j (WREG is W0)
mov.b WREG,k ; k = W0
done:
goto done ;loop forever
V 0.2 57
Include file that defines various labels
mptst
p _byte.s
y ((cont.)) for a particular processor.
processor ‘.include
include’ is
an assembler directive.
.include "p24Hxxxx.inc"
Label: underline + label name
Label works as marker in the code
.global
g __reset Declare the __reset label as
.global: make the following label visible outside current file global – it is is needed by linker
Later on, we start our first instruction from _reset instruction
for defining program start
.bss ;reserve space for variables
i
i: .space
space 1
j: .space 1 The .bss assembler directive
k: .space 1 indicates the following should be
placed in data memory. By the code start from “.”
doesn’t have
An assembler directive is not a default, variables are placed corresponding
PIC24 instruction, but an beginning at the first free instructions (binary code)
in PIC24. They are the
location, 0x800. The .space directive of assembler.
instruction to the assembler assembler
bl didirective
ti reserves
program. Assembler directives space in bytes for the named
have a leading ‘.’ period, and are variables. i, j, k are labels, and
not case sensitive
sensitive. labels are case-sensitive and
must be followed by a ‘:’ (colon).
V 0.2 58
mptst_byte.s (cont.)
.text
__reset: mov #__SP_init, W15 ‘.text’ is an assembler directive that says
mov #__SPLIM_init,W0 what follows is code. Our first
mov W0,SPLIM
W0 SPLIM instruction must be labeled as ‘__reset’.
These move instruction initializes the
stack pointer and stack limit registers –
this will be discussed in a later chapter.
avalue = 100
V 0.2 59
mptst byte s (cont.)
mptst_byte.s (cont ) The use off labels
Th l b l andd
; i = 100;
comments greatly improves
mov.b #avalue, W0 ; W0 = 100 the clarityy of the pprogram.
g
mov.b WREG,i ; i = 100
It is hard to over-comment
an assembly language
; i = i + 1;
inc.b i ; i = i + 1 program if you want to be
; j = i able to understand it later.
mov.b
mov b i,WREG
i WREG ; W0 = i
mov.b WREG,j ; j = W0
Strive
S i for
f at least
l a
; j = j – 1; comment every other line;
dec.b j ; j= j – 1 refer to lines
; k = j + i
mov.b i,WREG ; W0 = i
add.b j,WREG ; W0 = W0+j (WREG is W0)
mov.b WREG,k ; k = W0
V 0.2 60
mptst
p _byte.s
y ((cont.)) A label that is the target
of a goto instruction.
Lables are case sensitive
done: (instruction mnemonics
goto done ;loop forever
and assembler directives
are not case sensitive.
.end A comment
V 0.2 61
General MPLAB IDE Comments
Will be introduced in the lab
C Program equivalent
A uint162 variable is
#define avalue 2047
16 bits (1 byte)
uint16 i,j,k;
i = avalue; // i = 2047
i = i + 1; // i++, i = 2048
j = i; // j is 2048
j = j - 1; // j--, j is 2047
k = j + i; // k = 4095
V 0.2 66
.include "p24Hxxxx.inc"
.global __reset Reserve 2 bytes for each
i:
.bss ;reserve space for variables
.space 2
variable. Variables are now
j
j: .space 2 stored at 0x0800,
0x0800 0x0802,
0x0802
k: .space 2 0x0804
.text ;Start of Code section
__reset: ; first instruction located at __reset label
mov #__SP_init,
# SP i it w1515 ;initialize
i iti li stack
t k pointer
i t
mov #__SPLIM_init,W0
mov W0,SPLIM ;initialize stack limit reg
avalue = 2048
Instructions now
; i = 2048;
mov #avalue, W0 ; W0 = 2048
mov WREG,i ; i = 2048
perform WORD (16-bit)
; i = i +
inc
1;
i ; i = i + 1 operations
p ((the .b
; j = i
mov i,WREG ; W0 = i
qualifier is removed).
mov WREG,j ; j = W0
; j = j – 1;
dec j ; j= j – 1
; k = j + i
mov i,WREG ; W0 = i
add j,WREG ; W0 = W0+j (WREG is W0)
mov WREG,k ; k = W0
done:
goto done ;loop forever
V 0.2 67
Copyright Delmar Cengage Learning 2008. All Rights Reserved.
An Alternate Solution ((16-bit variables))
C Program equivalent ;Assign variables to registers
;Move variables into registers.
#define avalue 2047
;use register-to-register operations for
uint16 i,j,k;
computations;
i = avalue; // i = 2047
;write variables back to memory
i = i + 1; // i++, i = 2048
j = i;
; // j is 2048 ;assign
; g i to W1,
, j to W2,
, k to W3
j = j - 1; // j--, j is 2047
k = j + i; // k = 4095 Do calculation first
mov #2047,W1 ; W1 (i) = 2047
inc W1,W1 ; W1 (i) = W1 (i) + 1
mo W1,W2
mov W1 W2 ; W2 (j) = W1 (i)
Previous approach took 9 dec W2,W2 ; W2 (j) = W2 (j) -1
add W1,W2,W3 ; W3 (k) = W1 (i) + W2 (j)
instructions, this one took ;;write variables to memory
8 instructions.
instructions In this mov W1,i
mov W2,j
; 0x800 (i) = W1
; 0x802 (j) = W2
case, this approach is mov W3,k ; 0x804 (k) = W3
more efficient!
V 0.2 68
How long does mptst_word.s take to execute?
Ignoring
g g the ggoto at the end,, takes 12 instruction cycles,
y , which
is 24 clock cycles. Instruction
Cycles
mov #__SP_init,
__ _ W15 1
mov #__SPLIM_init,W0 1
mov W0,SPLIM 1
mov #avalue, W0 1
mov WREG,i 1
inc i 1
mov i
i,WREG
WREG 1
mov WREG,j 1
dec j 1
mov i,WREG 1
add j,WREG 1
mov WREG,k 1
Total 12
V 0.2 69
16-bit operations versus 8-bit
The 16-bit version of the mptst program requires the same number of
instruction bytes and the same number of instruction cycles as the 8-bit
version.
On an 8-bit processor, like the PIC18 family, the 16-bit version would take
roughly double the number of instructions and clock cycles as the 8-bit
version.
On th
O the PIC24
PIC24, a 32-bit
32 bit version
i off the
th mptstt t program will
ill take
t k approximately
i t l
twice the number of instructions and clock cycles as the 16-bit version. We
will look at 32-bit operations later in the semester.
V 0.2 70
Review: Units
In this class, units are always used for physical quantity:
Time Frequency
16.667 ms period of a frame at a frame rate of 60 Hz.
milliseconds (ms = 10-3 s) kilohertz (kHz = 103 Hz)
5.28 µs: Light travels 1 mile
microseconds (μs = 10-6 s) megahertz (MHz = 106 Hz)
nanoseconds (ns = 10-9 s) gigahertz (GHz = 109 Hz)
fs = 10^-12
V 0.2 72
Some PICMicros that we have used
Features 16F87x PIC18F242 PIC24H
(Fall 2003) (Summer 2004) (Summer 2008)
Instruction 14 bits 16 bits 24 bits
width
idth
Program 8K instr. 8K instructions ~10K instructions
memory