You are on page 1of 15

Cours dinfo2 : microcontrleur

mid-range pic16fxxx
Eric Nativel
IUT Nmes - GEII S2
Anne universitaire 2014 2015

processeur mmoire carte dextension

usb

Bus de donnes
cran Bus dadresse
Bus de contrle
srie

clavier, souris

parallle
stockage de masse ethernet ->uC pic
Processeur
CPU : Central Unit Processor == unit de traitement de donnes
== cerveau de tout systme informatique
gre et contrle les oprations arithmtiques et logiques des
processus informatiques
Ne comprend que le langage binaire == suite de codes binaires
uniques pour 1 type de processeur donn
Architecture CISC : jeu dinstructions puissantes non limits, temps
dexcution variable
Architecture RISC : jeu dinstructions rduits simple, temps dexcution
garanti et optimis
Algorithme cod en assembleur premier langage informatique :
Assembleur correspondance mnmonique vers code binaire
Ex: LD 0x12,w
bas niveau -> langage C, langage volu
Ex : printf(coucou);

retour

Contenu dun CPU


Une UAL pour effectuer des oprations arithmtiques et
logiques.
Un registre d'instruction associ un dcodeur
permettant de dcomposer et d'organiser l'excution de
l'instruction.
Un certain nombre de registres internes, pour stocker
temporairement des donnes ou les bits de conditions.
Un systme de gestion d'adresses, permettant la
localisation des informations, qu'elles soient donnes ou
instructions.
Un ensemble de Bus, permettant de vhiculer soit des
donnes, Bus de donnes, soit des adresses, Bus
d'adresse, soit des informations permettant de contrler
ces transferts, Bus de contrle.
Mmoires
Mmoire morte (Read Only Memory): garde
le contenu en absence dalimentation (non
volatile), vitesse daccs lente
ROM, PROM (vraiment Read Only), EPROM,
EEPROM, UVPROM, flash
Mmoire vive (Random Access Memory) :
perd le contenu de la mmoire en absence
dalimentation (volatile), vitesse daccs
rapide
RAM, DRAM, SRAM, MRAM (non volatile)
retour

Bus
Bus dadresse : permet de slectionner un
composant selon son adresse sur le
systme
Bus de contrle : permet de contrler ces
transferts
Bus de donnes : vhicule les donnes
entre les diffrents composants du
systme

retour
Microcontrleur / Microprocesseur
Microcontrleur = processeur + mmoires
+ priphriques (module dinterface)

Microcontrleur : pic16f877
Microcontrleur : pic16f877

structure pic16f877
Structure interne : pic16f877

Priphriques

Mmoires

CPU
Horloge =
Cur

Structure interne : pic16f877 (suite)


ALU :Unit Arithmtique et Logique

Format des instructions


Organisation mmoire
Architecture de Harvard != architecture de Von Neumann
uC pic == Harvard modifi ! mmoire de programme et mmoire de donnes spares

Mmoire de programme : stockage de


programme, instruction code sur 14 bits

Bus dadresse sur 13 bits : 8192 adresses

PC : compteur de programme (13 bits) :


pointe linstruction suivante

Adresse de reset : 0000h

1 vecteur dinterruption @ adresse 0004h

Plage de stockage de programme dcoupe


en zone de 2 ko

Stack == pile sur 8 niveaux : conserve les


donnes du programme au moment dun saut
/ appel sous programme

Mmoire de donnes contient


les registres spcifiques de 8
bits
+
368 octets de RAM
Rpartie sur 4 banks

Registres permettent :
de configurer luC et les
priphriques en positionnant des
bits (criture)
davoir une info sur ltat dun
priphrique ou le uC (lecture)
Les entres / sorties tout ou rien
Broches du pic sont multifonctions
Pic 16f877 : 33 I/Os TOR, rparties sur 5 ports A (6), B(8), C(8), D(8) et E(3)
Les broches sont bidirectionnelles, pas simultanment !!
Niveau logique tension (niveau TTL)
Niveau logique ou tat 1 correspond une tension en entre ou en
sortie de 5V
Niveau logique ou tat 0 correspond une tension en entre ou en
sortie de 0V
2 registres (8 bits) par port grent les broches dI/O individuellement :
TRISA, TRISB, TRISC, TRISD et TRISE : grent le sens des broches,
configuration dune broche en entre ou en sortie
PORTA, PORTB, PORTC, PORTD et PORTE : crit ou lit ltat dune broche

Mmoire
de donnes

Les entres / sorties tout ou rien


registres TRISx :
registre sur 8 bits en mmoire de donnes
chaque bit du registre permet de configurer le
sens de la broche correspondante
Niveau logique 0 positionn, la broche est
configure en sortie
Niveau logique 1 positionn, la broche est
configure en entre
Ex : broches 1,3, 5 et 7 en entre les autres en
sortie du port B
Il faut configurer le registre TRISB
Broche Broche Broche Broche Broche Broche Broche Broche
TRISB 0
0
1
1
2
0
3
1
4
0
5
1
6
0
7
1
instructions en langage C :
Affectation globale du registre : TRISB = 0b10101010; ou TRISB=0xAA; ou
TRISB=170;
Affectation bit bit du registre : TRISBbits.RB0=0;
TRISBbits.RB1=1;
Les entres sorties tout ou rien
Registres PORTx :
registre sur 8 bits en mmoire de donnes
chaque bit du registre permet de fixer (criture) ou rcuprer (lecture)
ltat de la broche correspondante
Si la broche est configure en sortie:
Niveau logique 0 crit, la broche a une sortie 0V
Niveau logique 1 crit, la broche a une sortie 5V
Si la broche est configure en entre:
Si on applique 0V sur la broche, on lit ltat 0
Si on applique 5V sur la broche, on lit ltat 1
Ex : broche 1 du port B a t configure en entre (TRISB=0x01) et les
autres en sortie

On ne peut donc pas crire sur le bit reprsentant la broche 1 du


port B, OK pour les autres

sortie
Led

Programmation des entres/sorties tout


ou rien
Instructions en C :
accs individuel des broches dun port :
si on veut lire ltat dune broche (broche1 du portB en entre) :
etat=PORTBbits.RB0;
si on veut crire un tat sur une broche (autres broches du portB en
sortie) :
PORTBbits.RB1=etat;
accs aux broches via le registre PORTx :
PORTB= 0xFE;

Techniques en C :
Masque : opration pour extraire un ou plusieurs bits dans un ensemble binaire
Utilisation des oprateurs bit bit &(ET) et | (OU)
si var contient 13 ou 0b00001101
var & 4 quivaut var & 0b00000100 : rsultat vaut 0b0000100 (on
ne garde que le bit 3)
Dcalage : oprateur pour effectuer un dcalage vers la droite >> ou la
gauche << dun certain nombre de rang
si var contient 13 ou 0b00001101
var << 2 : rsultat vaut 0b00110100, on dcale le contenu de var de
2 bits vers la gauche
Exemple de code
#include <htc.h>
#define _XTAL_FREQ 4000000 // dclaration horloge 4 MHz
__CONFIG(WDTE_OFF & LVP_OFF & FOSC_HS); // configuration des fusibles

void main(void)
{
TRISA=0xF0; // configuration : broches RA5 entre, RA0 RA4
sortie
while(1) // boucle infinie
{
PORTA=0x0D; // broche RA0, RA2, RA3 mis 1
__delay_ms(500);
if(PORTAbits.RA5==1) // si on impose un tat 1 sur RA5
PORTAbits.RA0=0; // RA0 mis 0
}
}

Fonctionnalits spciales
Bits de configuration hors zone mmoire (0x2007)
Information fournie lors de la programmation de la cible seulement
Directive mettre dans le code source

__CONFIG(); //macro avec mots clefs cidessous; composition possible avec


oprateur &
// selection de loscillateur // Write protection off; all program memory may be written to by
// RC oscillator EECON control
#define FOSC_EXTRC 0xFFFF #define WRT_OFF 0xFFFF
// HS oscillator // 0000h to 00FFh write-protected; 0100h to 1FFFh may be written to
#define FOSC_HS 0xFFFE by EECON control
// XT oscillator #define WRT_256 0xFDFF
#define FOSC_XT 0xFFFD // 0000h to 07FFh write-protected; 0800h to 1FFFh may be written to
by EECON control
// LP oscillator #define WRT_1FOURTH 0xFBFF
#define FOSC_LP 0xFFFC // 0000h to 0FFFh write-protected; 1000h to 1FFFh may be written to
// autorisation du timer chien de garde Watchdog by EECON control
// WDT enabled #define WRT_HALF 0xF9FF
#define WDTE_ON 0xFFFF // In-Circuit Debugger Mode bit
// WDT disabled // In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O
#define WDTE_OFF 0xFFFB pins
// autorisation du timer dallumage Power-up #define DEBUG_OFF 0xFFFF
// PWRT disabled // In-Circuit Debugger enabled, RB6 and RB7 are dedicated to the
#define PWRTE_OFF 0xFFFF debugger
// PWRT enabled #define DEBUG_ON 0xF7FF
#define PWRTE_ON 0xFFF7 // Flash Program Memory Code Protection bit
// autorisation reset Brown-out // Code protection off
// BOR enabled #define CP_OFF 0xFFFF
#define BOREN_ON 0xFFFF // All program memory code-protected
// BOR disabled #define CP_ON 0xDFFF
#define BOREN_OFF 0xFFBF
// Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit
// RB3/PGM pin has PGM function; low-voltage programming enabled
#define LVP_ON 0xFFFF
// RB3 is digital I/O, HV on MCLR must be used for programming
#define LVP_OFF 0xFF7F
// Data EEPROM Memory Code Protection bit
// Data EEPROM code protection off
#define CPD_OFF 0xFFFF
// Data EEPROM code-protected
#define CPD_ON 0xFEFF
// Flash Program Memory Write Enable bits

Ex : __CONFIG(CP_OFF & BOREN_OFF & WDTE_OFF & PWRTE_ON & FOSC_HS );

Instructions
Horloge fixe traitement d1 instruction
Frquence dhorloge de DC Fclock_max (20 MHz)
1 instruction est dcode en 4 temps (4*Tosc) =
1 temps de cycle (1 Tcy)

Q1 : dcodage dinstruction ou instruction NOP


Q2 : Lire les donnes de linstruction ou NOP
Q3 : calcul Ex : Fclock= 4 MHz ! 1 Tcy = 1 s
Q4 : criture des donnes ou NOP
Les timers
3 timers / compteurs : registres qui sincrmentent dune unit chaque multiple d1
Tcy

Registres accessibles en lecture ou criture

Re-bouclage du comptage : , 253, 254, 255, 0, 1, 2,

Timer 0 : TMR0 = registre de 8 bits


comptage de 0 255

Timer 1 : TMR1L et TMR1H = 2 registres de 8 bits


! comptage de 0 65535

Timer 2 : fonctionne par comparaison entre TMR2 = registre de 8 bits et PR2 = registre
de 8 bits
! comptage de 0 255

Fonctionnement indpendant de lUAL

Timer0

Configuration de OPTION_REG
Possibilit horloge externe sur RA4
Pr-diviseur (pr): multiplication du Tcy
Pr-diviseur partag avec le chien de
garde
(watchdog)
Calcul de valeur de TMR0 pour
rebouclage
tv=TMR0*Tcy*pr
Timer0 : option register

Ex : OPTION_REG = 0x01;
horloge interne
pr-diviseur associ Timer0
pr-division 4
Si Horloge fixe 4 MHz
Si temps de comptage Tv = 500 s
!TRM0 = 125

Timer1

TMR1 = TMR1L+TMR1H*256
Timer2
Fonctionne par comparaison entre le registre
TMR2 et PR2
Lors d1 galit ! remise 0 du registre
TRM2
Prsence dun post-diviseur : activation du
drapeau TMR2IF retarde (voir chapitre
interruption)

Ex :
horloge 4 MHz
T2CON = 0x05;
PR2 = 125;
La frquence de remise 0
de TMR2, Fraz= 2 kHz

Exemples de code
#include <htc.h> #include <htc.h>
#define _XTAL_FREQ 4000000 #define _XTAL_FREQ 4000000

void main (void) void main(void)


{ {
OPTION_REG=0x01; OPTION_REG=0x01;
TRISA=0x00; TRISA=0x00;
while(1) while(1)
{ {
TMR0=0; TMR0=255-125;
PORTA=0xFF; while(T0IF!=1);
while(TMR0<125); T0IF=0;
TMR0=0; PORTA=0xFF;
PORTA=0x00; TMR0=130;
while(TMR0<125); while(T0IF!=1);
} T0IF=0;
} PORTA=0;
}
}

You might also like