Bonjour,
Je développe actuellement sur un PIC18F45K20 (carte de dev 44-pin demo board avec MPLAB 8.80 et en C18) un gestionnaire d'encodeur rotatif ALPS 24 cran/tour.
Je récupère par interruption (INT0 et INT1) sur RB0 et RB1 les deux sorties (A et B) de mon encodeur (sorties montées avec resistance de pull-up).
D'après la datasheet, une rotation vers la droite implique que A passe à 0 avant B, et vis-versa (actif état bas).
Voici ma fonction d'interruption:
La configuration des registres d'interruption est bonne car si je met le deuxième test "else if" en commentaire, la rotation de l'encodeu fait bien évoluer les LEDS.Code:void MyInterrupt(void) { INTCONbits.GIE = 0; // Désactivation des interruptions if (INTCONbits.INT0IF || INTCON3bits.INT1IF) { for(j=0;j<50;j++){} // Boucle d'attente-anti rebond if(INTCONbits.INT0IF && !INTCON3bits.INT1IF) { if(i!=7) i++; else i=0; } else if(!INTCONbits.INT0IF && INTCON3bits.INT1IF) { if(i!=0) i--; } PORTD = tab[i]; // Affichage sur LEDS tab={1,2,4,8,16,32,64,128} INTCONbits.INT0IF = 0; //clear interrupt flag INTCON3bits.INT1IF = 0; } INTCONbits.GIE = 1; // Activation des interruptions }
Cependant, quand tout le programme est actif, la rotation de l'encodeur dans un sens ou dans l'autre ne donne pas de résultat cohérent (sur une rotation d'un cran, i va subir ++ et -- ou juste ++ ou juste -- sans discernement ).
Auriez vous une idée géniale pour que mon programme puisse détecter de manière "propre et précise" le sens de rotation de cet encodeur?
Merci d'avance
-----