Comment lire une entrée numérique sur ATmega16?

18

Que dois-je faire pour lire une entrée numérique (bouton-poussoir) sur ATmega16 ? Dois-je activer les résistances de pullup ou puis-je en utiliser une de 10 kohms? Que serait un simple code? Juste un simple 'Allumez la LED lorsque vous appuyez dessus'.

Existe-t-il un tutoriel pour débutant? J'ai essayé de googler et d' AVR Freaks , mais tout évolue simplement vers un combat là-bas et je n'ai pas ma réponse. Je n'ai vraiment trouvé aucun tutoriel sur ce genre de choses. Des tonnes de choses spécifiques mais rien de simple à propos de mon microcontrôleur AVR ...

curieuse
la source
4
Cela serait répondu dans à peu près n'importe quel tutoriel pour débutant, et je crains qu'une réponse complète ici ne nuise à votre compréhension plus qu'à l'aide. Quel effort préalable avez-vous fait pour apprendre?
Yann Vernier
Je ne sais pas si vous avez vu mon message ou êtes-vous en mesure de le voir (désolé encore un peu confus à propos de ce site ...) Mais je connais le code, disons que ma question est: est-ce que je connecte juste une broche à GND et son faible?
curieux
2
Pourquoi ne pas modifier votre publication pour refléter plus précisément cela et inclure également la publication ci-dessous dans la publication d'origine.
Amos
Essayez le didacticiel From-Scratch AVR sur cette page AVR Freaks. Vous y trouverez beaucoup plus de choses.
Leon Heller

Réponses:

24

Salutations brésiliennes!

Merci tout d'abord Joby pour votre exemple. Deuxièmement, son exemple ne comporte qu'une erreur mineure. Le nombre 0x20 n'est pas correct. Il doit s'agir de 0x04. De plus, à titre de suggestion, je n'utiliserais pas de nombres hexadécimaux comme 0xFB, 0x20 ou 0x04 dans le code. Je suggérerais d'utiliser les définitions de port PIN trouvées dans l'io.h et d'autres référencées par le fichier d'en-tête. J'ai réécrit l'exemple de Joby ci-dessous, avec quelques commentaires pour les débutants.

# include <avr/io.h>

int main (void)
{
    // set all pins on PORTB for output
    DDRB = 0xFF;

    // set port pin PORTD2 as input and leave the others pins 
    // in their originally state (inputs or outputs, it doesn't matter)
    DDRD &= ~(1 << PD2);        // see comment #1

    while (1) 
    {
        if (PIND & (1<<PD2))    // see comment #2
            PORTB |= (1<<PB2);  // see comment #3
        else
            PORTB &= ~(1<<PB2); // see comment #4
    }
    return 0;
}

/ *

commentaires pour les débutants

commentaire # 1: (1 << PD2) génère le binaire 00000100. L'opération "~" inverse tous les chiffres, c'est-à-dire que le binaire est maintenant 11111011. Enfin le & = applique la logique "ET" entre DDRD et 11111011 et le résultat est à nouveau placé dans la mémoire DDRD. Remarque: ce que l'opérateur "ET" fait pour chaque bit de la mémoire DDRD, il le compare au nombre binaire ci-dessus. Si le bit dans DDRD est 0 et le bit dans le binaire à la même position de morsure est 1, alors le bit résultant est 0, si le DDRD est 1 et le bit dans le binaire est 1, le bit résultant est 1, et si le bit dans le DDRD est 1 ou 0 et le bit dans le binaire est 0 alors le bit résultant est toujours 0. En résumé, la commande DDRD & = ~ (1 << PD2) modifie uniquement le bit PD2 à zéro et laisse les autres (zéros ou uns) intacts. Cela semble un peu compliqué, mais après vous y être habitué, c'est le meilleur moyen de changer un peu en une bouchée sans changer les autres bits.

commentaire # 2 : (1 << PD2) génère le binaire 00000100. En utilisant la même logique "ET" décrite dans le commentaire # 1, la commande "PIND & 0000100" vérifie uniquement si le PIND2 (notre broche d'entrée où le bouton-poussoir est connecté) to) est réglé sur élevé ou non. Toutes les autres broches seront FAUX puisque les bits binaires sont mis à 0, et puisque le bit binaire # 2 est mis à 1, l'instruction IF ne sera VRAIE que si l'entrée PD2 est réglée à haut ou FAUX si l'entrée PD2 est réglé sur faible.

commentaire # 3 : En suivant la logique expliquée dans le commentaire # 1, cette commande définit la broche de sortie PINB2 dans le port PORTB sur haute tension. Si votre LED est correctement connectée à ce port de broche avec une résistance de ~ 300 ohms et que cette résistance est connectée à la masse, la LED doit s'allumer.

commentaire # 4 : La LED devrait s'éteindre pour les mêmes raisons expliquées dans les commentaires précédents.

Considérations finales:

a) Pour éviter l'oscillation de tension dans la broche d'entrée PD2 lorsque le bouton-poussoir n'est pas enfoncé (circuit ouvert), je recommande fortement de placer une résistance de rappel (1 kOhm ou plus), afin que la LED ne s'allume pas accidentellement en raison à cette oscillation de tension aléatoire.

b) Une note de non-responsabilité: Les idées décrites ici doivent être utilisées uniquement à des fins éducatives et elles ne doivent PAS être utilisées dans un système réel avant de consulter un expert en électronique.

* /

Communauté
la source
3
Je ne vous encourage pas à donner votre email car la correspondance par email rend la communication privée. Donc, personne d'autre ne peut en bénéficier. Mais si vous voulez vraiment fournir votre e-mail pour des communications privées, le meilleur endroit pour le faire est dans votre profil.
Daniel Grillo
N'est-ce pas l'inverse - # 3 éteint la led, # 4 allume la led?
sitilge
2

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/#digital-in

#include <avr/io.h>

/*
 * Assumptions:
 *  - LED connected to PORTB.2
 *  - Switch connected to PORTD.2
 */

int main (void)
{
    /* set PORTB for output*/
    DDRB = 0xFF;
    /* set PORTD for input*/
    DDRD &= 0xFB;
    PORTD |= 0x04;

    while (1) {
        if (PIND & 0x04)
            PORTB &= ~0x20;
        else
            PORTB |= 0x20;
    }
    return 0;
}
Toby Jaffey
la source
Merci à @joby Taffey pour le lien fourni. Je cherchais des fonctions EEPROM et j'ai reçu beaucoup d'aide de: mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c Merci beaucoup.
Bishal Paudel
0

Une autre chose à considérer lors du traitement d'une entrée numérique à partir d'un interrupteur mécanique est le rebond des contacts - changer ce qui devrait être une simple pression de bouton en ce qui ressemble à plusieurs pressions.

Pour quelque chose comme allumer une LED lorsque le bouton est maintenu enfoncé, vous n'avez probablement pas à vous soucier du rebond. Pour quelque chose d'un peu plus compliqué (comme basculer la LED sur la touche), le anti-rebond est un must.

Jack Ganssle a un bon guide pour anti-rebond

Mike
la source