POLITECNICO
DI MILANO
www.polimi.it
Microcontrollers
INTRODUCTION and C Review
Outline
Course introduction
What is a Controller and how it works
Memory organization and Registers
Instructions and Programming Languages
Peripherals
Development Tools
Laboratory goals
C language review
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
2 / 231
Course Introduction
Main activities:
Learn the main microcontroller peripherals
Write code
Program and use a real device
Agenda:
From 16.30 to 16.45
From 16.45 to 18.00
19-22/10
Lesson 1
Introduction & C language
SW and board overview
26-29/10
Lesson 2
Ports & Interrupts
Hands-on
2-5/11
Lesson 3
Timers & 7-seg display
Hands-on
9-12/11
Lesson 4
ADC & LCD
Hands-on
16-19/11
Lesson 5
Capture Compare PWM
Hands-on
23-26/11
Lesson 6
Code optimization with
assembly
Hands-on
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
3 / 231
Course Introduction
Organizational stuff:
Group A : Mondays, 16.30 18.00
Group B : Tuesdays, 16.30 - 18.00
Group C : Wednesdays, 16.30 18.00
Group D : Thursdays,16.30 18.00
At least one PC per working-group (2-4 people)
A USB stick may be useful
Contacts:
rudi.lussana@polimi.it
mauro.buttafava@polimi.it
mirko.sanzaro@polimi.it
davide.portaluppi@polimi.it
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
4 / 231
What is a microcontroller
Single integrated device,
containing a processing
core, program and data
memories and many
peripheral modules
(also mixed-signal)
Wide range of devices:
FROM 8-bit architecture, 4 MHz, in SOT23-6
package TO 32-bit architecture, 200 MHz, with
ethernet and USB
Flexible and cost effective devices Mainly used for embedded
applications
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
5 / 231
How it works
Harvard-based architecture
35 instructions RISC processor core
Internal program and data memory
Multi-priority interrupt capability
Different kinds of peripheral modules and interfaces
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
6 / 231
Memory Organization (1)
PIC18F45K22 (used during this course):
21-bit program counter, capable of addressing up to
2 MB max program memory space
Program Memory:
64 kB (EEPROM)
Data Memory:
3896 kB of STATIC RAM
Data Memory is divided into:
Special Function Registers, used by the CPU
and peripherals for controlling the desired
operation of the device
General Purpose Registers, used for
temporary data storage
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
7 / 231
Memory Organization (2)
There are three types of Special Function Registers (SFR):
Core Registers:
Deal with CPU operation, interrupts control and input/output ports
(W, STATUS, INTCON, TRISA)
Peripheral Registers:
Control the operation of peripheral modules: enable, settings and data
input/output (ADCON, CCPR, SSPCON, TXSTA)
Configuration Registers:
Used for start-up configurations, oscillator settings, in-circuit program
settings and code protection purposes (CONFIG1, CONFIG2)
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
8 / 231
Instructions and programming
ASSEMBLY:
Hardware-level language
High complexity
Highest code optimization
Predictable timing
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
High-level Languages:
C (industry standard), Pascal
Better code understanding
(natural language elements)
Code optimization managed by
the compiler (Low)
Higher portability of code
franco.zappa@polimi.it
9 / 231
RISC Instruction Set
RISC architecture:
only 35 instructions
Predictable Timing:
each instruction
completes in one
(or two) cycles
possibility to create
delay routines
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
10 / 231
Peripherals
Why a Microcontroller instead of a Microprocessor?
PERIPHERALS ARE THE REAL BENEFIT OF USING A
MICROCONTROLLER
A C can directly interface with external world
PIC18F45K22 (used during this lessons):
GPIO with interrupt on change and internal pull-up
Multichannel 10-bit ADC with internal voltage reference
16-bit Timer/Counter module
Capture/Compare/PWM module
Enhanced USART module
Master Synchronous Serial Port (MSSP)
Analog Comparator module
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
11 / 231
PIC18F45
HIGH PERFORMANCE RISC CPU
FEATURES
Only 35 single word instructions to learn
Operating speed: DC - 20 MHz clock input
1024 words of program memory
4k bytes of Data RAM
64k bytes of Data EEPROM
16-bit wide instruction words
8-bit wide data bytes
PERIPHERAL FEATURES
35 I/O pins with individual direction
control
High current sink/source for direct LED
drive
- 25 mA sink max. per pin
- 25 mA source max. per pin
TMR0: 8-bit timer/counter with 8-bit
programmable prescaler
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
CMOS ENHANCED
FLASH/EEPROM TECHNOLOGY
Low power, high speed technology
Fully static design
Wide operating voltage range:
- Commercial: 2.0V to 5.5V
- Industrial: 2.0V to 5.5V
Low power consumption:
- < 2 mA typical @ 5V, 4 MHz
- 15 mA typical @ 2V, 32 kHz
-< 0.5 mA typical standby current @
2V
SPECIAL MCU FEATURES
In-Circuit Serial Programming
(ICSP)
Power-on Reset, Power-up Timer,
Oscillator Start-up Timer
Watchdog Timer with On-Chip RC
oscillator
franco.zappa@polimi.it
12 / 231
PIC18F45
RA5
RE0
RE1
RE2
VDD
VSS
RA7/CLKIN
RA6/CLKOUT
RC0
RC1
RC2
RC3
RD0
RD1
MSSP
TIMER0
STACK
POWER-UP TIMER
START-UP TIMER
POWER ON RESET
WDT
EEPROM
Program
Mem
REG. FILE
EEPROM
Data Mem
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
W
ALU
PORTD
franco.zappa@polimi.it
PORTB
EUSART
PORTD
RA4
PC
PORTC
RA3
PORTA
RA2
PORTE
RA1
ADC
OSC
RA0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PORTC
MCLR/Vpp
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
13 / 231
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
VDD
VSS
RD7
RD6
RD5
RD4
RC7
RC6
RC5
RC4
RD3
RD2
Architecture
How can I write a number in a register?
Opcode is loaded from
Program Memory to
Instruction Register
A section of Opcode
represents the data to
transfer
The data to transfer is
stored into Working
register
The following instruction
will load the content of
Working register and
store it into the
destination register
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
14 / 231
Architecture
Opcode is loaded from
Program Memory to
Instruction Register
A section of Opcode
represents the data to
transfer
The data to transfer is
stored into Working
register
The following instruction
will load the content of
Working register and
store it into the
destination register
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
15 / 231
Architecture
Opcode is loaded from
Program Memory to
Instruction Register
A section of Opcode
represents the data to
transfer
The data to transfer is
stored into Working
register
The following instruction
will load the content of
Working register and
store it into the
destination register
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
16 / 231
Architecture
Opcode is loaded from
Program Memory to
Instruction Register
A section of Opcode
represents the data to
transfer
The data to transfer is
stored into Working
register
The following instruction
will load the content of
Working register and
store it into the
destination register
So I need two separate instructions to do that!
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
17 / 231
Development Tools (1)
Programming IDE and compiler
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
18 / 231
Development Tools (2)
In-Circuit programmer/debugger
Microchip PicKit 3
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
Development Board
Mikroelektronika EasyPIC v7
franco.zappa@polimi.it
19 / 231
Course Goals
Program a C
Handle Interrupts and manage timers
Interface with peripherals (ADC, CCP )
Connect to external circuits (displays, real-time clock, )
Put all this stuff together in a complex project
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
20 / 231
Variables
They are used to reserve a determined memory area in order to store one or
more numerical values, characters, strings
They can be divided into several types: int (16 bit), long int (32 bit), short (8
bit), char (8 bit), float, double
Each variable has to be declared in the function using it (unless it is a global
variable) and they can be accessed only in the calling function.
They are identified by a mnemonic label chosen by the programmer.
EX:
void main()
{
int first;
Char second;
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
21 / 231
Global Variables
They are declared outside functions.
Their access is limited to the .c they are declared in (unless we use external
variables).
EX:
int b;
void function1()
{
b = 10;
}
void function2()
{
int c;
c = b + 1;
Global variable declaration
Global variable used in a function
Local variable declaration
Both types are used here
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
22 / 231
Vectors
They are made by contiguous memory areas that can be accessed by a
common mnemonic label and an index
char b[6];
b[3] = 1;
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
23 / 231
Pointers
It is a peculiar type of variable used to store a memory address pointing to
another memory area containing data
int *p;
int b;
p = &b;
char b[6];
char *p;
p = b; (p = &(b[0]);)
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
24 / 231
Cast
It is used to transform a type of variable into another
int b;
char c;
b = 10;
c = (char) b;
This way of working is called explicit cast because the programmer
expresses his intention of changing the type of a variable.
Casts can also be implicit. This kind of cast operation is highly dangerous
when a variable with a certain memory usage is transformed into a
smaller variable.
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
25 / 231
Mathematical Operations
+,-,*,/
% (mod)
=
Other mathematical operators are implemented using specific libraries
but they require a significant computational time:
log, exp, sin, cos, sqrt
Sometimes we can use tricks to make the computational time shorter:
For instance, multiplying a variable by 2 is equivalent to shift all its bits one position to the
left, which is tremendously faster
a * 2 a << 2
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
26 / 231
Logical Operations
BITWISE OPERATIONS
&
--
bitwise and
--
bitwise or
--
bitwise xor
--
bitwise not
COMPARISON OPERATIONS
==
--
equal
!=
--
different
<
--
smaller than
>
--
greater than
<=
--
smaller or equal
>=
--
greater or equal
&&
--
and
||
--
or
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
27 / 231
If
if (condition)
{
//true branch
}
else
{
//else branch
}
EX: if ((a == 1) || ((b < 5) && (b > 1)))
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
28 / 231
Switch
switch (a)
{
case 1:
//code executed when a==1
break;
case 2:
//code executed when a==2
break;
default:
//code executed in all other cases
break;
}
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
29 / 231
Loops (1/2)
Loops are used to execute portions of code until a condition is met
While loop
While (condition)
{
//code
}
Do While loop
do
{
//code
}
while(condition)
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
30 / 231
Loops (2/2)
For loop
for (initial assignments; condition; operation)
{
//code
}
for (int i = 10; i > 0; i --)
{
//this code is executed ten times
}
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
31 / 231
Functions
Prototype definition
Type
function_name
(type, type, );
Function definition
Type
{
function_name
(type input1, type input2, )
//code
}
Function call
Output
function_name
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
(input1, input2, );
franco.zappa@polimi.it
32 / 231
Functions (example)
Prototype definition
int
square
(int);
Function definition
int
{
square
(int input)
int output = input * input;
return output;
}
Function call
int x
5;
int y
square
(x);
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
33 / 231
C for microcontrolles
To write in C language for C is very similar to writing code for PCs.
DIFFERENCE: There are no standard I/O but physical I/O lines.
Printf( numero = %d, 8);
PORTB=0b00001000;
Various C compilers have many common characteristics:
ANSI C instruction set
Supported data types (bit, char, int, long, double)
Differences are usually found in the syntax used to access hardware
resources of the microcontroller.
HI-TECH PICC
TRISB = 0x00;
PORTB = 0x01;
Register settings
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
CCS PICC
set_tris_b(0x00);
output_b(0x01);
Function call
franco.zappa@polimi.it
34 / 231
DESIGN FLOW C LANGUAGE
Programming
HEX file
C code
Assembly
code
Assembler
COF file
Simulation
and debug
If bad firmware
ELECTRONIC SYSTEMS lab - MICROCONTROLLERS 00
franco.zappa@polimi.it
35 / 231