Cours 2 Temporisateur/Compteur Zéro Section 5
Interruption sur changement d’état (Interrupt On Change)
Section 3.4.3
Caractéristiques générales
Disponible sur PORTB uniquement.
Broches doivent être configurées en entrée. (TRISB + ANSELH)
Possibilité de générer des interruptions sur les changements de niveaux.
Possibilité de sélectionner l’interruption individuellement sur les broches désirées. (IOCB)
Possibilité de configurer des résistances de rappel internes « pull-up ».(WPUB + !RBPU)
Registres impliqués
Bits à configurer pour interfacer le port PORTB :
Bits à initialiser pour générer les interruptions :
Schéma de l’interruption RBIF
Page 1 sur 10
Cours 2 Temporisateur/Compteur Zéro Section 5
Schéma des broches « RB0 … RB4 » et « RB4 … RB7 »
Changement de l’état de la broche est actualisé au cycle d’horloge Q3.
Le nouvel état de la broche est actualisé à la lecture du port B.
Page 2 sur 10
Cours 2 Temporisateur/Compteur Zéro Section 5
Module du TIMER 0 « Timer / Counter 0 »
Compteur / Temporisateur à 8 bits.
Quatre registres d’impliqués :
Incrémentations du registre du TMR0 à partir de :
L’oscillateur interne « FOSC/4 » : Mode temporisateur interne.
La broche « RA4/ TOCKI /C1OUT » : Mode compteur externe.
Possède un circuit de diviseur programmable, « Pre-Scaler », de:
« Pre-Scaler » de 1:1 avec le bit « PSA » à « 1 ».
« Pre-Scaler » de 1:2 à 1:256 avec le bit « PSA » à « 0 ».
Voir les bits « OPTION_REG [2:0] ».
Diviseur programmable, partagé entre le module du TIMER0 et le module du WDT.
Peut être utilisé comme « compteur » si :
Le bit « T0CS » est initialisé à « 1 ».
La broche « RA4/T0CKI/C1OUT » doit être configurée en entrée.
Le bit « T0SE » détermine le font d’incrémentation de l’horloge externe :
Le « TMR0 » s’incrémentes sur les fronts montant appliqués à la broche « T0CKI » si le bit
« T0SE » est initialisé à « 0 ».
Le TMR0 s’incrémentes sur les fronts descendant appliqués à la broche « T0CKI » si le bit
« T0SE » est initialisé à « 1 ».
Peut être utilisé comme « temporisateur » si :
Le bit « T0CS » est initialisé à « 0 ».
La broche « RA4/T0CKI/C1OUT » n’est plus utilisée comme broche d’horloge par le « TMR0 »
et cette broche peut être récupérée comme « IO » ou comme sortie du comparateur
« C1OUT ».
Le bit T0SE n’a pas d’utilité en mode temporisateur:
TMR0 s’incrémentes sur les fronts montant de l’horloge.
Page 3 sur 10
Cours 2 Temporisateur/Compteur Zéro Section 5
Interruption du « TMR0 »:
Le « T0IF » indique que le registre du TMR0 a débordé.
Le « T0IF » monte à « 1 » lorsque la valeur du TMR0 passe de « 255 » à « 0 ».
Le « T0IF » doit être remis à « 0 » dans la routine d’interruption.
Les bits « T0IE » et « GIE » doivent être tous les deux mis à « 1 ».
Schéma interne de l’interruption T0IF
Schéma interne du « TMR0 »
Page 4 sur 10
Cours 2 Temporisateur/Compteur Zéro Section 5
Circuit « pre-scaler »
Schéma interne de la broche RA4/T0CKI/C1OUT
Page 5 sur 10
Cours 2 Temporisateur/Compteur Zéro Section 5
Exemple 1
Créer une onde carrée de 10 KHz à 50% sur la broche « RA0 » avec interruption à partir de l’oscillateur
interne de 2MHz.
Fosc = 2MHz Le « TMR0 » s’incrément de l’interne à partir de « Fosc/4 » 500KHz.
1 1
1 1 4 ∙T OSC =4 ∙0.5 µs=2 µs= = =2 µs
T OSC = = =0.5 µ s F OSC 500 KHz
F OSC 2 MHz
4
FRA0 10KHz à 50% TRA0 1/ FRA0 1 /10KHz 100µs.
50% 50µs au « Niveau haut » et 50µs au « Niveau bas ».
Pour changer l’état de RA0, combien de comptes le « TMR0 » doit il effectuer pour écouler le délai de 50µs?
50 µs
NombreDeComptes= =25 comptes
2 µs
Doit-on utiliser un « Pre-Scaler »?
Quelles sont les valeurs admissibles pour le registre du « TMR0 »?
TMR0 est un registre de 8 bits.
Valeurs acceptées sont {0 … 255}.
25 comptes à effectuer.
Pas besoin de pre-scaler.
Valeur de départ du « TMR0 » afin que celui-ci déborde après 25 comptes TMR0 = 256 – 25 = 231
Chaque fois que le TMR0 va déborder, il faut dans la sous-routine d’interruption :
Tester si c’est le bit « T0IF » qui a interrompu.
Changer l’état de RA0.
Réinitialiser le TMR0 à 231.
Remettre le « T0IF » à « 0 ».
Codes à initialiser :
« user.c » « system.c » « interrupt.c »
ANS0 = 0; //RA0 Digital OSCCON = 0x51; if (T0IF)
TRISA0 = 0; //RA0 Output {
« system.h »
PSA = 1; //Pre 1:1 RA0 =!RA0;
2000000L
T0CS = 0; //FOCS/4 TMR0 =231;
TMR0 =_231; //Initial Value « main.c » TMR0IF =0;
T0IE = 1; //Enable Timer 0 //Rien à faire
GIE = 1; //Interrupt }
INTCON = 0xA0;
Autre méthode pour calculer le nombre de comptes
La fréquence du temps haut recherchée à la broche « RA0 » est de 10KHz et la fréquence qui incrémente le
« TMR0 » est « Fosc/4 » est de 500KHz.
Page 6 sur 10
Cours 2 Temporisateur/Compteur Zéro Section 5
500 000 Hz
NombreDeComptes= =25 comptes
« user.c » 10 000 Hz « system.c »
« interrupt.c »
TRISA__ = ___; // OSCCON = 0x____;
Exemple 2 //
ANS__ = ___;
if(________)
{
Un système
TRISB__ à infrarouge
= ___; // détecte le passage des caisses de bières sur un convoyeur d’une micro-brasserie.
« system.h » RB1 = __;
TRISB__ ceux
Comme installés sur la maquette __________L
du train. Lorsqu’aucun objet n’est résent entreTMR0 le
= capteur et
= ___; //
__;
RB1 = 1; //
l’émetteur de l’infrarouge le faisceau infrarouge n’est pas coupé. Cela crée un niveau bas=sur
______ __;les broches
INTEDG = __; //
« » et « » toutes deux connectées ensemble au capteur infrarouge. Si le FIN commande
faisceau infrarouge est
RA4
T0CS = __; RB0 // « main.c »
}
T0SE = cela
coupé, __; crée//un front montant sur //
les Afficher
2 [Link] la console if(________)
PSA = __; // // les caisses actuelles
{
PS2 = __; le module du « TMR0 » du PIC16F886 pour changer l’état de « RB1 » à chaque 1000 caisses de
Configurer Caisse++;
PS1
bières produites. Une alarme visuelle//
= __; estAfficher sur la console
alors activée pour
la // fin de la commande
indiquer qu’une production
______ de 1000 caisses est
= __;
PS0 = __;
terminée et prêtre à être chargée dans un camion de livraison. Les fronts descendants sur
}
« RA4/T0CKI/C1OUT
OPTION_REG = 0x____;» incrémentent le « TMR0 » et chaque caisse est comptabilisée sur les fronts montants de
« RB0=».___;
TMR0 À chaque
// passage d’une caisse le compte cumulatif est affiché sur la console. À chaque passage
TMR0IE = __; //
d’une caisse le compte cumulatif est affiché sur la console. Utiliser un oscillateur interne de 8MHz.
INTE = __; //
GIE = __;
INTCON = 0x____;
Solution :
Exemple 3
Créer
Nombreunedefréquence de 1 Hz
comptes pour quesur
le la broche
« TMR0 « TMR0 »
» déborde à partir
______d’interruption
. et de l’oscillateur interne de 8MHz.
Pour
1000 une grande
caisses précision
nécessitent on doit éviter
_________ le nombre
impulsions d’interruptions
à l’entrée de brochecar le temps d’exécution
« RA4/T0CKI/C1OUT » dubesoin
code n’est
d’un
pas considéré»et
« _________ ainsilelaisser
sinon « TMR0le»matériel agir pour écouler le maximum de temps.
va déborder.
Pour que le « TMR0 » déborde après 1000 impulsions, il faut que le « pre-scaler » et le « TMR0 » effectue
exactement 1000 incréments. 1000 impulsions 250 x 4.
« Pre-scaler
Fosc = 8MHz » de
Le «« TMR0
____ »
» et que le « TMR0
s’incrément » déborde
de l’interne aprèsde
à partir comptes
« Fosc/4
____ » TMR0 = 256 - ____ = ____
2MHz.
Codes à initialiser : 1 1
1 1 4 ∙T OSC =4 ∙0,125 µ s=0 , 5 µ s= = =0 , 5 µ s
T OSC = = =0,125 µs FOSC MHz
F OSC 8 MHz
4
FRA0 1Hz à 50% TRA0 1/ FRB0 1 /1Hz 1s.
50% 500 000 µs au « Niveau haut » et 500 000 µs au « Niveau bas ».
Nombre de comptes à réaliser pour ce délai à partir de la demi-période:
500 000 µs
NombreDeComptes= =1 000 000 comptes
0 , 5 µs
Nombre de comptes à réaliser pour ce même délai à partir de la fréquence de la demi-période:
La fréquence du temps haut recherchée à la broche RB0 est de 2 Hz et la fréquence qui incrémente le TMR0
« Fosc/4 » est de 2M Hz.
Page 7 sur 10
Cours 2 Temporisateur/Compteur Zéro Section 5
2 000 000 Hz
NombreDeComptes= =1 000 000 comptes
2 Hz
Nombre d’interruption si aucun « Pre-Sacler » :
1000 000
NombreInterrupt= =3906 , 25interruptions
1 :1∗256
Trop souvent en interruption Besoin de « Pre-Scaler ».
Étape 1 :
Choix du plus grand « Pre-Scaler » de « 1:256 ».
1 000 000
NombreInterrupt= =15.25interruptions Moins souvent en interruption.
256∗1:256
Temps réel écoulé :
Durée=15 ∙256 ∙ ( 1 :256) ∙ 0.5 µ s=491 520 µs
Il manque :
Dur é e manquante=500 000 µs- 491 520µs ¿ 8480 µ s
Nombre de comptes restants :
8480 µs
NombreDeComptes= =16960 comptes
0.5 µs
Étape 2 :
8480 µs
Choix du second « Pre-Scaler » : Pre−Scaler= =66.25
256∙ 0.5 µs
Choix du « Pre-Scaler » de « 1 :64 » car le « Pre-Scaler » « 1∶66¼ » n’existe pas.
8480 µs
NombreInterrupt= =1.0355 interruption
256 ∙0.5 µs∙ 1: 64
Temps réel écoulé :
Durée=¿ 1 ∙ 256∙ (1 :64) ∙ 0.5 µ s=8192 µs
Il manque :
Dur é e manquante=¿ 8480µs-8192µs ¿ 288 µ s
Nombre de comptes restants :
288 µs
NombreDeComptes= =576 comptes
0.5 µs
Page 8 sur 10
Cours 2 Temporisateur/Compteur Zéro Section 5
Étape 3 :
288 µs
Choix du troisième « Pre-Sclaer » : Pre−Scaler= =2.25
256∙ 0.5 µs
Choix du « Pre-Scaler » de « 1:2 » car le « Pre-Scaler » « 1∶2¼ » n’existe pas.
288 µs
NombreInterrupt= =1.125interruption
256 ∙0.5 µs∙ 1: 2
Temps réel écoulé :
Durée=¿ 1 ∙256 ∙ (1 :2) ∙ 0.5 µ s=32 µs
Il manque encore Durée manquante=¿ 288 µs – 256 µs ¿ 32 µs
Nombre de comptes restants :
32 µs
NombreDeComptes= =64 comptes
0.5 µs
Étape 4 :
Choix du dernier « Pre-Scaler » de « 1:1 » car le « TMR0 » peut compter jusqu’à 256.
Temps réel écoulé :
Dur é e=¿ 1 ∙ ¿64) ∙ (1 :1) ∙ 0.5 µ s=32 s µ s
Dur é e manquante=¿ 32 µs -32 µs ¿ 0 µ s
Le TMR0 doit démarrer à 256 - 64 192.
Page 9 sur 10
Cours 2 Temporisateur/Compteur Zéro Section 5
Étapes séquentielles à programmer :
Étape Pre-Saler Débordements Valeur de Calculs du délai Durée écoulée
Interruptions départ du TMR0
1 1 :256 15 0 256 x 0.5µs x 1:256 491 520 µs
2 1 :64 1 0 256 x 0.5 µs x 1:64 8 192 µs
3 1 :2 1 0 256 x 0.5 µs x 1:2 256 µs
4 1 :1 1 192 64 x 0.5 µs x 1:1 32 µs
18 500 000 µs
Si à l’étape 2 on utilise encore un « Pre-Scaler » de « 1:256 » au lieu d’un « Pre-Scaler » de « 1:64 » mais que
la valeur de départ du « TMR0 » ne débute pas à 0 alors :
Nombre de comptes restants :
500 000−491520 µs 8480 µs
NombreDeComptes= = =16 960 comptes
0.5 µs 0.5 µs
Nombre de comptes du TMR0 :
16 960 comptes
=66.25 comptes
1 :256
Temps réel écoulé :
Durée=¿ 66 ∙ (1 :256) ∙ 0.5 µ s=8448 µs Le « TMR0 » doit démarrer à 256 - 66 190.
Il manque encore:
Dur é e manquante=¿ 8480 µs- 8448 µs ¿ 32 µ s
Nombre de comptes restants :
32 µs
NombreDeComptes= =64 comptes
0.5 µs
Choix du dernier « Pre-Scaler » de « 1 :1 » car le « TMR0 » peut compter jusqu’à 256.
Temps réel écoulé :
Dur é e=¿ 1 ∙ ¿64) ∙ (1:1) ∙ 0.5 µ s=32 µ s Dur é e manquante=¿ 32 µs - 32 µs ¿ 0 µ s
Le « TMR0 » doit démarrer à 256 - 64 à 192.
Étap Pre-Saler Débordements Valeur de départ Calculs du délai Durée écoulée
e Interruptions du « TMR0 »
1 1 :256 15 0 256 x 0.5 µs x 1:256 491 520 µs
2 1 :256 1 190 66 x 0.5 µs x 1:256 8 448 µs
3 1 :1 1 192 64 x 0.5 µs x 1:1 32 µs
17 500 000 µs
Cela sauve une interruption et augmente la précision car le temps d’exécution du code est négligé.
Page 10 sur 10