Corrigé TD4
Soit un µC contenant un ADC de 10 bits de résolution.
a- Si les tensions de référence Vref- et Vref+ sont respectivement -5 V et +5 V, cet ADC est utilisé pour effectuer
une CAN de la tension analogique de 3 V, cela entrainera dans le ou les registres donnant le résultat de conversion
une valeur décimale d'environ combien ? (307)
b- Si les tensions de référence Vref- et Vref+ sont respectivement 0 V et +5 V, cet ADC est utilisé pour effectuer
une CAN d'une tension analogique U, à calculer. Cela entrainera dans le ou les registres donnant le résultat de
conversion une valeur décimale de 614. (3 Volts)
Exercice 2
Nous disposons de 8 LEDs qui sont connectées au PORTB du µC PIC16F84 ou au PORTC du µC PIC16F876A cadencé par
un quartz de 4 MHz.
Lorsqu'on initialise le microcontrôleur, les LEDs s'allument en alternance ("Chenillard") avec un délai d’une seconde, en
utilisant une temporisation logicielle grâce à la fonction Delay_ms(), de sorte qu’une LED peut être en ON et puis en OFF.
Proposer un programme qui réalise ce "Chenillard" en utilisant une variable qui sera décalée soit à gauche soit à droite à
chaque cycle d'allumage.
/*************************************************************************
Chenille à LEDs
===============
Les 8 LEDs connectées au PORTC du PIC16f876A.
Lorsqu'on réinitialise le PIC les LEDs 1 jusqu'à 8 s'allument en alternance par décalages.
Oscillateur : 4 Mhz
*************************************************************************/
void main()
{ unsigned char J = 1 ; // ou J=128 si Décalage Droite
TRISC = 0 ; // PORTC est configure en sortie
for( ; ; ) // Boucle sans fin
{
PORTC = J ; // Envoyer J au PORTC
Delay_ms(200) ; // Pause de 200 ms
J = J << 1 ; // Décalage à Gauche J (ou >> Si Décalage Droite)
if(J == 0) J = 1 ; // Si dernière LED ==> RUN de J ==> Allume 1ère LED
// (ou J=128 si Décalage Droite)
}
}
Exercice 3
Proposer un programme qui fait clignoter une LED connectée au PORTB du PIC16F84A cadencé par un quartz de 4 MHz.
La temporisation d'environ 2,5 s sera réalisée grâce au Watchdog. Utiliser la directive #define LED …
Nous précisons que, sans pré-diviseur, le Watchdog du PIC16F84A stoppe son fonctionnement (endorme) pendant 18 ms.
1
/*************************************************************************
Clignotement de LEDs par le WDT
===================================
Faire clignoter une LED connectée au PORTB du PIC16f84A.
La temporisation d'environ 2,5 s est réalisée grâce au Watchdog.
Oscillateur : 4 Mhz
*************************************************************************/
#define LED PORTB.F0 // La LED connectée à RB0
void main()
{
TRISB = 0 ;
PORTB = 0 ;
LED = 0 ; // La LED éteinte au début
OPTION_REG = 0b00001111 ; // Assigner le pré-diviseur 1:128 au WDT
while(1) // Boucle infinie
{ LED = 1 ; // La LED s'allume
asm Sleep ; // mode Sleep, WDT endorme le PIC,
// pendant environ 2.3 s (128x18ms)
LED = 0 ; // La LED s'éteinte
asm Sleep ; // mode Sleep, WDT endorme le PIC,
// pendant environ 2.3 s (128x18ms)
}
}
Exercice 4
Génération d'un signal PWM (MLI) par le µC PIC16F876A cadencé par un quartz de 4 MHz.
Proposer un programme qui permet de changer le rapport cyclique du module PWM-1, de 0% à 100% grâce à une variable
qui s'incrémente. Le signal généré est de 5 KHz de fréquence.
Si une LED est connectée à la sortie de ce module (RC2), nous observons un changement graduel de l'illumination de cette
LED. Nous pouvons également mesurer les changements par un oscilloscope.
Remarque : Afin de visualiser les changements de l'éclairement de la LED, nous introduisons un retard de 20 ms entre chaque
cycle de changement du rapport cyclique.
Schéma du montage générant le signal PWM par le µC PIC16F876A
Donner 2 versions : une qui utilise un seul programme et l'autre utilisant un programme principal et un sous-programme
d'initialisation.
Version 1 :
/**************************************************************************************************
Cet exemple change le rapport cyclique du module PWM-1 sur la broche RC2 continuellement.
Si une LED est connectée à RC2, nous observons un changement graduel de l'illumination de cette LED.
Nous pouvons également mesurer les changements par un oscilloscope.
µC PIC16F876A
Oscillateur : XT, 4 MHz
***************************************************************************************************/
char i, k = 0 ;
void main()
{
TRISC = 0 ; // PORTC est en sortie
PORTC = 0 ; // Bits du PORTC à 0
PWM1_Init(5000) ; // Initialise le module PWM1 à 5 KHz
PWM1_Start() ; // Start du module PWM1
while (1)
{
PWM1_Set_Duty(k) ; // Changement du rapport cyclique
Delay_ms(20) ; // Ralentissement pour voir le changement sur la LED.
k++ ;
}
}
2
Version 2 :
/*************************************************************************************************
Cet exemple change le rapport cyclique du module PWM-1 sur la broche RC2 continuellement.
Si une LED est connectée à RC2, nous observons un changement graduel de l'illumination de cette LED.
Nous pouvons également mesurer les changements par un oscilloscope.
µC PIC16F876A
Oscillateur : XT, 4 MHz
**************************************************************************************************/
char i, k = 0 ;
void Initialisation()
{
TRISC = 0 ; // PORTC est en sortie
PORTC = 0 ; // Bits du PORTC à 0
PWM1_Init(5000) ; // Initialise le module PWM1 à 5 KHz
}
void main()
{
Initialisation() ; // Appel de la fonction d'Initialisation
PWM1_Start() ; // Start du module PWM1
while (1)
{
PWM1_Set_Duty(k) ; // Changement du rapport cyclique
Delay_ms(20) ; // Ralentissement pour voir le changement sur la LED.
k++ ;
}
}