Bonjour,
J'utilise un 18F14K50 programmé sous C18.
Il est cadencé à 12MHz et je souhaite utiliser le Timer0 en interruption toutes les 50µs.
Voici mon code :
J'ai rencontré deux problèmes :Code://Include #include <p18F14K50.h> #define USE_AND_MASK #include <timers.h> #include <main_header.h> //Configuration des fusibles //Prototypes void high_isr (void); void InterruptTimer0(void); //Define #define MoteurGauche LATCbits.LATC4 void main () { TRISC =0x00; //portC en sorties OpenTimer0( TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_1); //timer0 en interruption toutes les 50µs WriteTimer0(106); //8^2- [50E-6/(4*1/12E6)] INTCONbits.TMR0IF = 0; //flag timer0 INTCONbits.GIE = 1; //enable global interrupt while (1) { } //while }//main //******************************************************************************************************************************************** //Gestion des interruptions //Lors d'un interruption haute priorité, rediriger vers "high_isr" (l'adresse pour les basse priorité est 0x18) #pragma code high_vector=0x08 void interrupt_at_high_vector(void) { _asm GOTO high_isr _endasm } #pragma code /* return to the default code section */ // Fonction des interruptions hautes #pragma interrupt high_isr void high_isr (void) { if (INTCONbits.TMR0IF == 1) //Si interruption venant du timer0 { WriteTimer0(186); INTCONbits.TMR0IF = 0; InterruptTimer0(); } } void InterruptTimer0(void) { /* code gérant mes E/S */ }
- théoriquement pour avoir (environ) 50µs je dois écrire 106 dans le registre du timer car : 256 - 50E-6 / (4*1/12E6) = 106. Sauf que dès que je teste, la valeur doit être d'environ 186;
- si je rempli la fonction "InterruptTimer0()" alors dans ce cas l'interruption ne se fait plus du tout à 50µs et je dois à nouveau changer la valeur dans le registre du timer pour atteindre à nouveau le temps désiré ...
J'ai du mal à comprendre comment ça se fait... J'ai l'impression que le timer arrête de compter dès que l'interruption s'est produite.
Merci par avance.
-----