Arduino : Registre à décalage et interruption
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Arduino : Registre à décalage et interruption



  1. #1
    pouic92

    Arduino : Registre à décalage et interruption


    ------

    Bonjour,

    Sur ma carte Arduino, je souhaite pouvoir capter l'appui de 8 boutons, mais je ne dispose plus que d'une seule entrée d’interruption.
    Par ailleurs, le nombre de GPIO encore disponible est faible.

    J'ai donc imaginé le montage suivant. Voir image en pièce jointe.

    Mes 8 boutons alimentent un registre à décalage PISO 8 bits (CD4021 - Parallel Input / Serial Output)
    Ce registre est lui même connecté à l'arduino via 3 GPIO (Pin7=PSC, Pin8=CLCK et Pin9=DATA) pour le piloter et le lire.
    Mes boutons convergent également vers mon entrée d'interruption arduino disponible, via des diodes.

    Quand un bouton est pressé, le registre PISO est mis à jour.
    Un interruption est également déclenchée sur l'arduino.

    Dans mon code, l'ISR exécutés par l'interruption va alors verrouiller le registre PISO (via changement d'état sur la Pin7 => PSC (Parallel/Serial Control))
    (C'est la seul action réalisée. C'est rapide et simple)

    Une fois revenu dans la boucle LOOP de mon code, si le registre PISO est verrouillé, alors je vais lire sont contenu (transmission série des 8 bits, avec Pin9/CLCK et Pin8/DATA...) pour déterminer quel est le bouton qui a été enfoncé : l'un des 8 bits du registre.

    Est-ce que cela peut fonctionner de cette manière ?

    Merci pour votre aide,

    -----
    Images attachées Images attachées  

  2. #2
    DAUDET78

    Re : Arduino : Registre à décalage et interruption

    Un contact qui courcircuite un condensateur .... c'est un peu iconoclaste !
    Il manque une résistance de PullDown sur l'entrée d'interruption

    Le brochage du 4021 est illisible ......
    J'aime pas le Grec

  3. #3
    pouic92

    Re : Arduino : Registre à décalage et interruption

    Bonjour DAUDET

    Le condensateur associé à une résistance réalisent l'anti rebond de mes boutons.
    (ex : R1 (pull down) et C1 forment de débounce de SW1)

    ... C'est pas bon ?

    Ok pour le pull down sur l'interruption. Je vais l'ajouter.

    Pour le CD4021, les pins du haut sont les entrées parallèles du registre
    Les pins du bas sont "documentées" dans mon premier post.

    Cordialement,

  4. #4
    invite73fd5f12

    Re : Arduino : Registre à décalage et interruption

    Quel est le type de ton Arduino?

    Pour prendre l'exemple du Uno, chaque pin peut déclencher une interruption, à condition de fouiller un peu dans la doc du micro. Donc toute cette quincaille est inutile et peut être remplacée par un simple clavier matriciel.

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

    Re : Arduino : Registre à décalage et interruption

    Bonjour Fred_du_92

    J'utilise une carte Seeduino MEGA 2560 ... c'est pas la plus petite et elle a 6 interruptions. C'est pas assez pour mes 8 boutons.
    Je suis preneur d'info sur la "méthode" pour avoir des interruptions sur chaque GPIO.

    Merci

  7. #6
    invite73fd5f12

    Re : Arduino : Registre à décalage et interruption

    Citation Envoyé par pouic92 Voir le message
    Bonjour Fred_du_92

    J'utilise une carte Seeduino MEGA 2560 ... c'est pas la plus petite et elle a 6 interruptions. C'est pas assez pour mes 8 boutons.
    Je suis preneur d'info sur la "méthode" pour avoir des interruptions sur chaque GPIO.

    Merci
    Je n'arrive pas à accéder au site d'Atmel, mais il faut regarder du côté des interruptions PCINT:
    http://playground.arduino.cc/Main/PcInt

  8. #7
    pouic92

    Re : Arduino : Registre à décalage et interruption

    Fred

    Je suis ici en ce moment : http://www.atmel.com/Images/doc8468.pdf

  9. #8
    invite73fd5f12

    Re : Arduino : Registre à décalage et interruption

    ça recoupe le lien que je t'ai donné....Tout est là, en particulier sur les PCINT

  10. #9
    DAUDET78

    Re : Arduino : Registre à décalage et interruption

    Citation Envoyé par pouic92 Voir le message
    Le condensateur associé à une résistance réalisent l'anti rebond de mes boutons.
    (ex : R1 (pull down) et C1 forment de débounce de SW1)... C'est pas bon ?
    Non ....
    Quand tu mets ton contact ON, tu décharges brutalement le condensateur dans ce court-circuit . Quelle est la valeur du courant qui traverse le contact ? Enorme et incalculable! Il faut rajouter une résistance pour limiter ce courant (voir le schéma de TROPIQUE)
    Les pins du bas sont "documentées" dans mon premier post.
    Moi, je n'aime pas le baratin, je préfère les dessins. Et sur le dessin, c'est illisible. En particulier, où se trouve la broche 11 et elle est polarisée comment ?
    J'aime pas le Grec

  11. #10
    PA5CAL

    Re : Arduino : Registre à décalage et interruption

    Bonjour

    Vouloir capter l'action de boutons avec des entrées d'interruption indépendantes, et surtout de cette manière, me paraît être une aberration... pour plusieurs raisons.


    • Pour commencer, comme ça a été dit, on ne court-circuite pas brutalement un condensateur : c'est le meilleur moyen d'endommager les contacts à plus ou moins long terme. On met au minimum une résistance de limitation en série. S'agissant d'un anti-rebond, cette façon de procéder ne peut quoi qu'il en soit être totalement efficace que lorsque l'entrée numérique présente un cycle d'hystérésis suffisant... ce dont les entrées du µC de l'ATmega ne disposent pas par défaut.


    • Ensuite, l'acquisition de l'état de boutons manipulés par une personne est un processus lent à l'échelle de temps du µC (<1µs), puisqu'il appartient à l'échelle humaine (>20ms). Normalement, ce processus est traité par polling (lecture périodique de l'état), à une fréquence lente, à l'aide d'un timer pas nécessairement dédié, ou durant le cours normal du programme s'il est cyclique. La périodicité permet d'ailleurs de réaliser à peu de frais un anti-rebond efficace, supprimant la nécessité d'ajouter des composants extérieurs et celle de se connecter à une entrée générant une interruption.


    • On peut toutefois imaginer quelques situations où il est véritablement nécessaire de recourir à une acquisition sur interruption (sortie de veille, contacts résultant d'un processus mécanique rapide, ...). Mais alors, rares sont les encore cas où il faut absolument réserver une entrée indépendante par contact.

    Par exemple, si l'on s'interdit de détecter par interruption l'appui sur un bouton tant qu'un certain nombre d'autres boutons sont maintenus appuyés, alors on peut avoir recours à un matriçage :

    Dans le cas de 8 boutons organisés en une matrice 4x2, on peut utiliser 4 sorties et 2 entrées d'interruptions avec leur résistance de pull-up interne activée, chacun des boutons étant relié à une paire sortie+entrée différente.

    Dans l'attente d'une interruption, les quatre sorties sont maintenues à l'état bas. Lorsqu'aucun bouton n'est appuyé, les deux entrées sont à l'état haut du fait de leur résistance de pull-up interne (nb: il s'agit d'une résistance de rappel reliée au +5V connectée logiciellement par le µC).

    Lorsqu'un bouton est manipulé, l'entrée d'interruption correspondante au bouton enregistre un front descendant. La détermination du bouton utilisé est alors réalisée en ne maintenant tour à tour qu'une sortie activée à l'état bas et en re-configurant provisoirement les trois autres en entrée (= haute impédance), la lecture de l'état des deux entrées d'interruption donnant l'état des deux boutons branchés sur la sortie activée (niveau bas = bouton appuyé, niveau haut = bouton relâché).

    Ensuite, idéalement, l'interruption devrait être désactivée durant le temps nécessaire à l'atténuation des rebonds du contact, afin de ne pas re-générer de nouvelles interruptions inutiles et consommatrices de temps machine. Si l'interruption n'est utilisée que pour le réveil du µC, le processus peut être continué par polling, avec les deux interruptions désactivées.


    • Dans le cas d'une gestion des boutons uniquement par polling, en utilisant un processus différent, il est possible d'utiliser seulement 5 pins du µC pour lire jusqu'à 10 boutons (ou 6 pins jusqu'à 15 boutons, 7 pins jusqu'à 21 boutons, etc.), sans utiliser de composant extérieur, juste en tirant partie des résistances de pull-up internes.
    Dernière modification par PA5CAL ; 07/05/2014 à 10h06.

  12. #11
    abracadabra75

    Re : Arduino : Registre à décalage et interruption

    Bonjour.

    En fouillant sur la toile, on trouve de nombreux exemples de 'claviers matricés' ou encore 'keypad kékeudechoz', avec gestion par polling ou interruption.
    Bien sûr, ce n'est pas pour l'Arduino, mais une fois qu'on a compris le principe de mise en oeuvre, l'écriture de la routine correspondante est à la portée d'un programmeur 'moyen', peut fonctionner sur n'importe que µc, à fortiori l'arduino.

    A+
    Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.

Discussions similaires

  1. Décalage d'un registre de 2^i
    Par invitec8c13b53 dans le forum Électronique
    Réponses: 7
    Dernier message: 03/03/2014, 20h03
  2. registre de décalage
    Par invite55fae67a dans le forum Physique
    Réponses: 3
    Dernier message: 20/12/2010, 21h37
  3. Registre à décalage
    Par invite2ceddf9e dans le forum Électronique
    Réponses: 14
    Dernier message: 09/04/2010, 07h15
  4. Registre à décalage
    Par invite1a530f8d dans le forum Électronique
    Réponses: 6
    Dernier message: 26/06/2009, 10h50
  5. registre à décalage
    Par invite74efa975 dans le forum Électronique
    Réponses: 3
    Dernier message: 30/05/2009, 17h54
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...