Components of a Microprocessor
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
Components of a Microprocessor
Memory:
Storage of data Storage of a program Either can be temporary or permanent storage
Registers: small, fast memories
General purpose: store arbitrary data Special purpose: used to control the processor
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 2
Components of a Microprocessor
Instruction decoder:
Translates current program instruction into a set of control signals
Arithmetic logical unit:
Performs both arithmetic and logical operations on data: add, subtract, multiply, AND, OR
Input/output control modules
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 3
Components of a Microprocessor
Many of these components must exchange data with one-another It is common to use a bus for this exchange
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
Collections of Bits
8 bits: a byte 4 bits: a nybble words: can be 8, 16, or 32 bits (depending on the processor)
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
Collections of Bits
A data bus typically captures a set of bits simultaneously Need one wire for each of these bits In the Atmel Mega2560: the data bus is 8bits wide In your home machines: 32 or 64 bits
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
Memory
What are the essential components of a memory?
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
A Memory Abstraction
We think of memory as an array of elements each with its own address Each element contains a value
It is most common for the values to be 8-bits wide (so a byte)
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
A Memory Abstraction
We think of memory as an array of elements each with its own address Each element contains a value
It is most common for the values to by 8-bits wide (so a byte)
Stored value
Address
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
Memory Operations
Read foo(A+5); reads the value from the memory location referenced by the variable A and adds the value to 5. The result is passed to a function called foo();
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
10
Memory Operations
Write A = 5; writes the value 5 into the memory location referenced by A
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
11
Types of Memory
Random Access Memory (RAM) Computer can change state of this memory at any time Once power is lost, we lose the contents of the memory This will be our data storage on our microcontrollers
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 12
Types of Memory
Read Only Memory (ROM) Computer cannot arbitrarily change state of this memory When power is lost, the contents are maintained
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
13
Types of Memory
Erasable/Programmable ROM (EPROM) State can be changed under very specific conditions (usually not when connected to a computer) Our microcontrollers have an Electrically Erasable/Programmable ROM (EEPROM) for program storage
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 14
CPU Exercise
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
15
Note: The concepts in the next ~50 slides below are covered in our acting exercise
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
16
Buses
In the simplest form, a bus is a single wire Many different components can be attached to the bus Any component can take input from the bus or place information on the bus
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
17
Buses
At most one component may write to the bus at any one time In a microprocessor, which component is allowed to write is usually determined by the code that is currently executing
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
18
Atmel Mega2560 Architecture
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
19
Atmel Mega2560
8-bit data bus Primary mechanism for data exchange
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
20
Atmel Mega2560
32 general purpose registers 8 bits wide 3 pairs of registers can be combined to give us 16 bit registers
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 21
Atmel Mega2560
Special purpose registers Control of the internals of the processor
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
22
Atmel Mega2560
Random Access Memory (RAM) 8 KByte in size
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
23
Atmel Mega2560
Random Access Memory (RAM) 8 KByte in size Note: in high-end processors, RAM is a separate component
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 24
Atmel Mega2560
Flash (EEPROM) Program storage 256 KByte in size
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
25
Atmel Mega2560
Flash (EEPROM) In this and many microcontrollers, program and data storage is separate Not the case in our general purpose computers
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 26
Atmel Mega2560
EEPROM Permanent data storage
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
27
Atmel Mega2560
Arithmetic Logical Unit Data inputs from registers Control inputs not shown (derived from instruction decoder)
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 28
One More Bus Note
Many devices on the bus. However, at a given time: There is exactly one device that is the writer There is exactly one that is the reader
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
29
Machine-Level Programs
Machine-level programs are stored as sequences of atomic machine instructions Stored in program memory Execution is generally sequential (instructions are executed in order) But with occasional jumps to other locations in memory
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 30
Types of Instructions
Memory operations: transfer data values between memory and the internal registers Mathematical operations: ADD, SUBTRACT, MULT, AND, etc. Tests: value == 0, value > 0, etc. Program flow: jump to a new location, jump conditionally (e.g., if the last test was true)
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 31
Mega2560: Decoding Instructions
Program counter Address of currently executing instruction
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
32
Mega2560: Decoding Instructions
Instruction register Stores the machine-level instruction currently being executed
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
33
Atmel Mega2560
Instruction decoder Translates current instruction into control signals for the rest of the processor
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 34
Atmel Instructions
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
35
Some Mega2560 Memory Operations
LDS Rd, k Load SRAM memory location k into register Rd Rd <- (k)
We refer to this as Assembly Language
STS Rd, k Store value of Rd into SRAM location k (k) <- Rd
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 36
Load SRAM Value to Register
LDS Rd, k
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
37
Store Register Value to SRAM
STS Rd, k
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
38
Some Mega2560 Arithmetic and Logical Instructions
ADD Rd, Rr Rd and Rr are registers Operation: Rd <- Rd + Rr ADC Rd, Rr Add with carry Rd <- Rd + Rr + C
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 40
Add Two Register Values
ADD Rd, Rr Fetch register values
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
41
Add Two Register Values
ADD Rd, Rr Fetch register values ALU performs ADD
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
42
Add Two Register Values
ADD Rd, Rr Fetch register values ALU performs ADD Result is written back to register via the data bus
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 43
Some Mega2560 Arithmetic and Logical Instructions
NEG Rd: take the twos complement of Rd AND Rd, Rr: bit-wise AND with a register ANDI Rd, K: bit-wise AND with a constant EOR Rd, Rr: bit-wise XOR INC Rd: increment Rd MUL Rd, Rr: multiply Rd and Rr (unsigned) MULS Rd, Rr: multiply (signed)
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 44
Some Mega8 Test Instructions
CP Rd, Rr Compare Rd with Rr TST Rd Test for if register Rd is zero or a negative number
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
45
Some Mega8 Test Instructions
Modify the status register
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
46
Some Program Flow Instructions
RJMP k Change the program counter by k+1 PC <- PC + k + 1 BRGE k Branch if greater than or equal to If last compare was greater than or equal to, then PC <- PC + k + 1
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 47
Connecting Assembly Language to C
Our C compiler is responsible for translating our code into Assembly Language Today, we rarely program in Assembly Language
Embedded systems are a common exception Also: it is useful in some cases to view the assembly code generated by the compiler
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 48
An Example
A C code snippet: if(B < A) { D += A; }
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
49
An Example
The Assembly : A C code snippet: LDS R1 (A) LDS R2 (B) if(B < A) { CP R2, R1 D += A; BRGE 3 } LDS R3 (D) ADD R3, R1 STS (D), R3 .. Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
50
An Example
A C code snippet: if(B < A) { D += A; }
Load the contents of memory location A into register 1
The Assembly : LDS R1 (A) PC LDS R2 (B) CP R2, R1 BRGE 3 LDS R3 (D) ADD R3, R1 STS (D), R3 ..
51
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
An Example
A C code snippet: if(B < A) { D += A; }
Load the contents of memory location B into register 2
The Assembly : LDS R1 (A) LDS R2 (B) PC CP R2, R1 BRGE 3 LDS R3 (D) ADD R3, R1 STS (D), R3 ..
52
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
An Example
A C code snippet: if(B < A) { D += A; }
Compare the contents of register 2 with those of register 1
This results in a change to the Andrew H. Fagg: Embedded Realstatus register Time Systems: Microcontrollers
The Assembly : LDS R1 (A) LDS R2 (B) CP R2, R1 PC BRGE 3 LDS R3 (D) ADD R3, R1 STS (D), R3 ..
53
An Example
A C code snippet: if(B < A) { D += A; }
Branch If Greater Than or Equal To: jump ahead 3 instructions if true
The Assembly : LDS R1 (A) LDS R2 (B) CP R2, R1 PC BRGE 3 LDS R3 (D) ADD R3, R1 STS (D), R3 ..
54
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
An Example
A C code snippet: if(B < A) { D += A; }
Branch if greater than or equal to will jump ahead 3 instructions if true
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
The Assembly : LDS R1 (A) LDS R2 (B) CP R2, R1 BRGE 3 LDS R3 (D) if true ADD R3, R1 STS (D), R3 .. PC
55
An Example
A C code snippet: if(B < A) { D += A; } The Assembly : LDS R1 (A) LDS R2 (B) CP R2, R1 BRGE 3 LDS R3 (D) PC ADD R3, R1 STS (D), R3 ..
56
if not true
Not true: execute the next instruction
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
An Example
A C code snippet: if(B < A) { D += A; }
Load the contents of memory location D into register 3
The Assembly : LDS R1 (A) LDS R2 (B) CP R2, R1 BRGE 3 LDS R3 (D) PC ADD R3, R1 STS (D), R3 ..
57
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
An Example
A C code snippet: if(B < A) { D += A; }
Add the values in registers 1 and 3 and store the result in register 3
The Assembly : LDS R1 (A) LDS R2 (B) CP R2, R1 BRGE 3 LDS R3 (D) ADD R3, R1 PC STS (D), R3 ..
58
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
An Example
A C code snippet: if(B < A) { D += A; }
Store the value in register 3 back to memory location D
The Assembly : LDS R1 (A) LDS R2 (B) CP R2, R1 BRGE 3 LDS R3 (D) ADD R3, R1 PC STS (D), R3 ..
59
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
Eagle CAD training: one person per group by today
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
60
The Important Stuff
Instructions are the atomic actions that are taken by the processor Many different component work together to execute a single instruction One line of C code typically translates into a sequence of several instructions In the mega 2560, most instructions are executed in a single clock cycle The high-level view is important here: you wont be compiling programs on exams
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 61
Atmel Mega2560 Microcontroller
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
62
Atmel Mega2560
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
63
Atmel Mega2560
Pins are organized into 8-bit Ports: A, B, C L
But no I
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
64
Digital Input/Output
Each port has three special-purpose registers that control its behavior. For port B, they are:
DDRB: data direction register B PORTB: port output register B PINB: port input B
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
65
Data Direction Register: DDRx
8-bit wide register
Controls one pin with each bit
0 -> this is an input pin 1 -> this is an output pin
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
66
Port Output Register: PORTx
Also one pin per bit If configured as an output:
0 -> the pin is held at 0 V 1 -> the pin is held at +5 V
Note: only configure pins as an output if you really mean it!
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
67
Port INput register: PINx
One pin per bit Reading from the register:
0 -> the voltage of the pin is near 0 V 1 -> the voltage of the pin is near +5 V
If nothing is connected to the pin, then the pin will appear to be in a random state
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
68
A First Program
Flash the LEDs at a regular interval How do we do this?
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
76
A First Program
How do we flash the LED at a regular interval? We toggle the state of PC0
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
77
A First Program
main() { DDRC = 0x3; while(1) { PORTC = PORTC | 0x1; // sets PC0 to 1 delay_ms(100); PORTC = PORTC & ~0x1; // set PC0 to 0 delay_ms(100); } }
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
78
A First Program
main() { DDRC = 0x3; while(1) { PORTC = PORTC ^ 0x1; delay_ms(100); } }
// flip PC0 to 1
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
79
A First Program
main() { DDRC = 1; // Set port C pin 0 as an output while(1) { PORTC = PORTC ^ 0x1; delay_ms(500); } }
// XOR bit 0 with 1 // Pause for 500 msec
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
81
A Second Program
main() { DDRC = 3; // Set port C pins 0, and 1 as outputs while(1) { PORTC = PORTC ^ 0x1; delay_ms(500); PORTC = PORTC ^ 0x2; delay_ms(250); PORTC = PORTC ^ 0x2; delay_ms(250); } }
// XOR bit 0 with 1 // Pause for 500 msec // XOR bit 1 with 1 // XOR bit 1 with 1
What does this program do?
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 82
A Second Program
main() { DDRC = 3; // Set port C pins 0, and 1 as outputs while(1) { PORTC = PORTC ^ 0x1; delay_ms(500); PORTC = PORTC ^ 0x2; delay_ms(250); PORTC = PORTC ^ 0x2; delay_ms(250); } }
// XOR bit 0 with 1 // Pause for 500 msec // XOR bit 1 with 1 // XOR bit 1 with 1
Flashes LED on PC1 at 1 Hz on PC0: 0.5 Hz
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 83
Port-Related Registers
Some of the C-accessible registers for controlling digital I/O: Directional control DDRB DDRC DDRD Writing PORTB PORTC PORTD Reading PINB PINC PIND
84
Port B Port C Port D
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
More Bit Masking
Suppose we have a 3-bit number (so values 0 7) Suppose we want to set the state of B3, B4, and B5 with this number (B3 is the least significant bit) And: we want to leave the other bits undisturbed How do we express this in code?
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 85
Bit Masking
main() { DDRB = 0x38; : : uint8_t val; val = command_to_robot; PORTB = ???? } // // A value between 0 and 7 // Set pins B3, B4, B5 as outputs
Fill this in
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
86
Bit Masking
main() { DDRB = 0x38; : : uint8_t val; val = command_to_robot; PORTB = (PORTB & ~0x38) | ((val & 0x7)<<3); } // A value between 0 and 7 // Set the current B3-B5 to 0s // OR with new values (shifted // to fit within B3-B5 // Set pins B3, B4, B5 as outputs
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
87
Reading the Digital State of Pins
Given: we want to read the state of PB6 and PB7 and obtain a value of 0 3 How do we configure the port? How do we read the pins? How do we translate their values into an integer of 0 .. 3?
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
88
Reading the Digital State of Pins
main() { DDRB = 0x38; // Set pins B3, B4, B5 as outputs // All others are inputs (suppose we care // about bits B6 and B7 only (so a 2-bit // number)
: : unsigned short val, outval; val = ???? // A short is 8-bits wide
// Read the input value of B // Translate to a value of 0 3
outval = ??? }
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
89
Reading the Digital State of Pins
main() { DDRB = 0x38; // Set pins B3, B4, B5 as outputs // All others are inputs (suppose we care // about bits B6 and B7 only (so a 2-bit // number)
: : unsigned short val, outval; val = PINB; outval = (val & 0xC0) >> 6; } // A short is 8-bits wide
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers
90
Putting It All Together
Program development:
On your own laptop We will use a C crosscompiler (avr-gcc and other tools) to generate code on your laptop for the mega8 processor
Program download:
We will use in circuit programming: you will be able to program the chip without removing it from your circuit
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 91
Compiling and Downloading Code
Preparing to program: See the Atmel HOWTO (pointer from the schedule page) Windoze: Install AVR Studio and WinAVR OS X: Install OSX-AVR
We will use make for compiling and downloading
Linux: Install binutils, avr-gcc, avr-libc, and avrdude
Same as OS X
Andrew H. Fagg: Embedded RealTime Systems: Microcontrollers 92