Problème timer1/interruption pic18f
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Problème timer1/interruption pic18f



  1. #1
    invite00cf8b8f

    Problème timer1/interruption pic18f


    ------

    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
    		}
    }

    -----

  2. #2
    invite00cf8b8f

    Re : Problème timer1/interruption pic18f

    Je précise que j'utilise la dernière version de MPLAB avec le compilateur MCC18.
    Ma variable "overlfow" est égale 1 même après un long moment en laissant tourné le programme (en mode debug).

    J'ai pourtant réussit a faire fonctionner l’interruption sur le timer 0 mais sans utiliser les fonctions spécifique pour configurer le timer.
    Je vais essayer en configurant tout les registres en direct.

  3. #3
    invitee23b806b

    Re : Problème timer1/interruption pic18f

    Salut,

    je n'ai pas lu en détail, mais il y a déjà un truc qui cloche:
    Code:
    unsigned int overflow;
    doit être modifié en:
    Code:
    volatile unsigned int overflow;
    sinon, le compilo optimise et ne modifie pas ta variable overflow.

    @ +,

  4. #4
    invite00cf8b8f

    Re : Problème timer1/interruption pic18f

    Ok je avais essayer sa ce soir.

    Merci

  5. A voir en vidéo sur Futura
  6. #5
    invite00cf8b8f

    Re : Problème timer1/interruption pic18f

    J'ai réussi a faire fonctionner l'interruption hier.
    Le problème n'était pas la déclaration de la variable overlfow.
    Je ne sais pas trop en fait ce qu'était le problème je n'ai pas eu le temps de chercher.
    J'ai recommencé un main en mettant que du timer 1 et cela fonctionne.

    Je posterai le code si sa peux servir a quelqu'un.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/12/2010, 17h10
  2. Problème TIMER1 PIC
    Par invite3d4f2ff3 dans le forum Électronique
    Réponses: 5
    Dernier message: 27/04/2010, 17h00
  3. timer1 sur PIC, Interruption??
    Par mmarc2007 dans le forum Électronique
    Réponses: 4
    Dernier message: 05/04/2010, 21h00
  4. interruption avec timer1
    Par invite29c140ac dans le forum Électronique
    Réponses: 26
    Dernier message: 05/04/2009, 16h14
  5. interruption PIC18F
    Par invite23732d21 dans le forum Électronique
    Réponses: 12
    Dernier message: 19/05/2006, 16h17
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...