[Programmation] Problème avec un clavier matriciel
Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

Problème avec un clavier matriciel



  1. #1
    AdamoEden

    Problème avec un clavier matriciel


    ------

    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 :

    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
    }
    Ma fonction d'interruption :

    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;
        }
    }
    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 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);
    }

    -----

  2. #2
    gcortex

    Re : Problème avec un clavier matriciel

    J'ai déjà eu un soucis avec une entrée analogique : Il suffit de la désactiver.
    Le problème est de trouver le bon flag.

  3. #3
    AdamoEden

    Re : Problème avec un clavier matriciel

    C'est en effet une des premières choses auquel j'ai pensé et ai donc désactivé les interruptions sur les entrées analogiques avec le bit PIE1bits.ADIE =0. Si ce bit est à zéro, le flag concernant l'interruption sur l'entrée analogique ne peut théoriquement pas monter ... Si ?

  4. #4
    gcortex

    Re : Problème avec un clavier matriciel

    non : la fonction analogique.
    pas l'interruption (je m'en sers jamais).
    Dernière modification par gcortex ; 03/07/2020 à 11h45.

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

    Re : Problème avec un clavier matriciel

    D accord, je vérifierai cela lundi dans ce cas.
    J'espère pouvoir au moins sélectionner une broche car je me sers d'une entrée analogique sur une de mes broches ...

    Merci bien en tout cas,
    Bonne après midid

  7. #6
    umfred

    Re : Problème avec un clavier matriciel

    de mémoire, c'est le registre ANSEL (ou quelque chose d'approchant) qui permet d'activer ou non la fonction analogique

  8. #7
    AdamoEden

    Re : Problème avec un clavier matriciel

    Tout d'abord merci pour vos réponses.
    Alors j'y comprends de moins en moins ...

    J'ai donc essayé de désactiver l'analogique (à l'aide du bit ADON) et cela n'a pas fonctionné. J'ai donc essayé de changer de broche pour une broche ne prenant pas la fonction analogique (RC0) et rien ne change ...


    JE ne sais pas si j'ai été clair dans mes précédents posts mais l'interruption n'est pas sur les colonnes du clavier à proprement dit mais sur une broche en sortie d'une porte AND qui prend les trois colonnes en entrée.

    J'espère qu'un d"entre vous pourra éclairer ma lanterne ...
    Aurel.

  9. #8
    gcortex

    Re : Problème avec un clavier matriciel

    le bit ADON n'a rien à voir. pas sûr d'avoir compris ta question.
    çà marche avec une pin et pas l'autre ? Un ptit schéma ?

  10. #9
    AdamoEden

    Re : Problème avec un clavier matriciel

    Je me permets de faire un ajout d'information.
    Même lorsque je retire la liaison entre ma colonne et RB3 l'interruption ne marche pas sur RB0 ... Donc ce n'est visiblement pas RB3 qui perturbe l'interruption sur RB0 ...

  11. #10
    gcortex

    Re : Problème avec un clavier matriciel

    Faut valider les interruptions à plusieurs endroits, notamment dans le registre STATUS.

  12. #11
    AdamoEden

    Re : Problème avec un clavier matriciel

    gcortex, j'avais mis un schéma lors de mon premier post .
    Et sinon non, peut importe où je mets ma troisième colonne, si je ne bouge pas la première et la seconde, ça ne fonctionne pas (J'ai essayé avec RE0 et RC0).
    PAr contre, si jamais j'inverse la troisième et la seconde (Donc la troisième sur RB4 et la seconde sur RB3), c'est la seconde qui ne fonctionne plus ...

  13. #12
    AdamoEden

    Re : Problème avec un clavier matriciel

    J'ai été voir le registre STATUS dans ma doc, je ne vois rien en rapport avec les interruptions ...
    Voici ce que j'ai trouvé dans ma DOC : Nom : Capture.PNG
Affichages : 103
Taille : 66,1 Ko

    Sur quel bit dois-je agir ? Et pourquoi est-ce que cela ferait déconner uniquement la troisième colonne ?

  14. #13
    gcortex

    Re : Problème avec un clavier matriciel

    Autant pour moi.

    Umfred parlait du registre ANSEL.
    T'as regardé ?

  15. #14
    AdamoEden

    Re : Problème avec un clavier matriciel

    Je n'ai trouvé aucun registre avec ce nom. Et je pense que le problème ne vient pas de la fonction analogique car quand je mets ma colonne sur une broche ne permettant pas d'entrée analogique, le problème persiste :/

  16. #15
    AdamoEden

    Re : Problème avec un clavier matriciel

    C'est enfin bon ... J'ai trouvé mon erreur.
    Je ne testais pas l'entrée en interruption (car j'avais une interruption timer0 et j'y rentrais toutes les 20ms) mais je mettais mon breakpoint sur la ligne ou je testais le flag INT0IF. Le soucis c'est que lorsque j'appuyais sur la colonne 3, il n'y arrivait pas car le flag RBIF ne se levait pas.
    J'avais donc mal compris le fonctionnement de ce flag... Je pensais qu'il se levait automatiquement avec INTOIF.
    Merci pour vos réponse, avec un peu de chance, raconter ma mésaventure pourra aider quelqu'un dans le futur !

    Bonne continuation,
    Aurel.

  17. #16
    umfred

    Re : Problème avec un clavier matriciel

    Citation Envoyé par gcortex Voir le message
    Autant pour moi.

    Umfred parlait du registre ANSEL.
    T'as regardé ?
    je viens de regarder la doc, ce sont les bits PCFG3:PCFG0 du registre ADCON1 en fait qui configurent le type des i/o en analogique (0) ou pas (1)

Discussions similaires

  1. Clavier matriciel !
    Par inviteaba88869 dans le forum Électronique
    Réponses: 17
    Dernier message: 03/01/2014, 21h39
  2. Clavier matriciel
    Par invitefc343bc7 dans le forum Électronique
    Réponses: 1
    Dernier message: 01/04/2009, 16h54
  3. [PPE] langage C et clavier matriciel
    Par invitedcc7860a dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 02/05/2008, 19h04
  4. Clavier matriciel avec PIC16f819
    Par invite096a1b4e dans le forum Électronique
    Réponses: 4
    Dernier message: 03/04/2007, 20h22
  5. gestion de clavier matriciel i2c
    Par invite6d875316 dans le forum Électronique
    Réponses: 2
    Dernier message: 26/01/2007, 22h49
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...