Connexion d'un clavier à un AVR


La lecture d'un tel clavier en utilisant des composants logiques numériques, vous avez besoin au moins:
  • un oscillateur, un registre à décalage et une porte marche / arrêt pour générer les signaux de colonne,
  • détection si un des quatre signaux de ligne est égal à zéro,
  • un transcodeur pour la conversion des sept signaux au keycode.
Ou un circuit intégré complet faire tout ce que (probablement vous ne recevrez pas un tel circuit intégré à votre revendeur de pièces électroniques local). Ou vous feriez mieux d'utiliser un micro.

Une matrice de clavier peut être connecté directement à un port E / S d'un AVR, sans composants supplémentaires.
L'exemple montre une connexion aux plus bas sept broches d'E / S de Port B. D'autres ports peuvent être utilisés Similiarly.
Les broches du port PB4..PB6 sont définis en tant que sorties, ils fournissent les signaux de colonne. Les broches du port PB0..PB3 sont utilisés pour lire dans les résultats de la ligne. résistances pull-up sur ces entrées sont activées par le logiciel, les résistances externes ne sont pas nécessaires.

L'exemple de logiciel suivant montre d'abord l'initialisation des ports. Cette partie du logiciel doit être étét exécutée une seule fois au début du programme de l'AVR.

Init-routine

Vérifiez pour une touche enfoncée

Le sous-programme suivant détecte si l'une des 12 touches est pressée. Cette routine est appelée à des intervalles, par exemple dans une boucle à retard ou à l'aide d'une minuterie.

Identifier la touche enfoncée

Maintenant, le clavier est lu. L'un après l'autre port bits de PB6, PB5 et PB4 sont mis à bas et PB0..PB3 sont contrôlés pour des zéros. La paire de registres Z (ZH: ZL) pointe vers un tableau avec les codes de clé. En sortant de la routine, cette paire de points au code clé de la touche enfoncée. En utilisant l'instruction LPM, le code clé est lue à partir de la table dans la mémoire flash du registre R0.

debouncing

Les routines KeyProc et NoKeyPressed doivent la touche enfoncée anti-rebond. Par exemple en comptant un compteur chaque fois est identifié la même clé. Répétez cette opération pour exemple 50 millisecondes. La routine NoKeyPressed efface le compteur et la touche enfoncée. Parce que le calendrier dépend d'autres exigences de synchronisation nécessaires du programme AVR, il ne figure pas ici.

Inconvénients conseils,

Les routines ci-dessus ne laissent plus de temps entre le réglage de l'adresse de colonne et la lecture des informations de ligne. À des fréquences d'horloge élevées et / ou des connexions plus longues entre le clavier et le processeur, il est nécessaire de laisser plus de temps entre écriture et de lecture (par exemple par l'insertion des instructions NOP).
Les résistances tractions internes ont des valeurs autour de 50 kQ. Les longues lignes ou un environnement bruyant peut intervenir et produire des pépins. Si vous aimez moins sensible, ajouter quatre tractions externes.

Un inconvénient du circuit est qu'il nécessite exclusivement sept lignes de port. La modification d'un convertisseur AD et un réseau de résistance (voir chapitre 3) est plus économique et enregistre les lignes portuaires.

3. Connexion à un CAN avec une matrice de résistances

La plupart des petits appareils et Mega-AVR ont aujourd'hui un convertisseur AD à bord. Sans matériel externe supplémentaire ceux-ci sont capables de mesurer des tensions analogiques et les résoudre avec une résolution de 10 bits. Ceux qui veulent les ports ont seulement sauver E / S pour obtenir le clavier pour produire une tension analogique. C'est la tâche pour une matrice de résistance.

Astuce: Une version améliorée de ce texte avec d'autres exemples, un outil logiciel, etc. commandline est disponible ici. Un outil logiciel graphique pour étudier les différentes versions de régime et tailles peuvent être trouvés ici.

matrice de résistance

* K + 1 = 820 ω 1,82k à la masse,
* 3,3 + 680 k ω + ω = 180 4,16k de plus.

A une tension de fonctionnement de 5 volts, une tension divisée de

1,82 * 5 / (1,82 + 4,16) = 1,522 Volt

on le voit sur l'entrée du convertisseur AD. Si l'on considère la tolérance de 5% des résistances, la tension résultante est quelque part entre 1468 et 1627 Volts. Le convertisseur analogique-numérique 10 bits convertit (à 5 V tension de référence) à une valeur comprise entre 300 et 333. Si l'on ignore les deux bits inférieurs du résultat (par exemple, diviser le résultat de l'AD par quatre ou gaucher ajustant le résultat - si le ADC fournit cette fonction) on obtient une valeur de 8 bits entre 74 et 78.
Chaque touche enfoncée produit une gamme de tension typique, être converti en code.

table de codage clé

La matrice utilise des résistances de la ligne E12, qui sont disponibles à chaque magasin électronique. Voilà pourquoi les valeurs de résistance (par exemple 820 ou 3300) sont un peu drôles chiffres.

Les différentes résistances sont nécessaires pour obtenir une courbe lisse de tensions analogiques à partir de ces 12 touches différentes. Si vous pensez qu'il est plus pratique d'utiliser une seule valeur pour tous, essayez de calculer les tensions résultantes. Vous apprendrez rapidement que toutes ces résistances doivent avoir des valeurs différentes. La raison à cela est en partie qu'ils additionnent dans les deux rangées, une autre raison est le diviseur de tension formule, qui est non linéaire. Si vous êtes en mesure de résoudre ce de manière optimale avec quelques formules, essayer. J'ai abandonné très vite.

Ce qui suit est une table pour la matrice affichée ci-dessus qui calcule les résistances résultantes pour chaque touche enfoncée. Bien sûr, si l'on suppose que deux touches peuvent être pressées à la fois, vous devez passer à un clavier PC à la place. Mais pas beaucoup de gens appuyer sur deux touches à la fois.

La deuxième ligne du tableau indique les valeurs de résistance vers la masse, la troisième direction de la tension de fonctionnement. La tension qui résulte de ce que les diviseurs de tension est calculée avec la formule

Étant donné que les résistances disponibles, ont une tolérance de +/- 5% au minimum et maximum doit être calculée. Pour calculer le minimum, toutes les résistances à la masse sont supposés avoir -5%, tous vers CCV sont supposés avoir + 5%. Ce n'est pas très réaliste, mais nous ne voulons pas résistances sélectionner la main et de les tester en été et en hiver.

Les Les tensions qui sont associées avec les touches, et leur variation par la tolérance sont affichées dans le graphique suivant.

Comme on le voit, la tolérance influe uniquement sur les touches du milieu.

Dans le tableau, les valeurs de N sont ajoutés qui résulterait d'une conversion AN avec 8 bits. Cette résolution est très bien que toutes les valeurs ont assez de distance de la précédente et la valeur suivante.

Tensions et reconnaissance de clé

Comme on peut le voir sur la table, il n'y a pas de chevauchement des différentes valeurs de détection pour les clés, en prenant tolérance de 5% des résistances en compte.

Ceux qui aiment jouer avec d'autres combinaisons de résistance, peuvent télécharger la feuille de calcul (en Open-Office-Format. Excel XP-Format).

Aides au matériel convertisseur AD

dispositifs ATtiny dans la plupart des cas ne fournissent que la possibilité d'utiliser une tension générée en interne ou la tension d'alimentation de l'AVR comme référence pour le convertisseur AD. Pour la conversion du clavier que la tension d'alimentation est adapté comme référence. Cette option doit être sélectionnée lors de l'initialisation du matériel convertisseur AD au démarrage du programme.

De nombreux types de ATmega peuvent se connecter la tension de référence à une broche externe, AREF. Cette broche peut être soit entrée ou de sortie. Il est un signal de sortie si l'une de la tension d'alimentation ou la référence interne sont sélectionnés en tant que référence du convertisseur AD. Dans ce cas, la broche AREF devrait avoir un condensateur à la terre afin de réduire davantage le bruit sur la tension de référence. La broche AREF est une entrée, si une source de référence externe est sélectionné en option. Dans ce cas, une source externe fournit la tension de référence. Si une source externe fournit la tension de référence, la matrice du clavier doit également être fourni par cette source. Notez dans ce cas que le clavier consomme jusqu'à 10 mA, pour améliorer la sensibilité au bruit.

ATmega dispositifs permettent d'alimenter le convertisseur AD à partir d'une broche supplémentaire (AVCC) afin de réduire davantage le bruit. Si seul le clavier utilise la conversion AD la faible résolution nécessaire de 8 bits ne nécessite pas une alimentation séparée pour la broche AVCC, il peut être lié à la tension d'alimentation normale. Si d'autres tâches de mesure doivent être effectués sur les autres canaux, la broche AVCC doit être connecté à la tension d'alimentation par l'intermédiaire d'une bobine de 22 uH et doivent être bloquées par un condensateur de 100 nF à la masse.

L'initiation et la lecture du résultat du convertisseur AN

Pour la lecture de la tension de la matrice de clavier un canal de convertisseur analogique-numérique est nécessaire. Le convertisseur AD est lancé une fois lors du démarrage du programme. Les deux exemples de codes montrent une séquence de démarrage pour la conversion simple, ici pour un ATmega8, et un pour une interruption de démarrage automatique conduit de l'ADC, ici pour un ATtiny13.

ATmega8: démarrage manuel de l'ADC

Le premier exemple montre une routine pour une ATmega8, sans interruptions, avec un démarrage manuel et l'arrêt du convertisseur AD. Le signal de clavier est connecté au canal de AD ADC0. S'il vous plaît noter que cette conversion simple nécessite 25 * 128 cycles d'horloge, à 1 horloge Mcs / de 3,2 milli-secondes. Seulement faire de cette façon, tourner en rond, si vous n'avez pas besoin de prendre soin d'autres choses entre ce délai (sauf si ces choses sont faites à l'intérieur des interruptions).

ATtiny13: Lecture automatique de conversion AD, interruption entraînée

Oui, un ATtiny13 avec ses 8 broches peut lire notre matrice du clavier (on ne peut pas connecter la matrice du clavier lui-même en raison du nombre limité de broches d'E / S).

Une routine typique pour cette tâche serait la séquence suivante, qui convertit la tension sur ADC3 (broche 2 du ATtiny13) continously (après conversion complète, la conversion suivante démarre automatiquement). L'exécution en mode d'interruption, il faut définir le vecteur de saut int respectif, par exemple Bien sûr, la pile doit être lancé pour utiliser les interruptions, et l'indicateur d'état d'interruption doit être réglée (SEI).

Le service intadc routine lit le résultat de la conversion AD. Parce que gauche Adjust a été sélectionné, il suffit de lire le MSB du résultat: Le rquie registre fournit continously la valeur actuelle de la matrice de résistance.

Conversion du résultat AD au code clé

Le résultat de la conversion est, en tant que telle, pas très utile. Les tensions et le résultat de conversion ne suivent pas les lois mathématiques faciles (la résistance des valeurs 04.07 à 05.06 - 06.08 à 08.02 doit avoir été conçu par un professeur de mathématiques ivre, la formule V = R1 / (R1 + R2) n'est pas très facile à manipuler ), de sorte que nous puissions mieux utiliser une table pour résoudre nos codes clés. Le tableau ne peut pas être une table de consultation primitive, parce que nous avons 256 différents résultats possibles de la conversion, et nous aimons tables plus minces.

Comme un singe, on monte l'arbre de la matrice en allant étape par étape dans le tableau suivant: Le premier octet est la valeur comparer pour notre résultat de la conversion, le second octet est le code clé, si cette valeur comparer est supérieure à notre résultat. Si le résultat est compris entre 0 et <7: no key is pressed (key code is 255), if it is between 7 and <18 the key code is 1, etc.

Ou, si vous préférez ASCII pour les codes clés: Le code pour la traduction clé va comme ceci: Bien sûr, nous devons vérifier, si aucune touche est pressée (R0 = 0xFF resp si ASCII:. R0 = 0) et nous devons vérifier pour les pépins (si le même code clé est 20 fois ou plus, je le prends pour sérieux.).

Expériences

Le travail matériel et logiciel très fiable. Dans la première version, les valeurs de résistance de la matrice étaient dix fois plus élevé. Cette version était plus vulnérable au bruit HF, par exemple lors de la transmission d'un 2 W émetteur VHF à proximité.

Articles Liés