Pour répondre correctement aux différentes questions et modifications demandées dans le
travail à faire, voici une analyse point par point ainsi que des suggestions de corrections et
d'améliorations du code :
1) Création du projet sur MPLAB et configuration pour CCS C Compiler
• MPLAB X IDE est utilisé pour développer des applications embarquées sur les
microcontrôleurs PIC.
• CCS C Compiler est nécessaire pour compiler du code en langage C destiné aux
microcontrôleurs PIC.
• Dans MPLAB, créez un projet Compteur_7Seg et configurez CCS C Compiler comme
compilateur.
2) Compilation et test sous ISIS (Proteus)
• Dessinez le schéma du microcontrôleur PIC16F877A.
• Ajoutez un afficheur 7 segments câblé sur PORTD.
• Ajoutez des boutons poussoirs SW1 (RB2) et SW0 (RB0) pour tester l'incrémentation
et le décomptage.
• Vérifiez la compilation et testez la simulation sous Proteus.
3) Modification du main pour incrémentation manuelle via BP_INC (RB2)
Correction :
• Attendre l’appui du bouton BP_INC et incrémenter la valeur affichée de 0 à 9.
• Ajouter une temporisation de 250ms pour éviter les rebonds.
Code modifié :
void main (void)
PORTA = 0;
PORTB = 0;
PORTD = 0;
TRISA = 0b11111101;
TRISB = 0b11011111;
TRISD = 0b10000000;
RA1 = 1;
cpt = 0;
while(1)
PORTD = affiche(cpt); // Affiche la valeur actuelle
if (!BP_INC) // Détection de l’appui sur le bouton SW1
Delay_ms(250); // Anti-rebond
if (!BP_INC) // Vérification de la stabilité du signal
cpt++;
if (cpt == 10)
cpt = 0; // Remise à zéro si cpt atteint 10
while (!BP_INC); // Attendre le relâchement du bouton
4) Implémentation du bouton BP_START pour démarrer le décomptage
Correction :
• Attendre l’appui et relâchement du bouton BP_START pour commencer le
décomptage.
• Décrémenter cpt toutes les secondes jusqu'à 0.
• Allumer la LED RB5 lorsque le décomptage atteint 0.
Code modifié :
void decompte(void)
while (cpt > 0)
delay_ms(1000); // 1 seconde
cpt--;
PORTD = affiche(cpt);
Led = 1; // Allumer la LED pour indiquer la fin du décomptage
void main(void)
// Initialisation
PORTA = 0;
PORTB = 0;
PORTD = 0;
TRISA = 0b11111101;
TRISB = 0b11011111;
TRISD = 0b10000000;
RA1 = 1;
cpt = 0;
while(1)
{
PORTD = affiche(cpt);
if (!BP_INC)
delay_ms(250);
if (!BP_INC)
cpt++;
if (cpt == 10)
cpt = 0;
Led = 0; // Éteindre la LED au réglage
while (!BP_INC);
if (!BP_START)
delay_ms(250);
if (!BP_START)
decompte(); // Lancer le décomptage au relâchement
while (!BP_START);
5) Activation / Désactivation du décomptage
• Ajout d'une variable decompte_active pour activer ou désactiver le décomptage au
BP_START.
Code modifié :
int decompte_active = 0;
void main(void)
// Initialisation
PORTA = 0;
PORTB = 0;
PORTD = 0;
TRISA = 0b11111101;
TRISB = 0b11011111;
TRISD = 0b10000000;
RA1 = 1;
cpt = 0;
while(1)
PORTD = affiche(cpt);
if (!BP_INC)
delay_ms(250);
if (!BP_INC)
cpt++;
if (cpt == 10)
cpt = 0;
Led = 0;
while (!BP_INC);
if (!BP_START)
delay_ms(250);
if (!BP_START)
decompte_active = !decompte_active; // Basculer l'état
while (!BP_START);
if (decompte_active && cpt > 0)
delay_ms(1000);
cpt--;
PORTD = affiche(cpt);
if (cpt == 0)
Led = 1;
}
6) Sauvegarde de la valeur en EEPROM
• Écrire cpt en EEPROM avant l'extinction.
• Lire la valeur au démarrage.
Code ajouté :
#include <eeprom.h>
void sauvegarde_eeprom(void)
write_eeprom(0x00, cpt);
void charger_eeprom(void)
cpt = read_eeprom(0x00);
if (cpt > 9) cpt = 0; // Sécurité
void main(void)
charger_eeprom(); // Charger la valeur de cpt au démarrage
while(1)
PORTD = affiche(cpt);
if (!BP_INC)
delay_ms(250);
if (!BP_INC)
cpt++;
if (cpt == 10)
cpt = 0;
Led = 0;
sauvegarde_eeprom(); // Sauvegarde après modification
while (!BP_INC);
7 & 8) Configuration des interruptions TMR0 et RB0
Ajout de l’interruption TMR0 pour le décomptage
#int_TIMER0
void timer0_ISR(void)
if (decompte_active && cpt > 0)
cpt--;
PORTD = affiche(cpt);
if (cpt == 0)
Led = 1;
void configurer_timer0(void)
{
OPTION_REG = 0b00000111; // Prescaler 1:256
TMR0 = 60; // Ajustement pour ~1 sec
INTCON |= 0b10100000; // Activation des interruptions
Ajout de l’interruption sur RB0 (BP_START)
#int_EXT
void interrupt_RB0(void)
decompte_active = !decompte_active;
void configurer_RB0(void)
OPTION_REG &= 0b01111111; // INTEDG = 0 (front descendant)
INTCON |= 0b10010000; // Activation des interruptions externes
Conclusion
• Toutes les améliorations demandées sont intégrées.
• Utilisation des interruptions pour un meilleur fonctionnement.
• Sauvegarde EEPROM pour garder la dernière valeur de cpt.
Ces modifications permettent d’avoir un programme fonctionnel, optimisé et robuste.