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.
(C) Fabrice Sincère ; Révision 1.3.2