Lorsque IO est limité sur uC, comment éloignez-vous la logique de l'UC?

8

Par exemple, si vous aviez un Arduino avec 4 broches d'E / S numériques, comment pourriez-vous allumer indépendamment> 4 LED ou lire l'état de> 4 boutons?

cheesysam
la source
Vous posez des questions sur les PIC dans le titre, puis vous vous référez à un Arduino!
Leon Heller
2
@LeonHeller: Demandez ensuite des éclaircissements et / ou modifiez la question vous-même. Bien que dans ce cas, on puisse simplement sous "uC" pour PIC / Arudino.
Chris Laplante
2
J'accepte que le matériel coûte moins cher à entretenir.
jippie
3
@jippie - Et puis la réponse geek est: "Qu'est-ce qu'une petite amie?" :-)
stevenvh
1
Je suggère de reconsidérer votre réponse acceptée. Ignacio est incorrect (il y a trois signaux, pas deux), Bruno est plus complet (Ignacio ne mentionne pas d'entrée par exemple), et a une solution originale pour enregistrer une broche supplémentaire.
stevenvh

Réponses:

4

Un registre à décalage tel que le 74595 vous permettra d'avoir de nombreuses sorties avec seulement 2 connexions: une broche de données et une broche d'horloge. Vous définissez la broche de données à la prochaine valeur que vous souhaitez déplacer dans le registre, puis impulsions la broche d'horloge.

Ignacio Vazquez-Abrams
la source
C'est génial. J'ai donc lu dessus et juste pour clarifier, avec l'une de celles-ci, je peux avoir 8 sorties en cours d'exécution en utilisant jusqu'à 2 broches Arduino? Je suppose que je ne peux pas les utiliser aussi comme entrées?
cheesysam
3
@cheesysam - "Avec deux, vous pouvez avoir 16 sorties. Avec trois, 24, etc.". Ce n'est pas correct. Vous avez besoin de 3 broches: données, horloge et verrou, quel que soit le nombre d'appareils que vous souhaitez connecter. La réponse de Bruno est plus précise. Ne parlez pas non plus du 74595, c'est la technologie TTL d'origine, qui est morte et enterrée depuis des décennies. Vous voulez le 74HC595.
stevenvh
1
@stevenvh: "... avec une de celles-ci, je peux avoir 8 sorties ...". De plus, êtes-vous sûr qu'ils ne veulent pas du 74AC595? 74F595? 74LVX595?
Ignacio Vazquez-Abrams
1
@Ignacio - "avec deux .." est source de confusion, comme on peut le lire comme "avec deux E / S", comme je l'ai fait. Désolé. 74F595? Pour le cadencement par un contrôleur 16 MHz? Je ne pense pas. Le 74F est très gourmand en énergie et la vitesse ne vous offre aucun avantage. 74LVX est de 3,3 V seulement, donc ne s'interface pas avec Arduino. Quel est le problème avec 74HC? C'est la famille logique standard.
stevenvh
2
"Qu'est-ce qui ne va pas avec le 74HC?" Absolument rien. Quel est le problème en omettant le "XX"?
Ignacio Vazquez-Abrams
7

Bruno a donné une bonne réponse, mais j'aimerais prendre quelques notes.

Le fameux 70 mA
Le 74HC595 est souvent utilisé comme extension d'E / S et aussi souvent utilisé pour contrôler une série de LED. Ce qui est souvent négligé, c'est que vous pouvez le faire fonctionner de cette façon. La fiche technique indique que le courant d'alimentation total ne doit pas dépasser 70 mA, les valeurs nominales maximales absolues (AMR), il vaut donc mieux rester à l'écart de cela par une certaine marge. Par conséquent, 8 LED à 10 mA, c'est trop, et à 20 mA, vous dépasserez l'AMR de pas moins de 130%! La limite est probablement due à la capacité actuelle des fils de liaison, puis un courant trop élevé peut non seulement détériorer les performances de la pièce, mais aussi le mettre définitivement hors service si ce fil se cassait.

Mais hier soir, je me suis réveillé parce que j'avais une idée . La limite de 70 mA vaut pour le courant Icc et le courant de terre, alors pourquoi ne pas diviser notre total ou 80 mA et laisser Icc en avoir la moitié et le courant de terre l'autre moitié? Il vous suffit de référencer 4 des LED à la masse (actif haut) et les 4 autres à Vcc (actif bas). Puis le courant des premiers vient d'Icc, le courant des autres va à la terre. Vous pourrez ainsi utiliser des LED 15 mA. (C'est si simple que je me sens idiot de ne pas y avoir pensé plus tôt.)

Les horloges combinées,
je pensais que Bruno a économisé une broche d'E / S supplémentaire en combinant l'horloge du registre à décalage avec celle du verrou. Il semble que j'ai mal interprété sa réponse. Je veux toujours développer cette option.

Que se passe-t-il alors? Le tableau de la page 5 de la fiche technique indique:

le contenu du registre à décalage a été déplacé; le contenu précédent du registre à décalage est transféré vers le registre de stockage et les étages de sortie parallèles

(soulignant par moi)
Donc ce ne sont pas les nouvelles données mais les précédentes qui sont verrouillées. Pas un vrai problème, assurez-vous simplement de déplacer un bit fictif supplémentaire pour verrouiller les dernières données, sinon tout sera incorrect.

La combinaison des horloges signifie également que les sorties basculeront tout le temps pendant que vous introduisez de nouvelles données. La fonction du verrou était en fait d'éviter cela. Dans de nombreux cas, ce ne sera pas un problème, si vous pouvez le faire rapidement, mais dans le pire des cas, vous pouvez obtenir des effets indésirables. Le pire des cas pourrait être d'utiliser le 74HC595 pour multiplexer un affichage à une fréquence de balayage très élevée + avoir une très longue chaîne de registres à décalage + avoir tous les 1 sauf un 0, une LED éteinte + une pièce sombre. Étant donné que cette LED voit tous les 1 passer de temps en temps dans une pièce sombre, elle peut s'allumer très faiblement.

Ou si vous combinez ce multiplexage haute fréquence avec une sortie de contrôle de relais. Tous les zéros, puis un 1 pour le relais peuvent signifier que la sortie du relais n'est pas assez longue pour être activée.

Certes, ce sont des cas extrêmes, mais je garderais la série et l'horloge de verrouillage séparées chaque fois que possible si vous voulez multiplexer, ou sinon avoir des taux de mise à jour élevés.

Stevenvh
la source
1
+1 Excellente idée que vous avez eue hier soir! Je n'ai jamais vu cela mentionné nulle part jusqu'à présent. D'un autre côté, je pense que vous avez mal interprété la réponse de Bruno. Il voulait dire combiner le signal d'horloge des 74XX595 et 74XX165 ensemble et combiner le signal de verrouillage des 74XX595 et 74XX165 ensemble.
m.Alin
@ m.Alin - Oui, il me semble. Merci d'avoir fait remarquer cela. Je vais modifier ma réponse, mais laissez-la comme une possibilité.
stevenvh
Bien sûr, c'est certainement une possibilité que d'autres ont recommandée. Cela vaut la peine d'y répondre.
m.Alin
@ m.Alin - Je pense que la raison pour laquelle il n'a pas été utilisé auparavant est que les utilisateurs ne connaissaient pas la limite de 70 mA, ou s'en fichaient :-(. Je m'en vais au bureau des brevets maintenant! ;-)
stevenvh
3
Déjà de retour. Le bureau a été fermé. Ils étaient tous à l'église.
stevenvh
6

Je suis d'accord avec Ignacio concernant l'utilisation d'un 74XX595, registre à décalage série en parallèle pour l'extension de la sortie, mais en fait, vous aurez besoin de 3 connexions, une pour les données , une pour l' horloge et un verrou permettant de transférer les données du registre à décalage interne aux verrous de sortie.

Schéma du 74LS595

Pour l'extension des entrées, vous pouvez utiliser un 74XX165, registre à décalage de sortie série parallèle, cela permettra d'avoir jusqu'à 8 boutons par 74XX165.

entrez la description de l'image ici

La bonne chose à propos de cette approche est que vous pouvez connecter en guirlande plusieurs registres à décalage permettant un nombre accru d'entrées ou de sorties, et mieux, vous pouvez mélanger 74XX595 et 74XX165 permettant et vous d'avoir un nombre quelconque d'entrées ou de sorties.

En plus de cela, vous pouvez partager les signaux d'horloge et de verrouillage en réduisant le nombre de connexions nécessaires et en simplifiant considérablement le logiciel. De cette façon, vous n'aurez besoin que de 4 connexions pour n'importe quel nombre de ces registres à décalage:

  • Horloge (partagée avec tous les registres à décalage)
  • Latch Enable (partagé avec tous les registres à décalage)
  • Entrée de données (connectée à la sortie série du dernier registre à décalage de la chaîne)
  • Sortie de données (connectée à l'entrée série du premier registre à décalage de la chaîne)

Éditer

Comme je cherchais un diagramme, j'ai trouvé sur ce site un moyen très intelligent de réduire à 3 le nombre de connexions nécessaires. Il consiste à utiliser la même broche pour l'entrée et la sortie des données.

Le logiciel fera quelque chose comme ceci pour chaque impulsion d'horloge:

  1. Configurer la broche comme sortie
  2. Définissez la valeur des données
  3. Envoyer une impulsion d'horloge
  4. Configurer la broche comme entrée
  5. Lisez les données

Diagramme

Bruno Ferreira
la source
1
Les vifs excessifs ne peuvent contrôler que les chaînes de sortie du registre à décalage comme celle-ci avec une seule broche de sortie, et probablement celles d'entrée-sortie comme wel. Demandez-moi comment je sais :-). Ceci est réalisé en utilisant des retards R / C sur les données et le verrou, avec une horloge connectée directement à la broche de sortie. Le séquençage exact dépend de la polarité relative de déclenchement de front pour l'horloge et le verrou, mais ceux-ci sont généralement conçus de manière à fonctionner ensemble de cette manière.
Russell McMahon
Et comme je l'ai dit dans ma réponse, vous pouvez également combiner les deux horloges, de sorte que vous n'avez besoin que de deux broches. C'est une idée intelligente, mais je ne vais pas voter une seconde fois. Une fois suffit :-)
stevenvh
Je ne vois pas la nécessité de déplacer la dernière sortie du 74HC595 dans le 74HC165. Quelqu'un pourrait-il expliquer cela? Autant que je sache, 16 impulsions d'horloge seraient suffisantes pour les deux, régler les sorties des 2 x 74HC595 (16 sorties) et lire les entrées des 2 74HC165 (16 entrées), sans cette connexion.
@Dario: Avoir la dernière sortie du 74HC595 dans le 74HC165 est un moyen "gratuit" de permettre à un contrôleur qui sait que la chaîne ne sera pas plus longue qu'une certaine longueur de déterminer que la chaîne est connectée et combien de temps elle est . S'il serait acceptable de synchroniser tous les '595 bas au démarrage, et si les premiers' 165 auront au moins une entrée haute, le code peut même déterminer combien il y a de '595 et de 165'.
supercat
5

Nick mentionne les extenseurs d'E / S, et ils valent vraiment la peine d'être examinés. Digikey en répertorie plus d'un millier, je vais en choisir un avec une interface I2C à titre d'exemple, car cela nécessite le moins de broches d'E / S; minimum deux.

Le NXP PCA9505 possède 40 broches d'E / S configurables, l'équivalent de cinq 74HC595. C'est une solution légèrement plus chère mais vous obtenez beaucoup plus de fonctionnalités pour cela:

  • Toute broche d'E / S peut être configurée comme entrée ou sortie
  • Pullups de 100 kΩ sur toutes les broches d'E / S (le PCA9506 n'a pas les pullups, ce qui peut être pertinent pour les applications à faible puissance)
  • Toutes les sorties peuvent descendre de 15 mA simultanément, pour un total de 600 mA
  • Une sortie d'interruption sur changement rend le balayage continu des entrées superflu
  • Seuls deux fils pour se connecter au microcontrôleur.

Lectures complémentaires
GPIO expanders , NXP brochure
PCA9505 datasheet

Stevenvh
la source
4

Pour une solution sans CI supplémentaire, vous pouvez utiliser des techniques telles que le multiplexage et le Charliplexage :

Multiplexage (aucune résistance de limitation de courant représentée):

LED multiplexées

Le fonctionnement du multiplexage est assez simple - dans l'exemple ci-dessus, si nous voulons allumer LED1, nous réglons la broche C1 pour une sortie haute et le PIN R1 pour une sortie basse, toutes les autres broches peuvent être hautes ou Hi-Z (définies pour entrer, hautes impédance qui les fait paraître "déconnectés")
Si nous souhaitons allumer LED5, nous réglons la broche C2 pour une sortie haute et R2 pour une sortie basse.

Le nombre de broches nécessaires pour piloter x LED peut être calculé par 2n broches pour n² LED, par exemple pour 16 LED, nous avons besoin (√16) * 2 = 8 broches.

Charlieplexing:

Charlieplexing

Disposition schématique alternative (plus nette) (suggérée par Supercat):

Charlieplexing 2

C'est un peu plus complexe, mais utilise moins de broches pour piloter un plus grand nombre de LED. Par exemple, nous pouvons utiliser seulement 5 broches pour piloter 20 LED comme dans l'exemple ci-dessus (par rapport à au moins 10 broches avec un multiplexage matriciel "normal" (à ne pas confondre avec l'utilisation d'un circuit intégré, auquel cas le nombre de broches nécessaires est log2 (nLED).

Pour une solution externe, vous pouvez utiliser des choses comme des registres à décalage ou des multiplexeurs tels que 74HC595 et 74HC151.
Un registre à décalage prend un flux d'entrée série horodaté de données et des sorties parallèles (Serial In Parallel Out SIPO) ou inversement (PISO) .Il a
généralement 8 sorties (ou entrées) mais vous pouvez enchaîner autant que vous le souhaitez pour les étendre des choses. L'inconvénient est que la vitesse que vous pouvez mettre à jour est divisée par le nombre de sorties par entrée (par exemple, pour un registre de 8 sorties, si vous avez une horloge d'entrée à 8 MHz, vous pouvez mettre à jour à 1 MHz, pour 16 sorties à 500 kHz, etc.)

Ces techniques peuvent également fonctionner en sens inverse pour les entrées.

Oli Glaser
la source
Cette réponse montre comment utiliser Charlieplexing pour les boutons-poussoirs d'entrée multiplexés: electronics.stackexchange.com/a/37362/8627
jippie
Un moyen plus facile de dessiner un écran Charlieplex est de simplement le dessiner sous forme de grille NxN avec la diagonale non peuplée.
supercat
@supercat - Je viens de pincer le premier exemple de google images. Je viens d'ajouter un autre exemple - est-ce le type de mise en page que vous vouliez dire?
Oli Glaser
@OliGlaser: Oui, bien que je suggère de déplacer les résistances vers les jonctions rangée-colonne. Si vous faites cela, il sera alors possible de piloter neuf LED à la fois, à condition que les pilotes côté haut ou bas puissent le supporter. Alternativement, on pourrait laisser les résistances où elles sont mais ajouter un transistor à chaque jonction rangée-colonne (pour le schéma comme illustré, un NPN avec la base sur la rangée, l'émetteur sur la colonne et le collecteur attaché au rail positif ). L'ajout du transistor réduirait considérablement la force d'entraînement côté élevé requise pour faire fonctionner neuf LED à la fois.
supercat