timer1 sur PIC, Interruption??
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

timer1 sur PIC, Interruption??



  1. #1
    mmarc2007

    timer1 sur PIC, Interruption??


    ------

    Bonjour!

    Alors voila, je cherche à configurer les timers 0 et 1 d'un PIC.

    Pour simplifier la chose, disons que j'ai un signal d'entrée qui génère des impulsions. Le but c'est de calculer le temps des impulsions reçues par le PIC et de les régénérer en sortie.

    Pour les générer j'utilise Timer0 et ça fonctionne très bien!
    Exemple :

    Code:
    /*inclusions*/
    #include <stdio.h>
    #include <htc.h>
    
    
    static void interrupt inter();	// Fonction d'interruption
    
    
    void main( void)
    {
    
    	GIE=1;
    	PEIE=1;					// Autorise les interruptions 
    	OPTION=0b11000110;		// Configure tmr0 pour 128µs par bit en mode timer
    
    	//configuration de B
    	TRISB = 0b10000000;
    	RB4=0;					// RB4 à l'état 0
    	TMR0=0;					// Confiqure la valeur de départ du registre TMR0
     	T0IE=1;					// Active l'interruption de débordement du registre TMR
    		
    	/* boucle principale */
    	
    	while(1)	
    	{
    		//rien a faire...
    	}
    
    }
    
    
    
    /* Fonction d'interruption */
     static void interrupt inter(){
    
    	/*TIMER 0 */
    
    	if(T0IF)//1 si débordement
    		{
    		RB4=!RB4;	//on inverse RB4
    		}
    
    	T0IF=0;	// Mise à 0 du Bit	
    	}
    
    }
    Avec ce code je génère un signal carré de fréquence 1/(2 * 255 * 128us)

    Maintenant je cherche à compter la durer de mon signal en entrée!

    Je compte utiliser le timer 1, je pense avoir compris la configuration de T1CON mais comment déclencher l'interruption au changement d'état de mon entrée si par exemple j'utiliser RB0 comme signal d'entrée?

    Voila ma configuration :

    Code:
    	T1CON=0b00111001;
    	//bits 7-6 inutilisés
    	//bits 5-4 : prescaler
    	//bit 3 : 1=oscillateur enabled
    	//bit 2 : 0=ocillateur synchrone
    	//bit 1 : 0=oscillateur interne
    	//bit 0 : 1=mise ne service du comptage
    	
    [...]
    
    static void interrupt inter(){
    
    	if (TMR1IF){
    
    		//on recupere la durée de TMR1L et on la recopie sur la sortie
    		TMR0=255-TMR1L;//On néglige TMR1H car la durée ne peut pas dépasser 255 * prescaler
    	}
    
    }
    merci de votre aide!

    -----

  2. #2
    Antoane
    Responsable technique

    Re : timer1 sur PIC, Interruption??

    Bonjour,
    il te faut utiliser l'interruption sur INT/RB0, qui se déclenche sur un front de RB0.
    En savoir un peu plus que la "simplification" nous aiderai beaucoup : pourquoi ne pas utiliser un seul timer ? pourquoi utiliser un Timer ? quel interêt d'utiliser un µC pour faire ça ? .....
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  3. #3
    mmarc2007

    Re : timer1 sur PIC, Interruption??

    Citation Envoyé par Antoane Voir le message
    Bonjour,
    il te faut utiliser l'interruption sur INT/RB0, qui se déclenche sur un front de RB0.
    En savoir un peu plus que la "simplification" nous aiderai beaucoup : pourquoi ne pas utiliser un seul timer ? pourquoi utiliser un Timer ? quel interêt d'utiliser un µC pour faire ça ? .....

    Slt,

    En fait mon but c'est de faire un interfaçage entre un récepteur de modélisme et un servomoteur dans le but de "modifier" à la volée des informations d'angle.

    En gros la télécommande envoie un angle et le module pourra ajuster l'angle en fonction de paramètre plus complexes.

    Idée:

    TMR0 va me permettre de générer des signaux en sortie pendant que le TMR1 compte le temps haut du signal d'entrée. TMR1 se déclenche sur front montant de RB0 et s'arrête sur RB0 descendant. C'est possible ça?

    J'avais pensé utiliser un seul Timer et de faire les action par ordre cyclique : On "compte" le temps haut du signal d'entrée, on ajuste ce temps T et on l'injecte dans le servomoteur en utilisant le même timer. Le problème c'est que le signal ne sera pas complètement émis, qu'un nouveau signal va déclencher l'interruption sur RB0. Si on ignore les interruptions tant que le signal n'est pas complètement émis, on perd une information sur 2...

    Quoi qu'il en soit comment puis-je activer une interruption sur RB0 de façon à déclencher et à arrêter le timer1?

    Merci de ton aide.

  4. #4
    invite7a49d0d5

    Cool Re : timer1 sur PIC, Interruption??

    Hi,

    suis ce fil en cours...
    http://forums.futura-sciences.com/el...timer-1-a.html
    tu peux y trouver de l'inspiration...
    (dans le Message #8 par exemple)

    vede
    ;O]
    ___________________________
    ...

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

    Re : timer1 sur PIC, Interruption??

    Re,

    J'ai trouvé des bonnes infos sur les interruptions à cette adresse : interrupt.htm.

    En gros pour résumer, d'un coté j'attends l'interruption de RB0 sur front montant. Lorsque elle est détectée, je "déclenche" le timer1 et j'active l'interruption sur front descendant. Lorsque la 2ème interruption est détectée, je stock la valeur de Timer1 dans une variable (S1).

    D'un autre coté j'attends l'interruption du timer0 pour générer mon créneau de durée à l'état haut = S1 et de durée à l'état bas = 20ms -S1. (20ms étant la durée d'un cycle).

    Ca fonctionne plutôt pas mal, mais par moment le servomoteur "déraille"... Je pense que c'est lorsqu'il y a plusieurs interruptions en même temps...

    Voila mon programme si quelqu'un voit quelque chose qui cloche?

    Déclarations des interruptions
    Code:
    	GIE=1;					// Autorise les interruptions de maniere globale
    	PEIE=1; 
    	OPTION=0b11000110;		// Configure tmr0 pour 128µs par bit en mode timer
    	INTE = 1;				// active l'interruption de RB0 (registre OPTION)
    	INTEDG = 1;				// Interruption front montant sur RB0 (registre OPTION)
     	T0IE=1;					// Active l'interruption de débordement du registre TMR
    
    	//timer 1
    	//bits 5-4 : prescaler
    	//bit 3 : 1=oscillateur enabled
    	//bit 2 : 0=ocillateur synchrone
    	//bit 1 : 0=oscillateur interne
    	//bit 0 : 1=mise en service du comptage
    	T1CON=0b00111001;
    
    
    	/* GESTION DES PORTS */
    
    	//B en sortie
    	TRISB = 0b00000001;		// Uniquement RB0 en entrée
    	TRISA = 0;
    	RB4=0;					// RB4 à l'état 0
    	RB5=1;					// voyant de fonctionnement
    	TMR0=0;					// compteur à 0
    Fonction d'interruption
    Code:
     static void interrupt inter(){
    
    	/*TIMER 0 */
    
    	//permet de générer un signal de sortie
    	if(T0IF)//1 si debordement de timer0
    	{
    		
    		//on prepare un signal haut
    		if(etat==1){
    			etat=0;
    			RB4=1;
    			//prescaler sur 8us
    			PS2=0;PS1=1;PS0=0;
    
    			//signal à l'etat haut
    			countTH=S1;		//on initialise countTH avec la valeur du timer1
    			TMR0=255-countTH;
    		}
    	
    		//signal bas
    		else{
    			etat=1;
    			RB4=0;
    			//prescaler 128us
    			PS2=1;PS1=1;PS0=0;
    
    			//signal à l'etat bas : 20ms - temps à l'etat haut
    			TMR0=255-(156-countTH/16);
    		}
    	
    		T0IF=0;	// Mise à 0 du Bit	
    	}
    
    
    	/* TIMER 1 */
    
    	if (TMR1IF){//1 si débordement de timer1	
    		TMR1IF=0;
    	}
    
    
    	/* Interruption RB0 */
    
    	if(INTF){
    
    		//detection d'une impulsion sur RB0 (front montant)
    		if(INTEDG){
    		
    			//on déclenche le timer1
    			TMR1L=0;
    			TMR1H=0;
    	
    			//prochaine interruption sur front descendant
    			INTEDG=0;
    		}
    
    		//detection sur front descendant
    		else {
    
    			//on recupere la valeur du timer1 (8bits à droite) si la valeur est correcte
    			if(TMR1L>60 && TMR1H==0) S1=TMR1L;
    
    			//prochaine interruption en front montant
    			INTEDG=1;
    		}
    
    		INTF=0;//reinitialisation de l'interruption
    	}
    }
    Pensez-vous que je gère bien les intérruptions? Que se passe t-il si plusieurs se passent en même temps?

    Merci de votre aide!

Discussions similaires

  1. comparateur et interruption sur pic 16F
    Par alainav1 dans le forum Électronique
    Réponses: 4
    Dernier message: 21/03/2010, 17h54
  2. interruption sur pic
    Par alainav1 dans le forum Électronique
    Réponses: 4
    Dernier message: 02/08/2009, 20h13
  3. interruption sur pic 18f452
    Par mp3dux dans le forum Électronique
    Réponses: 52
    Dernier message: 18/05/2009, 11h49
  4. interruption avec timer1
    Par invite29c140ac dans le forum Électronique
    Réponses: 26
    Dernier message: 05/04/2009, 16h14
  5. PB de timer1 sur pic
    Par romelec dans le forum Électronique
    Réponses: 3
    Dernier message: 01/03/2004, 13h11
Découvrez nos comparatifs produits sur l'informatique et les technologies.