Bonjour a tous,
Je travail en se moment sur un projet.
Je veux utiliser la capture de mon PIC18f452 pour décoder un signal PPM venant d'un récepteur de modélisme.
Je procède par étape, j'essaie de faire fonctionner le timer1 avant de l'utiliser avec ma capture. J'ajouterais la capture une fois que la timer1 fonctionnera correctement.
J'essaye donc pour le moment d'utiliser le timer 1 en mode compteur (le signal venant de mon récepteur étant lent (20ms de période) je dois tenir compte des interruptions de mon timer1).
J'ai configuré l'interruption, le programme rentre bien dans l'interruption mais qu'un seule fois. Le bit "PIR1bits.TMR1IF" repasse bien a 1 après la 1ere interruption mais le programme ne va pas dans le sous programme d'interruption. Il y a un truc que je dois faire mal...
Merci de m'aider, j'ai cherché mais je ne comprends pas ce qu'il se passe.
Mon code:
Code:#include <capture.h> #include <timers.h> #define max 19 void main (void); void low_isr(void); void high_isr(void); ///** I N T E R R U P T V E C T O R S ****************************** ***********/ #pragma code high_vector=0x08 void interrupt_at_high_vector(void) { _asm goto high_isr _endasm } #pragma code low_vector=0x18 void interrupt_at_low_vector(void) { _asm goto low_isr _endasm } union { struct { unsigned Timeout:1; //flag to indicate a TMR0 timeout unsigned None:7; } Bit; unsigned char Byte; } Flags; unsigned int overflow; void main () { unsigned char configccp=0x00; unsigned int capture_result; unsigned int i; i=5; //------------------Configure interruption---------------- T1CON=0x00; T0CON=0x00; PIE1bits.TMR1IE=1; //active interruption timer 1 pour compter les overflows de la capture IPR1bits.TMR1IP=1; //priorité haute pour le timer 1 RCONbits.IPEN = 1; //enable priority levels INTCONbits.PEIE=1; OpenTimer1(T1_SOURCE_INT & T1_16BIT_RW & T1_PS_1_1 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF); //start the timer TMR1L = 0; //clear timer TMR1H = 0; //clear timer overflow=0; TRISBbits.RB0=0; TRISBbits.RB1=0; INTCONbits.GIEH = 1; //enable interrupts while (1) { if (Flags.Bit.Timeout == 1) { //timeout? Flags.Bit.Timeout = 0; //clear timeout indicor LATBbits.LATB1 = LATBbits.LATB0; //copy LED state from RB0 to RB7 } } } void low_isr(void){ if(PIR1bits.CCP1IF==1) { //interruption sur la capture PIR1bits.CCP1IF=0; } } void high_isr(void){ if(PIR1bits.TMR1IF==1) { //interruption sur le timer PIR1bits.TMR1IF=0; overflow++; TMR1H = 0; //clear timer TMR1L = 0; //clear timer Flags.Bit.Timeout = 1; //indicate timeout LATBbits.LATB0 = !LATBbits.LATB0; //toggle LED on RB0 } }
-----