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 :
Fonction exterieure (appelée dans l'interruption) :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;
Dans la fonction d'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; }
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...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; }
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.
-----