Bonjour,
J'essaie d'apprendre à programmer en PIC. J'utilise une platine de programme EasyPic 5, le logiciel MPlab IDE et le compilateur cc5x.
le PIC utilisé est un 16F887 cadencé à 8Mhz par un quartz.
Le but est d'utiliser l'interruption du timer0 pour faire clignoter une LED. Cependant, la LED ne clignote pas et reste toujours allumée.
Voici le code écrit, quelqu'un a une idée pour m'aider ?
Le problème vient peut être de la prédivision du timer0 que je ne maitrise pas vraiment... Le programme a été normalement écrit pour une fréquence de 4 Mhz.
Je vous remercie par avance,Code://Programme LED_pulse_3.c //Clignotement d'une LED V_3 //Utilisation interruption Timer0 //Horloge externe : 8 MHz //Timer0: taux prÈdivision 256 //Registre de configuration #define CP_off |=0b11000000110000 #define LVP_off &=0b11111101111111 #define CPD_off |=0b00000100000000 #define WRT_off |=0b00011000000000 #define DEBUG_off |=0b00100000000000 #pragma config FOSC=XT, WDTE=off, PWRTE=on, CP_off #pragma config LVP_off, CPD_off, WRT_off, DEBUG_off #pragma interruptSaveCheck n //prototypes des fonctions void it_Timer0(void); //dÈclaration des variables char n; /*******************************/ //fonction d'interruption /*******************************/ #pragma origin 4 interrupt itMain(void) { if(T0IF) { it_Timer0(); //gestion interruption Timer0 } } /*******************************/ //fonction principale /*******************************/ void main(void) { //DÈclaration des interruptions INTCON = 0x00; PIE1 = 0x00; PIE2 = 0x00; //Configuration des ports TRISA = 0xFF; //port A en entrÈe TRISB = 0b11111110; //port B en entrÈe sauf RB0 en sortie TRISC = 0xFF; //port C en entrÈe //Configuration du Timer0 T0CS = 0; //Horloge d'instruction PSA = 0; PS0 = 1; PS1 = 1; //taux de prÈdivision 256 PS2 = 1; T0IF = 0; //Flag interruption Timer0 ‡ 0 T0IE = 1; //Interruption Timer0 activÈe //Initialisation des variables n = 0; TMR0 = 0xFF; PEIE = 1; GIE = 1; while(1) nop(); //rien ‡ faire } /*******************************/ //gestion dÈbordement du Timer0 //temporisation de 0.5s /*******************************/ void it_Timer0 (void) { T0IE = 0; //dÈsactiver l'interruption Timer0 T0IF = 0; //dÈsarmer le flag n++; //mise ‡ jour post-diviseur logiciel TMR0 = 256 - 244; if(n==8) { n = 0; if (PORTB.0==0) { PORTB.0=1; } else PORTB.0=0; } T0IE = 1; //activer l'interruption Timer0 }
Jc !
-----