Cours 3 ASPGBM3-LMD
Cours 3 ASPGBM3-LMD
Cours 3 ASPGBM3-LMD
Tunis
Coût réduit
Encombrement moindre
z
Fiabilité
Mise en œuvre plus simple
Consommation plus faible
3
Rappel de la structure Interne d’un µC
uLa structure interne d'un microcontrôleur comporte typiquement :
Une unité de calcul et de commande
Mémoire ROM
Mémoire RAM
Un contrôleur d’interruption
Un compteur/temporisateur (timer)
Des entrées/sorties parallèles (ports) z
Un UART (port série)
4
Rappel de la
structure
Interne d’un
PIC16F877
5
Mémoires du microcontrôleur PIC (1)
Void main () {
z int i;
set_tris_b(0);
Output_b(0b00101010);
}
6
Mémoires du microcontrôleur PIC (2)
Mémoire RAM
General Purpose Register : mémoire RAM classique, utilisée pour stocker
des variables.
Exemple
int i; z
i++; // incrémentation de i depuis la RAM
SFR (Special Function Register) : c’est aussi de la mémoire RAM, sauf que
les rôles de chacune des cases mémoire (registres) ont été définis par le
fabriquant. Chaque registre SFR est connecté à un
composant/périphérique matériel spécifique et permet de le contrôler.
Exemple
7
ADCON0 register (adresse 9Fh) : permet de piloter le convertisseur A/D.
Mémoires du microcontrôleur PIC (3)
Mémoire ROM
Appelée aussi (à juste titre) mémoire
programme. C’est une mémoire Flash
z
qui contient le programme à exécuter.
Mémoire EEPROM
C’est une mémoire similaire à la mémoire
programme. On s’en sert surtout pour
stocker des constantes.
8
Fonctions PICC pour l’accès à la mémoire EEPROM
Instruction de lecture Instruction d’écriture
Paramètres: Paramètres:
address est un entier sur 8 bits (varie de 0 à 63 pouraddress est un entier sur 8 bits (varie de 0 à
un 16F84) 63 pour un 16F84).
value est un entier sur 8 bits value est un entier sur 8 bits
z Fonction: Ecrit un octet dans l’adresse
Fonction: Lit un octet de l’adresse spécifiée de spécifiée de l’EEPROM.
l’EEPROM. Cette fonction peut prendre plusieurs
millisecondes pour s’exécuter..
Exemple : Exemple :
#define case 10 #define case 10
volume = read_eeprom (case); volume++;
write_eeprom(case,volume);
On peut initializer le contenu d’un bloc de la mémoire EEPROM au début du programme en
utilisant la directive #ROM 0x2100 = {liste de valeurs},
Exp : avec #ROM 0x2100 = { 0, 8, 3, 9, 4, 1}
Read_eeprom(3) renvoie la valeur 9
9
Chapitre 3
Programmation des microcontrôleurs
Introduction
z
2.1 Rappel structure interne
2.2 Les mémoires/accès à la mémoire EEPROM
2.3 Les ports d’entrée/sortie
2.4 Les interruptions
2.5 Les timers
Les ports d’entrée/sortie (1)
Quels sont les ports d’E/S de ce microcontrôleur ?
PORTA PORTB
z
PORTE
Université de Savoie
PORTC
PORTD 0 0 11
Les ports d’entrée/sortie (2)
12
Les ports d’entrée/sortie (3)
1. Sortie trois états : Push-Pull
Fonctionnement
T1 T2 Sortie
BloquéEtat haute impédance
Bloqué "Z"
Bloqué Saturé "0"
z
Saturé Bloqué "1"
Saturé Saturé non utilisé
Des sorties trois états peuvent être reliées entres elles mais il faut bien
veiller à ce qu’une seule impose un niveau (haut ou bas) et que les
autres sorties soit en haute impédance.
13
Les ports d’entrée/sortie (4)
2. Sortie collecteur ouvert : Open Drain
Fonctionnement
z T2 S
Saturé "0"
Bloqué Dépend du montage
du circuit extérieur
14
Les ports d’entrée/sortie (5)
2. Sortie collecteur ouvert (2)
16
Les ports d’entrée/sortie (5)
• Technologies des ports en entrée:
Mode Floating input Mode Pull Down
z
➢ le circuit extérieur impose
le potentiel de la broche
Mode Pull Up
➢ Le potentiel de la broche se retrouve au
potentiel de référence (VCC ou GND)
grâce à la résistance de rappel.
➢ Le circuit extérieur doit avoir une
résistance de sortie faible devant R,
sinon, la tension chute 17
Les ports d’entrée/sortie (6)
Bouton poussoir : Led :
Il faut s’assurer que les broches/ports soient correctement configurées en entrée avant
d’utiliser ces fonctions.
20
Fonctions PICC de gestion des entrées et des sorties
Instructions d’écriture
Par bit Par octet
(ou broche) (ou port)
output_a (value)
output_high (PIN_xx) / output_low (PIN_xx) output_b (value)
output_bit (PIN_xx, value)
Paramètres: z
PIN_xx est l’adresse de la broche à écrire. Paramètres:
value est la valeur de forçage (0 ou 1) value entier de 8 bits à écrire sur le port de sortie
Fonction: force l’état de la broche PIN_xx à 0 ou 1. correspondant.
Exemple : Fonction: écrire un entier sur 8 bits sur le port
output_high(PIN_A0); correspondant.
output_bit( PIN_B0, 0); Exemple :
// Same as output_low(pin_B0); OUTPUT_B(0xf0);
output_bit( PIN_B0,input( PIN_B1 ) );
// Make pin B0 the same as B1
Il faut s’assurer que les broches/ports soient correctement configurées en sortie avant
d’utiliser ces fonctions. 21
Fonctions PICC de gestion des entrées et des sorties
#BYTE id = x
Paramètres:
id est un nom de variable.
x est une adresse mémoire sur 8 bits z
Fonction: crée une variable id à l’adresse x de la mémoire de données du PIC.
Exemple :
#byte pp_b=6
//pp_b est une variable définie à l’adresse du register SFR PORTB
pp_b = ~pp_b
//inverser l’état du port B
Événements internes
• Débordement Timer
• Fin écriture EEPROM
• Fin de conversion A/N
• ……
24
Explication du mécanisme d’interruption
Programme principal
Fin
25
Gestion de l’interruption par le microcontrôleur
26
Sources d’interruption (1)
Sources d’interruption du 16F877
Le 16F877 dispose de 15 sources d’interruptions.
Les événements susceptibles de déclencher une interruption sont les suivants :
1. Timer 0
2. Timer 1
3. RB0 du port B
4. Changement d’état du port B
z
5. Port parallèle (lecture/ecriture)
6. Convertisseur ADC
7. Transmission sur UART
8. Réception sur UART
9. Synchronisation du port série
10. CCP1 (Capture, Compare, PWM)
11. CCP2 (Capture, Compare, PWM)
12. Timer 2
13. Comparateur
14. Opération d’écriture dans la mémoire EEPROM
15. Collusion de bus
27
Sources d’interruption (2)
Sources d’interruption du 16F84
Le 16F84 ne dispose que de 4 sources d’interruptions possibles (contre 13 pour le 16F876).
Les événements susceptibles de déclencher une interruption sont les suivants :
- TMR0 : Débordement du Timer0. Une fois que le contenu du Tmr0 passe de 0xff à 0x00, une
interruption peut être générée.
z
- EEPROM : cette interruption peut être générée lorsque l’écriture dans une case EEPROM interne est
terminée.
- RB0/INT : Une interruption peut être générée lorsque, la pin RB0 (INTerrupt pin), étant configurée
en entrée, le niveau qui est appliqué est modifié.
- PORTB : De la même manière, une interruption peut être générée lors du changement d’un niveau
sur une des pins RB4 à RB7. Il n’est pas possible de limiter l’interruption à une seule de ces pins.
L’interruption sera effective pour les 4 pins ou pour aucune. 28
Activation des interruptions (1)
Pour qu’une interruption sur les microcontrôleurs PIC soit prise en compte, deux autorisations sont requises :
• Autorisation individuelle : on configure la ou les interruptions autorisées.
• Autorisation globale : on autorise ou interdit toutes les interruptions (qui doivent être autorisées
individuellement).
INTCON:
SFR 0Bh z
29
Activation des interruptions (2)
INTCON:
SFR 0Bh
30
Programmation d’une interruption (1)
32
Exemple de programmation d’une interruption
void main()
int16 compt;
{
int led_rouge;
. . .
#int_EXT
ext_int_edge(L_TO_H);
void ma_fonction()
enable_interrupts(INT_EXT);
{
enable_interrupts(GLOBAL);
compt=compt+1;
led_rouge=!led_rouge; z
while(1)
output_bit(PIN_A0, led_rouge);
{
}
if (compt>1000)
{
compt=0;
change_led();
}
delay_ms(300);
}
} 33
Chapitre 3
Programmation des microcontrôleurs
Introduction
z
2.1 Rappel de la structure interne
2.2 Les mémoires/accès à la mémoire EEPROM
2.3 Les ports d’entrée/sortie
2.4 Les interruptions
2.5 Les timers
Fonctions PICC de gestion des temporisations
Le compilateur intègre des fonctions très pratiques pour gérer les délais :
• delay_cycles (valeur) ; // temporisation en Nbre de cycles
• delay_us (valeur) ; // temporisation en µs
• delay_ms (valeur) ; // temporisation en ms
z
Exemples :
#use delay (clock=4000000) // quartz de 4 MHz
35
Les Timers
Mode compteur ou temporisateur (1)
Un timer est le nom courant de compteur / temporisateur
45
Mesurer du temps (compter le
nombre de coups d’horloge)
> Mode temporisateur
z
36
Applications du Timer
37
Fonctionnement du Timer0
Mode compteur ou temporisateur (2)
En pratique, on visualise la valeur de départ, puis la valeur d’arrivée. La valeur de comptage
est la différence des deux valeurs.
38
Utilisation d’un prédiviseur (prescaler)
39
Structure du module Timer0 du PIC (1)
z
• Un registre sur 8 bits (TMR0) qui compte les fronts montants (ou descendants) du signal
qu’on lui fournit. Arrivé à 255, il repasse à 0. Il est accessible en lecture ou en écriture de la
même façon que le PORTA ou le PORTB.
• Un prédiviseur 3 bits (prescaler) qui divise la fréquence du signal qu’on lui fournit par une
valeur constante qu’il est nécessaire de programmer.
• Des aiguillages qui permettent de définir le chemin qu’emprunte le signal d’horloge
(externe/interne, avec/sans prescaler).
• Des bits de configuration dans le registre OPTION
• Un générateur d’interruption à chaque débordement du timer
40
Structure du module Timer0 du PIC (2)
41
Structure du module Timer0 du PIC (3)
42
Configuration du Timer0
mode Timer
43
Configuration du Timer0
mode Compteur
44
// fonctions de configuration et d’utilisation du Timer0
//mode Timer
void setup_timer_0(int8 mode, int8 prescaler);
void set_timer0(int8 value);
int8 get_timer0( );
//mode Compteur
void setup_counters(int8 mode, int8 prescaler);
void set_rtcc(int8 value);
int8 get_rtcc( );
setup_timer_0 (mode)
Paramètres:
mode peut être 1 ou 2 constantes définies dans le fichier devices .h
Constantes Groupe1 : RTCC_INTERNAL, RTCC_EXT_L_TO_H, RTCC_EXT_H_TO_L
Constantes Groupe2 : RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16,
z
RTCC_DIV_32, RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256
Fonction: définit le réglage du signal d’horloge du timer.
Exemple :
setup_timer_0 (RTCC_DIV_2|RTCC_EXT_L_TO_H);
1:2 46
Forçage du Timer0 sous PICC
Instruction de forçage
Paramètres:
Value information sur 8 bits à écrire dans le registre TMR0
Fonction: Met à jour (force) la valeur en cours de comptage à value. Le compteur s’incrémente à partir
z
de cette valeur, jusqu’à 255 puis recommence à compter à partir de 0.
Exemple :
// 4 mhz clock, sans prescaler,
setup_timer_0 (T0_INTERNAL);
// Dépassement chaque 35us
set_timer0(221); // 256-(.000035/(4/4000000))
221
47
Lecture du Timer0 sous PICC
Instruction de lecture
value=get_timer0() ou value=get_rtcc()
Paramètres:
Value information sur 8 bits du contenu du registre TMR0
set_timer0(0);
fonction_a_mesurer();
dly= get_timer0(); //en us dans ce cas dly=25
48
Configuration du Timer0
Exemple 1
On souhaite générer un signal carré de période 1ms (500us haut/ 500us bas)
sur une PIN RA0
→ Comment provoquer un débordement du timer chaque 500µs ?
• Problème : Trouver la valeur du prescaler (PRS), et celle de préchargement (TMR0=N),
• Données : Fosc = 4 MHz, Tref=500us
• Calcul:
TTMR : Horloge du Timer = 4
T
TMR
z = .PRS
Fosc
On souhaite générer un signal carré sur la PIN RA0 de période 1ms (500us haut/
500us bas)
• PRS=2
• N=6
• provoquer un débordement du timer chaque 500µs qui déclenche une interruption
z
int state=0;
//instructions de configuration au niveau du main() #INT_TIMER0
//configuration et initialisation timer0 void ma_fonction()
setup_timer_0 (T0_INTERNAL|T0_DIV_2); {
set_timer0(6); state=!state;
//activation de l’interruption débordement timer0 output_bit(PIN_A0, state);
enable_interrupts(INT_TIMER0); set_timer0(6);
enable_interrupts(GLOBAL); }
50
Constants used in ENABLE/DISABLE_INTERRUPTS() are:
À chaque contact d’une butée du moteur avec le capteur inductif ➔ front descendant sur RA4
Interruption en cas de débordement du Timer0
1. Déterminer le mode du Timer0
2. Déterminer le nombre de tours du moteur ?
52
Bits de configuration
Ils permettent d’activer ou de désactiver les fonctions matérielles du PIC à chaque remise à
zéro du programme.
Les bits de configuration sont générés à partir des directives de compilation incluses dans
les fichiers de code source.
53
Directives de configuration Hardware du PIC16F84A
#FUSES
Liste et état des fusibles est une suite d’informations séparées par des virgules précisant les
fusibles à programmer et l’état de la fonction à valider ou non.
Exemple :
#fuses XT, NOWDT, PUT
Choisit un oscillateur de type horloge à quartz de fréquence inférieure OU égale 4
MHz (horloge de type XT), pas de timer chien garde (nowdt) , un timer à la mise sous
tension (put)
54