Projet à microcontrôleur PIC 16F84A / 16F628A / 16F88 / 16F876A

Circuit de test : clignotant à LED

 

 

Ce circuit fait clignoter une LED à une fréquence d'environ 1 Hz.

Vous me direz qu'il est superflu d'utiliser un microcontrôleur pour réaliser cette tâche.

Je vous répondrai que je suis d'accord : un multivibrateur à NE555 est bien suffisant.

Mais la simplicité du montage devrait intéresser les débutants.

On pourra aussi se servir de ce montage comme circuit de test, pour mettre en évidence la défaillance du microcontrôleur.

 

 

Schéma électrique avec un PIC 16F84A ou 16F628A ou 16F88 (18 broches) :

 

Schéma électrique avec un PIC 16F876A (28 broches) :

On veillera à utiliser les deux masses (broches 8 et 19).

 

La base de temps du microcontrôleur PIC est fixée par R2 et C3 :

f OSC1 ≈ 1/(R2.C3) ≈ 2130 Hz

f OSC2 = f OSC1 / 4 ≈ 530 Hz ou 530 cycles par seconde (en pratique : 440 Hz mesurée sur la broche OSC2)

Le microcontrôleur utilise une source d'interruption : celle du module TMR0.

Le module TMR0 (8 bits) est configuré en mode timer (avec prescaler 1:1).

L' interruption a donc lieu tous les 256 cycles, ce qui correspond à environ une demi seconde.

La routine d'interruption inverse le niveau logique de la sortie RA1 : la LED clignote donc avec une période de l'ordre de 1 seconde.

 

Le code source a été écrit en langage assembleur avec l'environnement de développement gratuit MPLAB IDE de Microchip.

Les programmes sont élémentaires : seulement 11 instructions !

 

J'utilise le compilateur mikroC de la société mikroElektronika.

Une version de démonstration est téléchargeable gratuitement (taille du code objet .hex limitée à 2 ko).

/*
Circuit de test : clignotant à LED
(C) Fabrice Sincère
Microcontrôleur PIC 16F876A
Langage C : compilateur mikroC v8.2

Bits de configuration : 0x3F73
    _RC_OSC : oscillateur RC (0.00213 MHz)
    _WDT_OFF : watchdog timer OFF
    _PWRTE_ON : power up timer ON
    _BODEN_ON : brown out detect ON
    _LVP_OFF : low voltage program OFF
*/

# define BIT_LED   F1

void interrupt()
{
     // routine d'interruption
     // 1 seule source d'interruption : TMR0 en mode timer
     // toutes les 256*1 = 256 cycles (prescaler 1:1)

    if ((INTCON.T0IE) && (INTCON.T0IF))
    {
        PORTA.BIT_LED = ~PORTA.BIT_LED;
            // on inverse le niveau logique de la sortie RA1
            // => inversion de l'état de la LED

        INTCON.T0IF = 0; //on efface le drapeau du timer TMR0
    }
}

void main()
{
     // initialisation

    OPTION_REG = 0b11011111;
        // bit 5 (T0CS) = 0 : TMR0 en mode timer
        // prescaler 1:1

    ADCON1 = 0b00000110; // la broche RA1 est configurée commme entrée/sortie numérique

    TRISA = 0b11111101;  // bit 1 du port A (RA1) = 0 : configuration en sortie (commande de la LED)

    PORTA.BIT_LED = 0 ;  // Led allumée

    INTCON = 0b10100000;
        // bit 7 (GIE) = 1 : autorisation globale des interruptions
        // bit 5 (T0IE) = 1 : autorisation de l'interruption TMR0
        // bit 2 (T0IF)= 0 : on efface le drapeau de l'interruption TMR0

    do
    {
        // on attend le débordement de TMR0 (0xFF -> 0x00)
        // ce qui génère une interruption
    } while(1);
}

 

Proteus est une suite logicielle de CAO électronique éditée par la société Labcenter Electronics.

ISIS est la composante de Proteus qui permet la création de schémas et la simulation électrique.

La grande force de ISIS est de pouvoir simuler le comportement d'un microcontrôleur (PIC, Atmel, 8051, ARM, HC11...) et de son interaction avec les composants qui l'entourent.


          simulation_proteus_isis


 

(C) Fabrice Sincère ; Révision 1.3.2