[Programmation] Gestion d'un bouton poussoir sur microcontrôleur [Résolu] - Page 3
Répondre à la discussion
Page 3 sur 3 PremièrePremière 3
Affichage des résultats 61 à 76 sur 76

Gestion d'un bouton poussoir sur microcontrôleur [Résolu]



  1. #61
    scaypapa

    Re : Gestion d'un bouton poussoir sur microcontrôleur


    ------

    J'utilise XC8 avec MPLAB X IDE.
    Oui en effet (et ça confirme mon calcul ) Si on l'initialise à 6, on a plus que 250 à incrémenter pour atteindre 256. Donc 250*32*4/1000000 = 32,000 ms.
    Mais est-ce que vraiment ça a une importance ici ? Ca ne faisait une erreur que de 678µs par débordement du timer, ce n'est pas comme si on était en train de mesurer un temps précis.

    -----

  2. #62
    invite03481543

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Important non, sauf à vouloir être précis

  3. #63
    invite03481543

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Fais au moins l'essai pour tester le clignotement led (ne garde que ça dans ton interruption), ça nous permettra dejà de savoir si ton timer tourne correctement.

  4. #64
    scaypapa

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Oui. Ca ca fonctionne très bien. Mais je ne pas le matériel nécessaire pour mesurer que la LED s'allume et s'éteint bien toutes les 640ms. Encore moins pour voir une différence si je n'initialise pas le timer (différence de 678µs).

    Dans mon post #60 il y a une accolade fermante en trop (la 3eme en partant de la fin).
    Oui c'était corrigé

  5. #65
    scaypapa

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Est-il possible durant mes nombreux essais, que j'ai grillé la fonction RBIE de mon PIC (court-jus lors d'une prise de mesure au multimètre sur les pattes du PIC ou autre) ?
    Ce qui expliquerait que les interruptions ne fonctionnent pas sur cette fonction alors qu'elles fonctionnent très bien sur les autres ?

  6. #66
    invite03481543

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Non je ne pense pas.
    Il y a sans doute une autre erreur.
    Je regarderais quand j'aurai un peu de temps.
    @+

  7. #67
    scaypapa

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Je pense vraiment à un problème de configuration.
    Je suis débutant en électronique, et en C mais connais quelques autres languages de programmation (PHP, JS...). Et si au départ j'ai posté l'ensemble de mon programme (qui n'est qu'un programme de test), c'était pour vous montrer tous les tests que j'avais pu effectuer. Ce qui fonctionnait et ce qui ne fonctionnait pas.
    Vous m'avez déjà bien aidé pour mieux gérer les rebonds du BP etc et j'ai eu grand espoir quand tu m'as indiqué mon erreur de définition du registre TRISB (TRISB = 1 correspond à TRISB = 0b00000001 et non TRISB 0b11111111) parce que ça aurait très bien expliqué le problème.
    Malheureusement, j'ai beau chercher dans mon code de haut en bas, de bas en haut et relire inlassablement la datasheet sur les IOC, je ne parviens pas à trouver où se trouve l'erreur (ou les erreurs) restante(s).

    Concernant INTCONbits.PEIE, est--tu certain qu'il doit être activé pour RBIE (ce que j'ai fait, mais je doute de l'utilité). Il y a bien des interruptions qui sont appelées Peripheral Interrupts dans la datasheet. PEIE n'active-t-il pas seulement ces interruptions là ?
    Merci pour votre patience. Ca prend toujours un peu de temps d'apprendre un nouveau langage...

    C'est pour ça que je commence à soupçonner le matériel lui-même... Mais j'imagine que les PIC sont bien protégés en interne. J'ai déjà été confrontés à des µC déprogrammés par un court-jus ou une inversion de polarité, mais un repassage au programmateur suffisait à tout faire rentrer dans l'ordre. Enfin, je ne sais plus où chercher quoi...
    Dernière modification par scaypapa ; 29/06/2016 à 09h27.

  8. #68
    invite03481543

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Essaye ce code (j'ai mis en rouge ce qui manquait ):

    Code:
    #include <xc.h>
    
    
    // CONFIG1H
    #pragma config FOSC = INTIO67   // Oscillator Selection bits (Internal Oscillator Block))
    
    
    // CONFIG2H
    #pragma config WDTEN = OFF      // Watchdog Timer Enable bits (Watch dog timer is always disabled. SWDTEN has no effect.)
    
    
    // CONFIG3H
    #pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<5:0> pins are configured as digital I/O on Reset)
    
    
    
    // I/O
    #define BP         PORTBbits.RB4
    #define LED        PORTDbits.RD2
    #define TEMPO      5 // pour une tempo de 32ms*5
    
    
    volatile unsigned char tempo_bouton = 0, TEMPO_encours = TEMPO;
    
    
    void interrupt bouton(void)
    {
        if (INTCONbits.RBIF && !tempo_bouton)  // appui détecté et tempo_bouton non actif
          {
            INTCONbits.RBIF = 0;  // flag remis à 0
            tempo_bouton = 1;  // on active la tempo de debounce et on bloque un nouvel appui
          }
    
    
        if (INTCONbits.TMR0IF && INTCONbits.TMR0IE) // débordement du timer si interruption activée
          {
            INTCONbits.TMR0IF = 0;  // flag remis à 0
            if(tempo_bouton)  // si tempo debounce activé
              {
                if(TEMPO_encours > 0) TEMPO_encours--;  // si TEMPO pas arrivé à 0 on continue de décompter
                else
                     {
                      LED=!LED;  // sinon on change l'état de la led
                      TEMPO_encours = TEMPO; // on recharge avec la valeur d'origine
                      tempo_bouton = 0; // on autorise un nouvel appui
                     }
    
    
              }
    
    
             TMR0L  = 0x06; // pour 32ms @ 1MHz
    
    
           }
    }
    
    
    
    
    
    
    void main(void)
    {
        // Ports
        TRISB = 0xFF;           // Config PORTB en entrée
        ANSELD = 0;             // Digital
        TRISD = 0;              // Config PORTD en sortie
    
    
        // Rb4-7 Interrupt
    
    
        INTCONbits.RBIF = 0;
        INTCONbits.RBIE = 1;
    
    
        // Tmr0 Interrupt
        T0CON = 0b01000100;     // T0OFF, 8bits CLKOUT - Use Postscaler : 1/32   => Tmr0 overflow = 256*32*4/1000000 = 32,768ms
        INTCONbits.TMR0IF = 0;
        INTCONbits.TMR0IE = 1;
        IOCB = 0b00010000;  //(voir p 158 de la doc)
        // Pullup
        INTCON2bits.RBPU = 0;
    
    
        // Init
        LED = 0;
        INTCONbits.PEIE = 1;
        INTCONbits.GIE = 1;
    
    
        while(1);
    }

  9. #69
    scaypapa

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Non désolé, ce n'est pas ça non plus.
    En fait j'avais déjà essayé (ce qui n'empêche pas que j'ai copié ton code pour confirmer), mais le registre IOCB est initialisé à 0xF0 par défaut...

  10. #70
    invite03481543

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Ok.
    Confirme moi que ta led est donc toujours OFF.
    Je regarde le reste.
    Au pire je ferais un essai sur une carte si je ne trouve rien d'anormal dans le code.

  11. #71
    scaypapa

    Re : Gestion d'un bouton poussoir sur microcontrôleur



    Je ne capte pas, j'ai remis mon code du post #53 en ajoutant dans l'initialisation des interruptions sur RB4-7 "IOCB = 0xF0;"
    CA MAAAAAARCHE !!!!

    Si ça ne marchait pas quand j'avais essayé d'initialiser IOCB, c'était à cause du fait que j'avais mal initialisé TRISB (merci à toi )
    Ce qui m'échappe toujours, c'est que la doc indique bien qu'IOCB est initialisé à 0xF0 sur un reset (p.158 ainsi que p.87).

    C'est une erreur de la doc ??? Ca se fait pas de la part de Microchip de laisser traîner ça !

    En tout cas, c'est RÉSOLU !!!! (je peux l'indiquer moi-même dans le titre du sujet ou est-ce qu'il faut demander à un modo ?)
    Youhou !
    Merci pour votre patience à tous

    EDIT : test en retirant INTCONbits.PEIE = 1 : ça fonctionne aussi
    Dernière modification par scaypapa ; 29/06/2016 à 10h44.

  12. #72
    scaypapa

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Code fonctionnel :
    Code:
    #include <xc.h>
    
    // CONFIG1H
    #pragma config FOSC = INTIO67   // Oscillator Selection bits (Internal Oscillator Block))
    
    // CONFIG2H
    #pragma config WDTEN = OFF      // Watchdog Timer Enable bits (Watch dog timer is always disabled. SWDTEN has no effect.)
    
    // CONFIG3H
    #pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<5:0> pins are configured as digital I/O on Reset)
    
    
    // I/O
    #define BP         PORTBbits.RB4
    #define LED        PORTDbits.RD2
    
    
    
    void anti_rebond(void)
    {
        TMR0L = 0;
        T0CONbits.TMR0ON = 1;
    }
    
    void interrupt boutons(void)
    {
        if (INTCONbits.RBIF) {
            if (BP) NOP();
            INTCONbits.RBIF = 0;
            anti_rebond();
        }
        
        else if (INTCONbits.TMR0IF) {
            LED = !LED;
            T0CONbits.TMR0ON = 0;
            INTCONbits.TMR0IF = 0;
        }
    }
    
    
    void main(void)
    {
        // Ports
        TRISB = 0xFF;           // Config PORTB en entrée
        ANSELD = 0;             // Digital
        TRISD = 0;              // Config PORTD en sortie
    
        // Rb4-7 Interrupt
        IOCB = 0xFF;
        if(BP);                 // juste histoire de le lire pour pouvoir effacer le drapeau
        INTCONbits.RBIF = 0;
        INTCONbits.RBIE = 1;
        
        // Tmr0 Interrupt
        T0CON = 0b01000100;     // T0OFF 8bits CLKOUT - Use Postscaler : 1/32   => Tmr0 overflow = 256*32*4/1000000 = 32,768ms
        INTCONbits.TMR0IF = 0;
        INTCONbits.TMR0IE = 1;
            
        // Pullup
        INTCON2bits.RBPU = 0;
        
        // Init
        LED = 0;
        INTCONbits.GIE = 1;
        
        while (1) NOP();
    }

  13. #73
    invite03481543

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Citation Envoyé par scaypapa Voir le message



    EDIT : test en retirant INTCONbits.PEIE = 1 : ça fonctionne aussi
    Oui sur ce type de µC il y n'y en a pas besoin effectivement.
    Il est nécessaire aussi de lire le portB pour qu'il y ait comparaison avec l'ancien état, je l'ai oublié dans mon code.
    Bon ben te voilà paré pour affronter les interruptions désormais.
    Tu verras aussi que pour ce PIC il a 2 niveaux de priorité pour les interruptions.

  14. #74
    scaypapa

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Citation Envoyé par HULK28 Voir le message
    Il est nécessaire aussi de lire le portB pour qu'il y ait comparaison avec l'ancien état, je l'ai oublié dans mon code.
    C'est peut-être pour ça que ça n'a pas fonctionné quand j'ai copié/collé ton code...

    Bon ben te voilà paré pour affronter les interruptions désormais.
    Tu verras aussi que pour ce PIC il a 2 niveaux de priorité pour les interruptions.
    Je pense. D'autant que dans mon premier code du coup (#1), j'avais essayé les interruptions prioritaires (juste dans le but d'essayer) et ça fonctionait très bien.
    J'avais bien sûr, avant de venir vous voir, testé chaque fonction utilisée de manière indépendante pour les valider une à une. J'avais juste fait l'impasse sur RBIE qui ne fonctionnait pas et sur INT qui ne foncitonnait correctement que sur la patte Int0. J'espérais comprendre mon erreur pendant mes autres essais mais ça n'a pas été le cas...

    Tu as réglé en deux fois toutes les erreurs que je rencontrais
    Sauf que si l'interruption se passe sur la patte INT0, ça fonctionne bien.
    • si je déplace le BP sur INT1, plus rien ne se passe ! ?
    • si je déplace le BP sur la patte INT2, il fait l'inverse de ce qu'il devrait : le nombre de temps par mesure est décrémenté au lieu d'être incrémenté. Je pense plutôt qu'au lieu de ne voir qu'un front, il en voit deux.
    • Aussi j'ai essayé de créer des interruptions de type InterruptOnChange sur RB4 ou RB5 qui ne fonctionnent pas du tout (quelle que soit la patte utilisée). Pour faire des essais, le principe était simplement de faire clignoter la LED verte en cas d'appui et la LED jaune en cas de relâchement. Sauf que rien ne se passe du tout.
    Les 2 premiers soucis étaient liés à la mauvaise initialisation de TRISB et la dernière erreur était lié à ma trop grande confiance dans la doc.
    J'avais pourtant jeté un œil dans l'errata de Microchip sur mon PIC, mais sans y trouver le souci (peut-être n'ai-je pas cherché assez longtemps).
    Aussi, j'avais retiré l'initialisation de IOCB car à un moment, j'ai malgré tout essayé de l'initialiser correctement, mais comme seul RB0 était configuré en entrée, je n'ai pas vu de différence. J'ai donc fait confiance à ce que disait la doc sur la valeur de IOCB au reset...
    Dernière modification par scaypapa ; 29/06/2016 à 11h18.

  15. #75
    RISC

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Salut,

    2 recommendations pour ton code :

    1/ Toujours utiliser LATx pour les broches en sortie et PORTx pour les broches en entrée
    Exemple :
    Code:
    #define LED        LATDbits.LATD2
    (les raisons de cela sont expliquées dans la datasheet et ont été discutées des dizaines de fois par le passé sur ce forum)

    2/ Pour les interruptions, si tu utilises plusieurs interruptions à la fois et que tu désactives temporairement une interruption de temps en temps, il faut alors impérativement code de cette manière:

    Code:
    void interrupt boutons(void)
    {
        if (INTCONbits.RBIF && INTCONbits.RBIE) {
            if (BP) NOP();
            INTCONbits.RBIF = 0;
            anti_rebond();
        }
        
        else if (INTCONbits.TMR0IF && INTCONbits.TMR0IE) {
            LED = !LED;
            T0CONbits.TMR0ON = 0;
            INTCONbits.TMR0IF = 0;
        }
    }
    a+

  16. #76
    scaypapa

    Re : Gestion d'un bouton poussoir sur microcontrôleur

    Merci beaucoup, j'en prends bonne note

Page 3 sur 3 PremièrePremière 3

Discussions similaires

  1. Bouton poussoir farçeur (énervant) [résolu]
    Par invite424deccd dans le forum Bricolage et décoration
    Réponses: 29
    Dernier message: 10/09/2012, 17h53
  2. Bouton poussoir et minuterie ? [résolu]
    Par crobe dans le forum Bricolage et décoration
    Réponses: 15
    Dernier message: 03/04/2011, 14h42
  3. Gestion de bouton poussoir - différencier appui bref ou long
    Par micr0m dans le forum Électronique
    Réponses: 3
    Dernier message: 07/09/2010, 09h31
  4. [C/PIC] - Gestion bouton poussoir
    Par jorg1n dans le forum Électronique
    Réponses: 6
    Dernier message: 29/04/2009, 07h07
  5. Gestion Bouton poussoir ON/OFF
    Par jorg1n dans le forum Électronique
    Réponses: 22
    Dernier message: 19/10/2007, 15h24
Découvrez nos comparatifs produits sur l'informatique et les technologies.