Programmation Des Microcontrôleurs en Langage C: Ports E/S Et Temporisateur TMR0 Du PIC16F87x. N
Programmation Des Microcontrôleurs en Langage C: Ports E/S Et Temporisateur TMR0 Du PIC16F87x. N
Programmation Des Microcontrôleurs en Langage C: Ports E/S Et Temporisateur TMR0 Du PIC16F87x. N
Exercice 4 :
TD 2. Le microcontrôleur PIC 16F87x, en particulier, possède trois temporisateurs : Timer 0 (8
bits), Timer 1 (16 bits) et Timer 2 (8 bits). Le schéma bloc suivant montre la structure
Programmation des microcontrôleurs en langage C : interne du temporisateur Timer0 :
Ports E/S et Temporisateur TMR0 du PIC16F87x.
Timer 0 N
Mux
8
Mux
Exercice 1 :
tcy 0
T0CKI 1
Proposer une procédure, en langage machine et en langage C, de configuration des ports (RA4) 1 Sync TMR0
A et B dans le cas suivant : Prédiviseur 0 2 x tcy
• PortA : lignes RA0 à RA3 en sorties ; (Compteur)
÷D
• PortB : ligne RB0 à RB3 en entrées, et RB4 à RB7 en sorties.
Exercice 2 : Microcontrôleur
Reg. OPTION T0SE T0CS PS2, PS1, PS0 PSA Reg. INTCON T0IF
On se propose d'utiliser un microcontrôleur (PIC16F877A par
RB0
exemple) pour contrôler un témoin L (LED) par l'intermédiaire d'un
commutateur K à deux positions : Le TMR0 est un registre compteur qui peut être chargé par la valeur initiale N (0 à 255).
K
La source de l'horloge peut être interne (tcy = 4/Fq) ou externe sur la broche T0CKI (ligne
2.1. Lire l'état d'un commutateur K à deux positions et
RA4 du port A). Le contrôle du Timer 0 se fait grâce au registre OPTION :
indiquer cet état sur une LED : LED allumée lorsque K est RB1
fermé ; • T0CS : sélection de la source de l'horloge interne ou externe sur TOCKI;
L
• T0SE : choix du front actif si l'horloge est externe ;
2.2. Faire clignoter la LED si le commutateur K est fermé ;
• PSA : utilisation ou non de prédiviseur ;
• PS2..PS0 : sélection du facteur de prédivision D.
Exercice 3 : RB0 AFF Une fois chargé par la valeur initiale N, le Timer 0 s'incrémente au rythme de l'horloge
On se propose d'utiliser un microcontrôleur (PIC16F877A a
RB1 a jusqu'à la valeur finale 255, puis redémarre à 0 ou à partir de la valeur initiale N. Le
Microcontrôleur
Solutions proposées :
La configuration du Timer0 se fait grâce au registre OPTION :
Exercice 1 :
Langage machine:
PORTA
Source de BCF STATUS, RP1
l'horloge : RA2
CLRF TRISA ; RA0 … RA3 en Sorties RA3
Affectation du
prédiviseur : BCF STATUS, RP0 ; Accès POTRA dans Bank 0
CLRF PORTA ; RAZ registre de donnée
Facteur de
Prédivision :
Langage C :
…
…
BSF STATUS, RP0 ; Accès TRISB dans Bank 1
Par l'utilisation du temporisateur TMR0 :
PORTB
BCF STATUS, RP1 RB3
montrer comment on peut obtenir la période demandée ; RB4
MOVLW 0X0F ; W = 0F = 0000 1111 ,
donner la configuration du registre OPTION correspondante ;
…
MOVWF TRISB ; RB0…RB3 en Entrées , RB4…RB7 en Sorties
écrire en langage C, le programme qui réalise cette tâche. RB7
BCF STATUS, RP0 ; Accès POTRB dans Bank 0
CLRF PORTB ; RAZ registre de données du portB
4.2. Génération de longues durées : pour des valeurs importantes de durées de
temps, on peut utiliser le Timer 1 qui utilise un décompteur 16 bits, ou
simplement utiliser le Timer 0 auquel on associe un compteur de dépassements.
Langage C :
Ce compteur s'incrémente à chaque débordement du Timer 0.
Init_PortB() // configuration et initialisation
Dans ce cas, donner l'expression générale de la durée de temps T et calculer sa
{
valeur maximale Tmax. TRISB = 0x0F; // RB0…RB3 en Entrées , RB4…RB7 en Sorties
PORTB = 0x00; // RAZ registre de données du portB
}
Exercice 2 : Exercice 3 :
Exercice 4 :
4.2.
4.1. La période du signal est de 40ms et son rapport cyclique est 50% : il suffit de On désigne par COMPT le compteur de dépassements du TMR0. COMPT est une
générer , grâce au TIMER 0, une durée de 20ms qui est équivalente à une demi variable 8 bits (Modulo 256).
période. Expression générale de la temporisation T : T = (256 – N) x COMPT x D x tcy (+ 2xtcy).
• Le TMR0 peut réaliser une temporisation maximale Tmax : Avec cette solution, on peut réaliser donc une temporisation maximale :
Tmax = (256 – 0) x 256 x 1µs = 65,536 ms
Tmax > T = 20 ms: on détermine le facteur de division D et la valeur initiale N. Tmax = (256 – 0) x 256 x 255 x tcy (+ 2xtcy) = 16,712 s; (tcy = 1µs)
Annexes : for(;;)
{
A.1. Version complète de l'exercice 4.1. : TEMPO(); // Temporisation
NOP(); // Ne fait rien
//-------------------------------------- RB7 = ~RB7; // inverse l'état de RB7
// Exercice 4.1: Temporisation avec TMR0 }
//-------------------------------------- } // fin
#include <pic.h>
#define N 100 // Valeur initiale (100 ou 99) dans TMR0
//-------------- A.2. Version de test de l'exercice 4.2. :
void Init_TMR0() // Initialisation du Timer 0 //---------------------------------------------------
{ // Exercice 4.2: Test TMR0 + Compteur de dépassements
// Config Tmr0 par reg. OPTION: //---------------------------------------------------
// -------------------------------------- #include <pic.h>
// |RBPU|INEDG|TOCS|T0SE|PSA|PS2|PS1|PS0| #define N 200
// -------------------------------------- char COMPT;
PS0 = 0; //--------------------------------------
PS1 = 1; // PS2..PS0 = 110: D = 128 void init()
PS2 = 1; {
PSA = 0; // PSA = 0: affecte prédiv. au TMR0 OPTION = 0x08; // D = 1 pour test
T0SE = 0; // Non utilisé (0) T0IF = 0;
T0CS = 0; // T0CS = 0: Source interne de l'horloge }
INTEDG = 0; // Non utilisé (0) //--------------------------------------
RBPU = 0; // Non utilisé (0) void TEMPO()
// {
// ou OPTION = 0b00000110 ou OPTION = 0x06; COMPT = 0;
// TMR0 = N;
T0IF = 0; // RAZ drapeau dépassement (Reg. INTCON) while(COMPT < 0x05) // 0x05 pour test
} {
//---------------- Initialisation du port B if(T0IF)
void Init_PortB() {
{ ++COMPT;
TRISB = 0x7F; // RB7 en sortie (les autres en entrées) T0IF = 0;
} TMR0 = N;
//--------------- Fonction temporisation }
void TEMPO() }
{ }
TMR0 = N; // Recharge valeur initiale dans TMR0 //--------------------------------------
T0IF = 0; // RAZ dépassement void main()
while (T0IF == 0); // ou while (!T0IF) {
} init(); // initialisation
//--------------- Fonction Principale for(;;)
void main() {
{ NOP();
Init_TMR0(); // initialisation TMR0 TEMPO();
Init_PortB(); // initialisation Port B NOP();
RB7 = 0; // RAZ ligne RB7 }
// } // Fin
ou, pour une durée plus longue: Anti-rebonds matériel: circuit RC , Bascule, …
...
delay(n) : n désigne le nombre de cycles machine.
if(!BP)
Exemple : delay(10) produit une temporisation de 20µs si tcy = 2µs, { // BP appuyé ?
for(i = 0 ; i < Tt; i++) ; // Tempo. Anti-rebonds
delay_us(n) : n désigne le nombre de µs. COMPT++; // incrémente compteur
Exemple : delay_us(20) produit une temporisation de 20µs, }
if (COMPT > 9) COMPT = 0; // RAZ compteur si > 9
delay_ms(n) : n désigne le nombre de ms. ...
Exemple : delay_ms(20) produit une temporisation de 20ms,
+V
1 Bouton au repos
Bouton appuyé:
2
BP état transitoire
Bouton appuyé:
3
état stable
1 2 3