Vous êtes sur la page 1sur 21

Cours 1- 2 : Architecture interne du PIC 16FXXX

Mémoire programme

1k 16F84
4k

8k
16F873

16F887

b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0


Que valent m et n ?
Mémoire données 68 octets 16F84
2x96=192 octets 16F873 sur 4
banques dont deux identiques.
SFR Banc de registres
Special
Function
Registers
File en anglais
Banc Reg/RAM
RAM

b7 b6 b5 b4 b3 b2 b1 b0

Banque 0 Banque 1
SFR Banc de registres Banc de registres
Special
Function
Registers File

68 octets 16F84
RAM Identique RAM

b7 b6 b 5 b4 b3 b 2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0
Modèle de programmation du PIC 16F84
Registre de travail
W
Banc de registres
SFR b7 b6 b 5 b4 b3 b2 b1 b0
Special PCL
Function status Compteur programme
Register
b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
PCLATH File
Pointeur de pile
b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
RAM
8 niveaux
b7 b6 b 5 b4 b3 b 2 b1 b0

Status IRP RP1 RP0 /TO /PD Z DC C

Les registres jaunes ne font


L'instruction MOVLW pas partie du banc de registres

Mnémonique
Opérande
Opcode sur 14 bits
MOVLW K 11 00xx kkkk kkkk

Mémoire programme
Registre de travail

1 1 0 0 0 0 1 0 0 1 1 1 1 0
W
16F84
b7 b6 b 5 b4 b3 b 2 b1 b0

b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0

La valeur est transférée à partir de la mémoire


programme vers le registre de travail.
Assembler et désassembler
Assembler
Mnémonique

Opérande
Opcode sur 14 bits

MOVLW K 11 00xx kkkk kkkk

Désassembler
Les deux autres instructions MOV

N'importe où dans File MOVF f,d 00 1000 dfff ffff

Banc de registres

PCL d=1
status Registre de travail

PCLATH

W
RAM
b7 b6 b 5 b4 b3 b 2 b1 b0

d=0 Positionne Z de STATUS

N'importe où dans File MOVWF f 00 0000 1fff ffff


Banc de registres

PCL Registre de travail


status

PCLATH
W

RAM b7 b6 b 5 b4 b3 b 2 b1 b0
Les instructions MOV sur architecture complète
10
8
Data bus
Program Counter

FLASH
Program
MOVF f,d
RAM avec d=0
Memory 8 Level stack
File Registers
1K x 14 (10 bits)
68 x 8

14 7
RAM Addr

Instruction register Adr MUX


TMR0
5 7
Indirect Addr
direct Addr FSR reg

STATUS RA4/T0CKI
MOVLW K
PORTA

Power-up MUX
Timer I/0 Ports
RA3 ..RA0
Instruction Oscillator
Decode & startup
Control Timer
ALU RB7 ..RB1
Power-on
Reset MOVWF f
Timing PORTB
génération
Watchdog RB0/INT
Timer ACC W

Architecture du 16F84A
OSC2/CLKOUT MCLR OSC2/CLKOUT
OSC1/CLKIN OSC1/CLKIN

Exécuter un programme avec un compteur programme


Des PORTs pour les entrées et sorties (notées E/S)
PORT
Ampli de puissance
b7 E/S
b6 E/S
b5 Bus interne E/S physique
E/S
PIC16F b4 E/S TRISA
b7 RB2
b3 E/S
b2 b6
E/S
b1 b5
E/S
b0 b4
E/S b3
b2
b1
b0

PORTA
Détermine la direction :
(1) entrée ou (0) sortie

Les PORTs du PIC 16F84


(1) RA2 RA1 (18)
RA3 RA0
OSC1/CLKIN
RA4/T0CKI
MCLR OSC2/CLKOUT
Deux ports :
masse/VSS VDD/Vcc - PORTA 5 bits RA0 -> RA4
RB0/INT RB7
RB1 RB6 -PORTB 8 bits RB0 -> RB7
RB2 RB5
(9) RB3 RB4 (10)

Les PORTs du PIC 16F887


MCLR RB7
RA0 RB6
Cinq ports : RA1 RB5
RA2 RB4
- PORTA 8 bits RA0 -> RA7 RA3 RB3
RA4 RB2
- PORTB 8 bits RB0 -> RB7 RA5 RB1
RE0 RB0
- PORTC 8 bits RC0 -> RC7 RE1 Vcc
RE2 GND
- PORTD 8 bits RD0 -> RD7 VCCPIC16FRD7
GND RD6
- PORTE 2 bits RE0 -> RE2 RA7 RD5
RA6 RD4
RC0 RC7
RC1 RC6
RC2 RC5
RC3 RC4
RD0 RD3
RD1 RD2
Les modèles électriques des PORTs
V (V)
5 OH

max
4

typ
3

2 min

0 5 10 15 20 25
IOH (mA)
Les ports du 16F84 sont supposés délivrer ou recevoir jusqu'à 25mA

VOL (V)
1.0

max
0.8

typ
0.6

min
0.4

0.2

0 5 10 15 20 25
IOL (mA)
IOH IOL

Sortie Rth 56<Rth<180 R'th 16<R'th<36


Sortie
haute basse

UHth = 5V ULth=0V

On prendra toujours Rth =100 Ω

Après avoir déterminé les modèles de Thévenin des PORTs on s'intéresse


maintenant aux résistances de tirage.
Les résistances de tirage des PORTs
A quoi cela sert ? On les utilise en général pour les entrées et cela peut éviter
d'utiliser ces mêmes résistances en externe.

Vcc
PORT
b7
(en) pull-up resistor
(fr) Résistance de tirage b6
interne b5
PIC 16FXXX b4
b3
b2
b1
b0

Sur PIC pull-up avec bit RPBU du registre OPTION


Cours 3 - 4 Interfaces externes des micro-contrôleurs

I) Horloge
Le 16F84 peut être configuré pour 4 modes d'horloge :
- XT- crystal : mode standard pour 1 – 4 MHz
- HS – High Speed aux alentours de 4 MHz : grande consommation de courant
- LP - Low Power fréquences basses (32,768 kHz jusqu'à 200 kHz)
- RC Resistor Capacitor difficile de prévoir la fréquence d'oscillation avec certitude.
Vcc

C1=22pF RExt
(16) OSC1

(16) OSC1
RF
sleep
RS
CExt
C2=22pF (17) OSC2

PIC 16F PIC 16F

II) Interfacer des LEDs UD ou U0 : tension de seuil


Rappel : Si UD inconnue prendre 1,8V.
Diode bloquée Diode passante RD : résistance dynamique
Si RD inconnue prendre 0Ω.
RD
UD Vcc

R1
IS
PA1 R1
Micro-contrôleur
IE
Micro-contrôleur PA1

Micro-contrôleur comme source de courant Micro-contrôleur comme puits de courant


ATTENTION les ports ne sont pas forcément symétriques : IS peut être différent de IE.
Pour information VOH=4V pour ID=10mA et V0L = 0,4V pour ID=10mA pour le PIC 16F84.
Calculer les modèles de Thévenin correspondants.
Si on ne connait rien on prend VD = 1,8V et V0L = 0V et VOH=Vcc.
Calcul de R1
Source de courant : R1= (VOH-VD) /ID avec VD tension directe de la diode et VOH tension haute du
port.
Puits de courant : R1= (Vcc-VD-V0L) /ID avec V0L tension basse du port
Exemple :
Kingbright led rouge 10mA l=627nm 15mcd à 10mA VD = 1,95V
Kingbright led vert 10mA l=565nm 12mcd à 10mA VD = 2,09V

Pour information les résistances utilisées sur EasyPIC5 sont de 1kΩ.


Pour généraliser l'utilisation des LEDs, on peut s'intéresser aux afficheurs sept segments

a b g a b g

Anode commune Cathode commune

Comment allume-t-on un afficheur anode commune, un afficheur cathode commune ?

Multiplexage de plusieurs afficheurs :

290 DC56­11EWA Common Cathode
PIC RC0
16F877A RC1 a a
RC2 b f g b
RC3 c
RC4 d e c
RC5 e
RC6 f d
g

1k 1k
RB0
RB1

EasyPIC5
MCLR RB7
RA0 RB6 a b c d e f g DP
RA1 RB5
DIS3 DIS0
RA2 RB4
RA3 RB3 f g b
RA4 RB2
RA5 RB1
RE0 RB0 e c
RE1 Vcc
RE2 GND d
VCC PIC16FRD7
GND RD6
RA7 RD5
RA6 RD4
RC0 RC7
RC1 RC6 10k
RC2 RC5
RC3 RC4
RD0 RD3
RD1 RD2
sw6

DIS3

DIS0
III) Interfacer des sorties puissantes
Pour commander des sorties puissantes il faut ajouter des transistors (BJT Bipolar Junction
Transistor). Les sorties puissantes peuvent être :
- des relais Résistance pull-up = résistance de tirage
- des bobines Vcc = 5V
- des LEDs Vcc=12V
- des moteurs Certains micro-contrôleurs ont une
résistance interne pull-up par défaut
100R à la mise sous tension. Le transistor
RC
680R est alors passant. Pour éviter cela on
peut ajouter la résistance R2.
2K2
PA2 R1 2N2222 permet
de sortir jusqu'à
R2 1K 60mA

Micro-contrôleur

Problème des Pull-Up internes pour les entrées


Sur PIC pull-up avec bit RPBU du registre OPTION
initialisé à 1 à la mise sous tension mais ????.

IV) Interfacer des sorties puissantes avec des FET


On peut utiliser des transistors à effet de champ à la place des BJT. Nous examinons le cas des
MOSFET.

Vcc = 5V
Vcc=12V
Il existe des familles spécialement faites
pour être commandées directement par
des PORTs. Voir ZVN4206A et
RC ZVN4306A de chez Zetex.

BSS138 permet
PA2
de sortir jusqu'à
R2 220mA avec
2K2
VDS=0,13V
Micro-contrôleur

V) Encore plus de puissance


Il faut utiliser des opto-coupleurs. Il permettent aussi une isolation galvanique ce qui est important
si la tension d'alimentation est très différente de celle du micro-contrôleur.

Vcc=5V 24V
TLP181 :
16mA < IDmax < 20mA avec VD <1,3V à 10mA
R1 RC Charge 1mA < IC <10mA
Dimensionner R1.
TLP181

Micro-contrôleur
PAi
VI) Commander des bobines moteurs et relais avec BJT
Il existe des transistors de puissance adaptés. Par exemple le transistor BD139 propose un gain β
compris entre 25 et 250. On peut l'utiliser avec un courant IC=1,5 A (3A en pointe). Son faible gain
nécessite un courant IB assez important, allant au-delà des possibilités des ports traditionnels
(typiquement 10mA). Par exemple pour commuter 1A, il faut un IB=40mA dans le pire des cas. Il
faut donc un transistor supplémentaire.
Vcc = 15V
Vcc = 15V Le transistor 2N2222 est bloqué, il
D1 M circule 40mA dans IB
R2 1°) Si R2 est choisi à 330 Ω, quelle
IB puissance passe dans R2 ?
BD139 2°) Si le transistor 2N2222 est
3K3
2N2222 permet saturé (VCEsat=0,2V) quelle
PA2 R1
de sortir puissance passe dans R2 ?
jusqu'à 60mA
3°) Lorsque le BD139 est saturé, il
sous 60V
circule Il circule IC=1A et l'on a
Micro-contrôleur VCEsat=0,70V. Quelle puissance
est dissipée dans le BD139 ?

VII) Quelques circuits spécialisés


On peut trouver des circuits spécialisés destinés à commander directement des moteurs.

Le circuit L293D de chez Texas


Voici le schéma interne :
On suppose que
- Pin 4 est reliée à RA3
- Pin 5 est reliée à RA2
- Pin 7 est reliée à RA1
- Pin 6 est reliée à RA0
Comment fait-on avancer un robot motorisé par deux moteurs ? Comment le fait-on reculer ?

VIII) Interfacer des entrées


- Les boutons
Vcc=5V

Sans pull-up
R1 interne
Cela fonctionne- 4,7kΩ
t-il sans pull-up ?
RA4 RA4 Vcc=5V
Vcc=5V

RA1 RA1 R3
470Ω
Micro-contrôleur R1 Micro-contrôleur R2 4,7kΩ

Montage simple qui nécessite cependant un bit par interrupteur.


On ne peut pas toujours se le permettre.
Application au clavier

Vcc

Résistances
de tirage
1 2
PORTB 3

b7 4 5 6

b6 7 8 9
b5
* 0 #
b4
b3
b2
b1
b0 clavier

Ajouter interface afficheur LCD


Vcc
RA3
J15
MCLR RB7
RA0 RB6 a b c d e f g DP
RA1 RB5
DIS3 DIS0
RA2 RB4
RA3 RB3 f g b
RA4 RB2
P1 RA5 RB1
RE0 RB0 e c
RE1 Vcc
RE2 GND d
VCC PIC16FRD7
GND RD6
RA7 RD5
RA6 RD4
RC0 RC7
RC1 RC6 10k
RC2 RC5
RC3 RC4
RD0 RD3
RD1 RD2
sw6

DIS2

DIS0
Cours 4­5 : les périphériques internes de la 
famille 16F

I) Les registres et noms des bits en Mikro C

Documentation
Ficher entête Mikro C
technique
//**MikroC fichier P18F84A.c ***
OPTION  //********** bits de OPTION
NOT_RBPU = 0x0007,
b7 RBPU INTEDG = 0x0006,
b6 INTEDG T0CS = 0x0005,
b5 T0CS T0SE = 0x0004,
PSA = 0x0003,
b4 T0SE
PS2 = 0x0002,
b3 PSA PS1 = 0x0001,
b2 PS2 PS0 = 0x0000,
b1 PS1 ...
b0 PS0

Remarque : les noms de la documentation et les noms du fichier


d'entête ne correspondent pas toujours !

Les trois façons de programmer en Mikro C

Ficher programme Mikro C
Void main( void) {
....
//*** Toujours *****
OPTION_REG.B3 =1;
//**** Si on connaît le nom
OPTION_REG.PSA =1;
// **** ou encore
PSA_bit = 1;
...

}
II) Timer0 dans 16FXXX

4
MUX  0
Timer0 1 MCU
b7   ..................................   b0 Clock
OPTION 
Timer0 b7
=1
b6
Overflow (8 bits) b5 T0CS
T0SE : Source Edge select
b7 b4 T0SE
PORTA
b6 b3 PSA
b2 PS2 b7
b5
b1 PS1 2, 4, ...,256 b6
b4 =2(n+1)
b0 PS0 b5
b3
b4 
b2 TMR0IF
b3RA4/T0CKI
b1
MUX  0 b2
b0 1 b1
INTCON
b0

III) Interruption timer0

INTCON
0x0B Banque 0 et 1 &

GIE &
b7
b6 EEIE &
b5 T0IE
&
b4 INTE
b3 RBIE
b2 T0IF
b1 Overflow
INTF
b0 Timer0
RBIF
b7   .....................................   b0
IV) Timer1 dans 18F4550 et 16F877A

4
Timer1 MUX  0
0xFB3h TMR1H
1
0xFB2h  TMR1L T1CON
b15   ..................................   b0
0xFCD
MCU
Timer1 b7 RD16 Clock
b6 T1Run
PIR1
b5 T1CKPS1
1, 2, 4,8
b7 & b4 T1CKPS0 =2(n)
b6 overflow
b3 T1OSCEN PORTC
b5
b2 NOT_T1SYNC
b7
b4
b1TMR1CS b6
b3
b0 TMR1ON b5
b2 CCP1IF Détection 
synchronisée b4
b1
b3
b0 TMR1IF
MUX  1 b2
0  T1OSI b1
 T1OSO/T1CLI
b0

 T1OSO/T1CLI TMR1ON
&
0 1
Prescaler
Sync with 
internal clock Timer1
1,2,4,8 0 Timer1L
1 High Byte
T1OSI FOsc/4
NOT_T1SYNC
TMR1CS
T1OSCEN Write TMR1L
8
T1CKPS<1:0> Read TMR1L

Timer1H
Timer1 dans 16FXXX
8
8
Internal Data Bus
V) CAPTURE POUR 16F877

PIR1
CCPR1H CCPR1L
b7
PORTC
b7 b6
TMR1H TMR1L b5
b6
b5 b4
b4 b3
b3 CCP1CON b2 CCP1IF
b2 b7 b1
RC2/CCP1
b1 b6 b0
b0 b5
b4

}
b3 CCP1M3 0000 : Module CCP1 désactivé
b2 CCP1M2 0100 : Capture tous les fronts 
1,4,16 descendants
b1 CCP1M1 0101 : Capture tous les fronts montants
b0 CCP1M0 0110 : Capture tous les 4 fronts montants
0111 : Capture tous les 16 fronts montants
VI) COMPARAISON PIC 16F877 

Special Event Trigger déclenchera:
 ­ un  Reset du Timer1 (mais pas un positionnement du 
drapeau d'interruption de Timer1)
POR  ­  positionnement du bit GO/DONE qui démarre une 
b7 TC conversion A/D (ECCP1 seulement)
b6
b5 TMR1H TMR1L
b4
Special Event Trigger
b3
b2 RC2/CCP1 Q  S Logique de sortie Comparaison
b1      R

b0
CCP1CO
TRIS CCPR1H CCPR1L
b7 C b7 N
b6 b6 PIR1
b5 b5 b7
b4 b4 b6

}
b3 b3 CCP1M3 b5
b2 0
b2 CCP1M2 b4
b1 b1 CCP1M1 b3
b0 b0CCP1M0 b2 CCP1IF
0010 : Compare bascule sortie quand comparaison (CCPxIF) b1
1000 : Compare force CCP à un (CCPIF est géré) b0 TMR1IF
1001 : Compare force CCP à zéro (CCPIF est géré)
1010 : Compare sort rien sur CCP mais sur CCPIF
1011 : Compare force Special Event Trigger reset sur timer1 (CCP1IF est géré)
VII) Timer2 dans 18F4550 et 16F877A

b7   ..................................   b0

PR2

0000  = 1: 1 
0001 = 1: 2  PIR1
0010 = 1: 3
Comparateur b7
T2CON .... 
b7 ­ 1111 = 1:16 b6
Reset b6 TOUTPS3 b5
b5 TOUTPS2 1, 2, ..,  b4
Timer2
b4 TOUTPS1 16 b3
b7   ..................................   b0 TOUTPS0 b2 CCP1IF
b3
&
b2 TMR2ON b1 TMR2IF
b1 T2CKPS1 b0 TMR1IF
1, 4, 16
b0 T2CKPS0
4
00  = 1: 1 
01 = 1: 4  MCU
1x = 1: 16 Clock
VIII) PWM dans 18F4550 et 16F877A

b7   ..................................   b0 0000  = 1: 1 
0001 = 1: 2  PIR1
PR2
0010 = 1: 3 b7
T2CON .... 
8 1111 = 1:16 b6
b7 ­
TOUTPS3 b5
Comparateur b6
b5 TOUTPS2 1, 2, .., 16 b4
Reset b4 TOUTPS1 b3
8
b7   ..................................   b0 TOUTPS0 b2 CCP1IF
b3
Timer2 b1 TMR2IF
b2 TMR2ON
T2CKPS1 b0 TMR1IF
b9   ..................................   b2 b1     b0 b1 1, 4, 16
10 & b0 T2CKPS0
CCP1CON
b7
00  = 1: 1 
01 = 1: 4  b6
Comparat 1x = 1: 16
eur b5 DC1B1
4 MCU b4 DC1B0
1 Clock
0 b3 CCP1M3
CCPR1 PORTC b2 CCP1M2
H b7 b CCP1M1
b9   ..................................   b2 b1      1
b6 b CCP1M0
b0 0
b5
CCPR1
b4 CCP1CON (CCP1M3­2­1­0
L
b7   ..................................   b0
  1100 : Enable PWM
b3
 R  Q RC2/CCP1 b2
 S b1
b0
Entrée n'importe quand 
TRISC
prise en compte en fin de 
période. b7
b6
b5
b4
b3
0 b2
b1
b0

Vous aimerez peut-être aussi