[PIC C18] desactiver interruptions Int0 Int1 Int2
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

[PIC C18] desactiver interruptions Int0 Int1 Int2



  1. #1
    Bouteille51

    [PIC C18] desactiver interruptions Int0 Int1 Int2


    ------

    Bonjour,

    Je ne sais pas vraiment ou poster ceci car cela concerne la programmation des pics en C et je n'ai pas vraiment trouvé de categorie specialisée... J'espere ne pas trop etre au mauvais endroit...

    Bref, mon probleme concerne les interruptions Int0 Int1 et Int2 generées par un front descendant sur les pins RB5 RB6 RB7... bref des boutons poussoir quoi
    J'arrive bien à activer ces interruptions, à effectuer un traitement associé dans la fonction d'interruption en verifiant quel flag est concerné, a reactiver le flag etc...

    Mon probleme a surgi quand j'ai essayé de ne pas prendre en compte les rebonds de ces fameux boutons...

    Tout d'abord ma methode etait erronée, je voulais lors d'un front desendant (un appui sur le bouton) faire mon traitement, puis desactiver le bouton pendant une seconde (ou a peu pres). Je me suis apercu que cela n'empecherait pas les rebonds lorsqu'on lache le bouton si on le laisse appuyé plus d'une seconde.

    Je sais desormais comment faire (attendre quelques millisecondes puis reverifier l'etat du bouton). Mais j'ai quand meme voulu developper cette premiere methode (on va dire "pour la science" ou "pour le challenge"), ca peut toujours servir pour interdire l'utilisation d'un bouton pendant un certain temps.

    Voici quelques bouts de mon code qui concernent cette partie.

    Dans le main :
    Code:
    	// port B pins 0,1 and 2 as input (Int interrupts on button pressed)
    	TRISB=0; 			// port B is output
    	TRISBbits.TRISB0=1;	// except for
    	TRISBbits.TRISB1=1;	// the 3 pins
    	TRISBbits.TRISB2=1;	// connected to buttons
    
    
    	// Timer3 configuration (The one used to re-enable buttons)
    	T3CONbits.TMR3ON=1;			// Timer3 enabling
    	T3CONbits.TMR3CS=0;			// Timer3 will use internal clock
    	//T3CONbits.T3SYNC=0;		// Timer3 has output clock synchronized (useless here we use internal clock)
    	T3CONbits.T3CKPS0=0;		// Value of
    	T3CONbits.T3CKPS1=0;		// prescaler (1:1 to 1:8)
    
    
    	PIR2bits.TMR3IF=0;		// Set the Timer3 overflow flag to false
    	PIE2bits.TMR3IE=0;		// Keep DISABLED interrupt on overflow for Timer3
    							// (it will be enabled when a button is pressed, see Int0 Int1 Int2 interruption)
    
    
    	// Configure and enable interrupts associated to Int0, Int1, Int2
    	INTCON2bits.INTEDG0=0;	// Set the interrupt trigger on the rising edge of signal for Int0
    	INTCON2bits.INTEDG1=0;	// Same for Int1
    	INTCON2bits.INTEDG2=0;	// Same for Int2
    
    	INTCONbits.INT0IE=1;	// Enable interrupt on Int0 pin
    	INTCON3bits.INT1IE=1;	// Enable interrupt on Int0 pin
    	INTCON3bits.INT2IE=1;	// Enable interrupt on Int0 pin
    
    
    	// Allowing all interrupts (no priority : see IPEN)
    	INTCONbits.GIE = 1;
    	INTCONbits.PEIE = 1;
    Fonction exterieure (appelée dans l'interruption) :
    Code:
    // This function is called each time a button is pressed
    // It will disable interrupts on buttons for a period defined by timer 3 and delayCounter
    // This avoids too fast repetition of the function associated to this button if its kept pressed
    // This function enable timer 3 that will re-enable the buttons after the delay
    void buttonsDisabledPeriod()
    {
    
    		// Used as a physic external control
    		LATCbits.LATC0 = !LATCbits.LATC0;
    
    	// Disable interrupts on Int0 Int1 Int2
    	INTCONbits.INT0IE=0;
    	INTCON3bits.INT1IE=0;
    	INTCON3bits.INT2IE=0;
    
    	// Set Timer3 counter to 0
    	WriteTimer3(0);
    
    	// Enable Interrupts for Timer3 (it will re-enable interrupts on buttons after a short period 
    	// to avoid high repetition when the button is kept pressed)
    	PIE2bits.TMR3IE=1;
    
    }
    Dans la fonction d'interruption :
    Code:
    	// If button connected to Int2 pin was pushed
    	if(INTCON3bits.INT2IF)
    	{
    		// The current program is changed (previous one)
    		currentProg=(currentProg-1)%(PROG_NB+1);
    		currentProgName=progNames[currentProg];
    
    		// Disable buttons for a period defined by timer 3 and delayCounter
    		buttonsDisabledPeriod();
    
    		// Reset the interrupt flag
    		INTCON3bits.INT2IF=0;
    	}
    
    	// If timer 3 interrupted
    	// This timer wil re-enable interruptions on buttons (Int0 Int1 Int2)
    	else if(PIR2bits.TMR3IF)
    	{
    		LATCbits.LATC3 = !LATCbits.LATC3;
    		// Waiting that the delay variable is 0 (in order to have a reasonable delay of about a second)
    		if(!--delayCounter)
    		{
    
    			// Re-enable interrupts on Int0 Int1 Int2
    			INTCONbits.INT0IE=1;
    			INTCON3bits.INT1IE=1;
    			INTCON3bits.INT2IE=1;
    
    			// Disable the timer 3 interrupt (will be enabled when a button is pressed)
    			PIE2bits.TMR3IE=0;
    			delayCounter=DELAY_COUNT;
    		}
    
    		// Reset the interrupt flag
    		PIR2bits.TMR3IF=0;
    	}
    Vous l'avez compris delayCounter est une variable globale initialisée a une certaine valeur pour temporiser a chaque entrée dans l'interruption associee a Timer3...

    Je ne montre que le "if" associé au bouton sur Int2 mais c'est bien sur pareil pour les deux autres.


    Voila donc le principe, lorsqu'on presse un bouton, on appelle la fonction buttonsDisabledPeriod() qui va desactiver les interruption sur les boutons et lancer le Timer3 apres l'avoir reinitialisé a 0.

    Lorsque le Timer 3 a suffisament compté (delayCounter) il va reactiver les interruptions sur les boutons et se désactiver lui même.

    Tout fonctionne sauf... la desactivation des boutons dans la fonction buttonsDisabledPeriod()... Ces trois lignes de code semblent ne pas affecter les interruptions sur les boutons car je peux toujours appuyer sur les boutons et observer grace a ma led sur RC0 que je rentre bien ENCORE dans la fonction buttonsDisabledPeriod()... Donc les interruptions sur les boutons ne sont en fait pas desactivées...

    Je pensais qu'on ne pouvait pas desactiver les interruptions dans la fonction d'interruption (je ne sais pas vraiment pourquoi mais peut etre qu'elles sont reactivées auto par RETFIE...) mais quand je les change les 1 par des 0 dans la fonction du timer 3 (je desactive les boutons a la fin du timer), les boutons sont effectivement inactifs apres que le timer 3 ait fait son job...

    Le probleme concerne donc vraiment la desactivation dans la fonction buttonsDisabledPeriod()... Est-ce interdit de modifier les registres dans une sous fonctions ? J'ai loupé un truc grave ?

    Votre avis m'interresserait vraiment parce que la j'avoue que je seche un peu...

    Meme si je compte m'y prendre autrement au final pour l'anti rebond, je n'aime pas ne pas comprendre ce qui se passe

    MErci beacoup pour votre patience et votre aide !!!

    @ tres bientot j'espere...

    Romain.

    -----

  2. #2
    Bouteille51

    Re : [PIC C18] desactiver interruptions Int0 Int1 Int2

    Résolu sur le forum de Abcelectronique, le lien :

    http://www.abcelectronique.com/forum...ad.php?t=68539

    Merci quand meme a ceux qui se sont donné la peine de lire ce douloureux message

Discussions similaires

  1. Interruptions pic 18f2550
    Par inviteb36a878a dans le forum Électronique
    Réponses: 1
    Dernier message: 01/05/2010, 18h16
  2. Interruptions PIC
    Par flolarajasse dans le forum Électronique
    Réponses: 95
    Dernier message: 19/04/2010, 07h38
  3. Probleme interruptions C18 (encore)
    Par VIIV dans le forum Électronique
    Réponses: 8
    Dernier message: 27/09/2009, 11h05
  4. PIC interruptions simultanées
    Par invite85bfc8b3 dans le forum Électronique
    Réponses: 4
    Dernier message: 16/06/2008, 12h45
  5. interruptions portB PIC
    Par romelec dans le forum Électronique
    Réponses: 6
    Dernier message: 02/05/2004, 10h12
Découvrez nos comparatifs produits sur l'informatique et les technologies.