Bonjour,
Je suis actuellement en train de travailler sur un PIC18F4520. Je souhaite mettre en place un clavier matriciel. Pour cela, j'ai utilisé une porte AND qui envoie sur la broche INT0 un front descendant lors de l'appui d'une touche.
Pour y voir plus clair, voici mes schémas :
Capture.PNG (côté PIC)
Capture.PNG (côté porte AND et clavier)
Mon petit soucis vient de la détection de l'interruption ... En effet, lorsque je presse une touche de la première ou seconde colonne, le programme entre dans mon interruption sans aucun soucis mais si j'appuie sur un e touche de la troisième colonne, le programme n'entre pas en interruption (pourtant, lorsque je regarde à l'oscilloscope sur INT0, j'ai bien un front descendant sur les trois colonnes).
Je me suis alors penché sur la datasheet du PIC et j'ai vu que sur RB3 (la broche de ma 3ème colonne) il y avait une fonction comparateur et une fonction analogique. Je me suis donc dit que peut-être le programme voulait entrer en interruption sur une de ces deux fonctions et vu qu'il ne voyait pas d'ISR en low priority il n'y entrait pas. Pour vérifier, j'ai désactivé les interruptions sur cette fonction comparateur et sur les entrées analogiques ... Aucun succès.
J'espère que quelqu'un sera capable de m'éclairer ...
Voici donc mon code C :
L'initialisation de mon interruption sur INT0 :
Ma fonction d'interruption :Code:void init_interrupt_RB0(void){ INTCONbits.GIE = 1; // Autorisation interruptions générales INTCONbits.PEIE = 1; // Aurorisation interruptions périphériques PIE1bits.ADIE =0; // Disable analog interrupts PIE2bits.CCP2IE =0; // Disable CCP2 interrupts INTCON2bits.RBPU = 0; //On désactive les pull up sur le port B INTCON2bits.RBIP = 1; //On passe tous les ports B en interrupt low priority INTCON2bits.INTEDG0 = 0; //Interrupt sur front descendant INTCONbits.INT0IE = 1 ; //On active l'interruption sur INT0 }
et mon main : (il y a plusieurs initialisation dedans car le clavier n'est pas le premier "device" que je configure. La fonction d'initialisation de l'interruption listée plus haut est comprise dans la fonction appellée dans le main : init_all() ) .Code:void interrupt high_priority HP_ISR(void){ if (INTCONbits.TMR0IF){ // Si interruption sur Timer 0 PORTCbits.RC0 = !PORTCbits.RC0; TMR0 = 121 * concatenation_ADRES - 58916 ; //initialisation registre comptage INTCONbits.TMR0IF = 0; //PORTCbits.RC1=!PORTCbits.RC1; //lire_touche(); } if (INTCONbits.RBIF){ //Si interruption sur un pin du port B if (INTCONbits.INT0IF){ lire_touche(); INTCONbits.INT0IF =0 ; } INTCONbits.RBIF = 0; } }
Code:void main(void) { // Déclaration de variables nécessaires au main int prise_actuelle = 18; // Position actuelle de l'IC Registre_PWM mon_registre[25]; // Structure resensant les réglages de la PWM pour chaque valeur de l'IC // Initialisation du système config_all(); // Configuration du système, à laisser AVANT init_tableau_prise initialiser_tableau_prises(mon_registre); // Rempli le tableau mon_registre avec les valeurs des registres PWM initialiser_prise (prise_actuelle, mon_registre); // Règle le PWM en fonction de la position actuelle de la prise. // Programme principal while(1); }
-----