bonjour a tous,
je codais mon programme, qui fonctionnait comme je le souhaitais et ce sans probleme. Depuis la tantot, il ne fonctionne plus,
et sur le temps de vous écrire, il refonctionne et ainsi de suite... Sans changer le code.
j utilise MPlab Sim
le voici :
en fait le problème vient de l'interruption compare (PIR1bits.CCP1IF), quand mon probleme survient, le programme entre directement dans le sous programme d'interruption avant meme que le reste du programme ne s'éxécute et lance le Timer 1Code:/********************************************************************* * quartz a 8Mhz => 1 instruct= Fosc/4 = 0.5µs *********************************************************************/ #include <p18f4550.h> #include <delays.h> #include <timers.h> #define synchro PORTBbits.RB7 #define synchro_TRIS TRISBbits.TRISB7 /*function prototypes */ void initialisation(void); void traite_interrupt(void); void interrupt_basse(void); char demarrage=1,synchro_previous=0; // fonction interruption #pragma code highVector=0x008 // on déclare une interruption haute void atInterrupthigh(void) { _asm GOTO traite_interrupt _endasm // on doit éxecuter le code de la fonction traite_interrupt } #pragma code // retour à la zone de code #pragma code lowVector=0x018 // on déclare une interruption basse void atInterruptlow(void) { _asm GOTO interrupt_basse _endasm // on doit éxecuter le code de la fonction interrupt_basse } #pragma code // retour à la zone de code /********************************************************************* * routine interruption du passage par zero (signal synchro) et qd Timer1 = la valeur de alpha ==> sortie=1 *********************************************************************/ #pragma interrupt traite_interrupt void traite_interrupt(void) { if(INTCONbits.RBIF) //interrup du a un changement sur RB { sortie=0; synchro_previous=synchro;//lecture obligatoire sur PORTB INTCONbits.RBIF=0; T1CONbits.TMR1ON=1; // TMR1 Activé CCPR1H=0x07; CCPR1L=0xD0; } // delai ecouler entre passage par zero et debut impulsions if(PIR1bits.CCP1IF) // l'IT provient d'une comparaison, { sortie=1; T1CONbits.TMR1ON=0; // TMR1 désactivé PIR1bits.CCP1IF=0; //efface le drapeau d'IT } } /********************************************************************* * routine interruption basse priorite *********************************************************************/ #pragma interrupt interrupt_basse void interrupt_basse(void) { } /********************************************************************* * initialisation des peripheriques *********************************************************************/ void initialisation(void){ //configure port sortie/entree TRISB=0b10000000; INTCONbits.RBIE = 1; // Enables the RB port change interrupt INTCON2bits.RBIP = 1; // RB Port Change Interrupt = High Priority INTCON2bits.RBPU = 0; // Pull Up activé sur RB T1CONbits.RD16=0; // TMR1 mode simple (pas de RW) T1CONbits.TMR1CS=0; // compte les impulsions sur internal clock T1CONbits.T1CKPS0=1; T1CONbits.T1SYNC=1; T3CONbits.T3CCP2=0; // mode comparaison entre TMR1 et CCPR1 CCP1CON=0x0B; // Trigger special event sur comparaison (RAZ TIMER1 lors de l'égalité) PIE1bits.CCP1IE=1; // active IT sur mode comparaison CCP1 IPR1bits.CCP1IP=1; // CCPR1 priorite haute T1CONbits.TMR1ON=0; // TMR1 désactivé } /********************************************************************* * programme principal *********************************************************************/ void main (void){ initialisation(); // appel du sous-prog d'initialisation Delay1KTCYx(1); // Delay in multiples of 1,000 instruction cycles. 1 instru= 0.5us RCONbits.IPEN=1; // Interruption prioritaires activées INTCONbits.GIE = 1; // On autorise toutes les interruptions INTCONbits.PEIE = 1; while(1){ } }
D'ou vient la faute?
Merci pour votre aide
-----