Cours n°1

publicité
Cours d’info2 : microcontrôleur
« mid-range » pic16fxxx
Eric Nativel
IUT Nîmes - GEII – S2
Année universitaire 2014 – 2015
processeur
mémoire
carte d’extension
usb
écran
Bus de données
Bus d’adresse
Bus de contrôle
série
clavier, souris
stockage de masse
parallèle
ethernet
->uC pic
Processeur
• CPU : Central Unit Processor == unité de traitement de données
• == « cerveau » de tout système informatique
• gère et contrôle les opérations arithmétiques 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 d’instructions puissantes non limités, temps
d’exécution variable
– Architecture RISC : jeu d’instructions réduits simple, temps d’exécution
garanti et optimisé
• Algorithme codé en assembleur premier langage informatique :
– Assembleur correspondance mnémonique vers code binaire
Ex: LD 0x12,w
– bas niveau -> langage C, langage évolué
Ex : printf(‘‘coucou‘‘);
retour
Contenu d’un CPU
• Une UAL pour effectuer des opérations arithmétiques et
logiques.
• Un registre d'instruction associé à un décodeur
permettant de décomposer et d'organiser l'exécution de
l'instruction.
• Un certain nombre de registres internes, pour stocker
temporairement des données ou les bits de conditions.
• Un système de gestion d'adresses, permettant la
localisation des informations, qu'elles soient données ou
instructions.
• Un ensemble de Bus, permettant de véhiculer soit des
données, Bus de données, soit des adresses, Bus
d'adresse, soit des informations permettant de contrôler
ces transferts, Bus de contrôle.
Mémoires
• Mémoire morte (Read Only Memory): garde
le contenu en absence d’alimentation (non
volatile), vitesse d’accès lente
– ROM, PROM (vraiment « Read Only »), EPROM,
EEPROM, UVPROM, flash
• Mémoire vive (Random Access Memory) :
perd le contenu de la mémoire en absence
d’alimentation (volatile), vitesse d’accès
rapide
– RAM, DRAM, SRAM, MRAM (non volatile)
retour
Bus
• Bus d’adresse : permet de sélectionner un
composant selon son adresse sur le
système
• Bus de contrôle : permet de contrôler ces
transferts
• Bus de données : véhicule les données
entre les différents composants du
système
retour
Microcontrôleur / Microprocesseur
• Microcontrôleur = processeur + mémoires
+ périphériques (module d’interface)
Microcontrôleur : pic16f877
Microcontrôleur : pic16f877
structure pic16f877
Structure interne : pic16f877
Périphériques
Mémoires
CPU
Horloge =
Cœur
Structure interne : pic16f877 (suite)
ALU :Unité Arithmétique et Logique
Format des instructions
Organisation mémoire
Architecture de Harvard != architecture de Von Neumann
uC pic == Harvard modifié ! mémoire de programme et mémoire de données séparées
•Mémoire de programme : stockage de
programme, instruction codée sur 14 bits
•Bus d’adresse sur 13 bits : 8192 adresses
•PC : compteur de programme (13 bits) :
« pointe » l’instruction suivante
•Adresse de reset : 0000h
•1 vecteur d’interruption @ adresse 0004h
•Plage de stockage de programme découpée
en zone de 2 ko
•Stack == pile sur 8 niveaux : conserve les
données du programme au moment d’un saut
/ appel à sous programme
Mémoire de données contient
les registres spécifiques de 8
bits
+
368 octets de RAM
Répartie sur 4 « banks »
Registres permettent :
• de configurer l’uC et les
périphériques en positionnant des
bits (écriture)
• d’avoir une info sur l’état d’un
périphérique ou le uC (lecture)
Les entrées / sorties tout ou rien
•Broches du pic sont multifonctions
•Pic 16f877 : 33 I/Os TOR, réparties sur 5 ports A (6), B(8), C(8), D(8) et E(3)
•Les broches sont bidirectionnelles, pas simultanément !!
•Niveau logique – tension (niveau TTL)
Niveau logique ou état « 1 » correspond à une tension en entrée ou en
sortie de 5V
Niveau logique ou état « 0 » correspond à une tension en entrée ou en
sortie de 0V
•2 registres (8 bits) par port gèrent les broches d’I/O individuellement :
•TRISA, TRISB, TRISC, TRISD et TRISE : gèrent le sens des broches,
configuration d’une broche en entrée ou en sortie
•PORTA, PORTB, PORTC, PORTD et PORTE : écrit ou lit l’état d’une broche
Mémoire
de données
Les entrées / sorties tout ou rien
• registres TRISx :
– registre sur 8 bits en mémoire de données
– chaque bit du registre permet de configurer le
sens de la broche correspondante
• Niveau logique « 0 » positionné, la broche est
configurée en sortie
• Niveau logique « 1 » positionné, la broche est
configurée en entrée
Ex : broches 1,3, 5 et 7 en entrée les autres en
sortie du port B
Il faut configurer le registre TRISB
Broche
TRISB 0
0
Broche
1
1
Broche
2
0
Broche
3
1
Broche
4
0
Broche
5
1
Broche
6
0
Broche
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 entrées sorties tout ou rien
Registres PORTx :
•registre sur 8 bits en mémoire de données
• chaque bit du registre permet de fixer (écriture) ou récupérer (lecture)
l’état de la broche correspondante
•Si la broche est configurée 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 configurée en entrée:
Si on applique 0V sur la broche, on lit l’état « 0 »
Si on applique 5V sur la broche, on lit l’état « 1 »
Ex : broche 1 du port B a été configurée en entrée (TRISB=0x01) et les
autres en sortie
➔On ne peut donc pas écrire sur le bit représentant la broche 1 du
port B, OK pour les autres
sortie
Led
Programmation des entrées/sorties tout
ou rien
Instructions en C :
•
accès individuel des broches d’un port :
• si on veut lire l’état d’une broche (broche1 du portB en entrée) :
etat=PORTBbits.RB0;
• si on veut écrire un état sur une broche (autres broches du portB en
sortie) :
PORTBbits.RB1=etat;
•
accès aux broches via le registre PORTx :
PORTB= 0xFE;
Techniques en C :
•
Masque : opération pour extraire un ou plusieurs bits dans un ensemble binaire
Utilisation des opérateurs bit à bit « & » (ET) et « | » (OU)
si var contient 13 ou 0b00001101
var & 4 équivaut à var & 0b00000100 : résultat vaut 0b0000100 (on
ne garde que le bit 3)
•
Décalage : opérateur pour effectuer un décalage vers la droite « >> » ou la
gauche « << »
d’un certain nombre de rang
si var contient 13 ou 0b00001101
var << 2 : résultat vaut 0b00110100, on décale le contenu de var de
2 bits vers la gauche
Exemple de code
#include <htc.h>
#define _XTAL_FREQ 4000000
// déclaration horloge à 4 MHz
__CONFIG(WDTE_OFF & LVP_OFF & FOSC_HS); // configuration des fusibles
void main(void)
{
TRISA=0xF0;
// configuration : broches RA5 entrée, 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
}
}
Fonctionnalités spéciales
Bits de configuration hors zone mémoire (0x2007)
Information fournie lors de la programmation de la cible seulement
Directive à mettre dans le code source
__CONFIG(); //macro avec mots clefs ci–dessous; composition possible avec
opérateur « & »
// selection de l’oscillateur
// RC oscillator
#define FOSC_EXTRC
0xFFFF
// HS oscillator
#define FOSC_HS
0xFFFE
// XT oscillator
#define FOSC_XT
0xFFFD
// LP oscillator
#define FOSC_LP
0xFFFC
// autorisation du timer chien de garde « Watchdog »
// WDT enabled
#define WDTE_ON
0xFFFF
// WDT disabled
#define WDTE_OFF
0xFFFB
// autorisation du timer d’allumage « Power-up »
// PWRT disabled
#define PWRTE_OFF
0xFFFF
// PWRT enabled
#define PWRTE_ON
0xFFF7
// autorisation reset Brown-out
// BOR enabled
#define BOREN_ON
0xFFFF
// BOR disabled
#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
// Write protection off; all program memory may be written to by
EECON control
#define WRT_OFF
0xFFFF
// 0000h to 00FFh write-protected; 0100h to 1FFFh may be written to
by EECON control
#define WRT_256
0xFDFF
// 0000h to 07FFh write-protected; 0800h to 1FFFh may be written to
by EECON control
#define WRT_1FOURTH
0xFBFF
// 0000h to 0FFFh write-protected; 1000h to 1FFFh may be written to
by EECON control
#define WRT_HALF
0xF9FF
// In-Circuit Debugger Mode bit
// In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O
pins
#define DEBUG_OFF
0xFFFF
// In-Circuit Debugger enabled, RB6 and RB7 are dedicated to the
debugger
#define DEBUG_ON
0xF7FF
// Flash Program Memory Code Protection bit
// Code protection off
#define CP_OFF
0xFFFF
// All program memory code-protected
#define CP_ON
0xDFFF
Ex : __CONFIG(CP_OFF & BOREN_OFF & WDTE_OFF & PWRTE_ON & FOSC_HS );
Instructions
• Horloge fixe traitement d’1 instruction
• Fréquence d’horloge de DC à Fclock_max (20 MHz)
• 1 instruction est décodée en 4 temps (4*Tosc) =
1 temps de cycle (1 Tcy)
Q1
Q2
Q3
Q4
:
:
:
:
décodage d’instruction ou instruction NOP
Lire les données de l’instruction ou NOP
Ex : Fclock= 4 MHz ! 1 Tcy = 1 µs
calcul
écriture des données ou NOP
Les timers
•
3 timers / compteurs : registres qui s’incrémentent d’une unité chaque multiple d’1
Tcy
•
Registres accessibles en lecture ou écriture
•
Re-bouclage du comptage : …, 253, 254, 255, 0, 1, 2, …
•
Timer 0 : TMR0 = registre de 8 bits
•
Timer 1 : TMR1L et TMR1H = 2 registres de 8 bits
•
Timer 2 : fonctionne par comparaison entre TMR2 = registre de 8 bits et PR2 = registre
de 8 bits
! comptage de 0 à 255
•
Fonctionnement indépendant de l’UAL
à comptage de 0 à 255
! comptage de 0 à 65535
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 fixée à 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 d’1 égalité ! remise à 0 du registre
TRM2
• Présence d’un post-diviseur : activation du
drapeau TMR2IF retardée (voir chapitre
interruption)
Ex :
• horloge à 4 MHz
• T2CON = 0x05;
• PR2 = 125;
La fréquence de remise à 0
de TMR2, Fraz= 2 kHz
Exemples de code
#include <htc.h>
#define _XTAL_FREQ 4000000
#include <htc.h>
#define _XTAL_FREQ 4000000
void main (void)
{
OPTION_REG=0x01;
TRISA=0x00;
while(1)
{
TMR0=0;
PORTA=0xFF;
while(TMR0<125);
TMR0=0;
PORTA=0x00;
while(TMR0<125);
}
}
void main(void)
{
OPTION_REG=0x01;
TRISA=0x00;
while(1)
{
TMR0=255-125;
while(T0IF!=1);
T0IF=0;
PORTA=0xFF;
TMR0=130;
while(T0IF!=1);
T0IF=0;
PORTA=0;
}
}
Téléchargement