Wie lese ich den digitalen Eingang des ATmega16?

18

Was muss ich tun, um einen Digitaleingang (Taster) am ATmega16 auszulesen ? Muss ich Pullup-Widerstände aktivieren oder kann ich einen 10-kOhm-Widerstand verwenden? Was wäre ein einfacher Code? Nur ein einfaches "Schalten Sie die LED ein, wenn sie gedrückt wird".

Gibt es ein Anfänger-Tutorial? Ich habe versucht zu googeln und AVR Freaks , aber alles entwickelt sich zu einem Kampf und ich bekomme keine Antwort. Ich habe wirklich keine Tutorials zu diesem Thema gefunden. Tonnenweise spezifische Dinge, aber nichts einfaches an meinem AVR- Mikrocontroller ...

neugierig
quelle
4
Dies würde in so ziemlich jedem Anfänger-Tutorial beantwortet werden, und ich fürchte, eine vollständige Antwort hier würde Ihr Verständnis mehr untergraben als helfen. Welche vorherigen Anstrengungen haben Sie unternommen, um zu lernen?
Yann Vernier
Ich bin mir nicht sicher, ob du meinen Beitrag gesehen hast oder ob du ihn sehen kannst (Entschuldigung, diese Seite ist immer noch verwirrend ...).
neugierig
2
Warum bearbeitest du nicht deinen Beitrag, um dies genauer widerzuspiegeln und den folgenden Beitrag auch in den ursprünglichen Beitrag aufzunehmen?
Amos
Probieren Sie das From-Scratch-AVR-Tutorial auf dieser AVR-Freaks-Seite aus. Sie werden dort viel mehr Zeug finden.
Leon Heller

Antworten:

24

Brasilianische Grüße!

Zunächst einmal danke Joby für dein Beispiel. Zweitens hat sein Beispiel nur einen kleinen Fehler. Die Nummer 0x20 ist nicht korrekt. Es sollte 0x04 sein. Außerdem würde ich nur als Vorschlag keine hexadezimalen Zahlen wie 0xFB, 0x20 oder 0x04 im Code verwenden. Ich würde vorschlagen, die PIN-Port-Definitionen in der Datei io.h und andere zu verwenden, auf die in der Header-Datei verwiesen wird. Ich habe das Beispiel von Joby unten mit einigen Kommentaren für die Anfänger umgeschrieben.

# 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;
}

/ *

Kommentare für Anfänger

Kommentar Nr. 1: (1 << PD2) erzeugt die Binärzahl 00000100. Die Operation "~" kippt alle Ziffern, dh die Binärzahl ist jetzt 11111011. Schließlich wendet das & = das logische "AND" zwischen DDRD und 11111011 an und das Ergebnis wird erneut platziert im DDRD-Speicher. Hinweis: Der Operator "AND" vergleicht jedes Bit im DDRD-Speicher mit der obigen Binärzahl. Wenn das Bit in DDRD 0 ist und das Bit in der Binärdatei an derselben Bite-Position 1 ist, ist das resultierende Bit 0, wenn die DDRD 1 ist und das Bit in der Binärdatei 1 ist, ist das resultierende Bit 1, und wenn das Bit in der DDRD ist 1 oder 0 und das Bit in der Binärdatei ist 0, dann ist das resultierende Bit immer 0. Zusammenfassend ändert der Befehl DDRD & = ~ (1 << PD2) nur das Bit PD2 auf Null und lässt die anderen Einsen (Nullen oder Einsen) unberührt. Es scheint ein bisschen kompliziert zu sein, aber nachdem Sie sich daran gewöhnt haben, ist es die beste Möglichkeit, ein bisschen in einem Biss zu ändern, ohne die anderen Teile zu ändern.

Kommentar Nr. 2 : (1 << PD2) erzeugt die Binärdatei 00000100. Mit dem Befehl "PIND & 0000100" wird unter Verwendung der in Kommentar Nr. 1 beschriebenen Logik "AND" nur geprüft, ob die PIND2 (unser Eingangs-Pin, an dem der Taster angeschlossen ist) zu) ist auf hoch gesetzt oder nicht. Alle anderen Pins sind FALSE, da die Binärbits auf 0 gesetzt sind, und da das Binärbit # 2 auf 1 gesetzt ist, ist die IF-Anweisung nur dann TRUE, wenn der PD2-Eingang auf High gesetzt ist, oder FALSE, wenn der PD2-Eingang auf 0 gesetzt ist auf niedrig setzen.

Kommentar Nr. 3 : Gemäß der in Kommentar Nr. 1 erläuterten Logik setzt dieser Befehl den Ausgangspin PINB2 in Port PORTB auf Hochspannung. Wenn Ihre LED korrekt mit einem Widerstand von ~ 300 Ohm an diesen Pin-Port angeschlossen ist und dieser Widerstand mit Masse verbunden ist, sollte die LED aufleuchten.

Kommentar Nr. 4 : Die LED sollte aus den gleichen Gründen, die in den vorherigen Kommentaren erläutert wurden, erlöschen.

Schlussbetrachtungen:

a) Um Spannungsschwankungen im Eingangspin PD2 zu vermeiden, wenn der Druckknopf nicht gedrückt wird (offener Stromkreis), empfehle ich dringend, einen Pull-Down-Widerstand (1 kOhm oder höher) anzubringen, damit die LED nicht versehentlich aufleuchtet zu dieser zufälligen Spannungsschwingung.

b) Hinweis zum Haftungsausschluss: Die hier beschriebenen Ideen dienen nur zu Informationszwecken und sollten NICHT in realen Systemen verwendet werden, bevor Sie einen Experten für Elektronik konsultiert haben.

* /

Gemeinschaft
quelle
3
Ich möchte Sie nicht dazu ermutigen, Ihre E-Mail-Adresse anzugeben, da die Korrespondenz per E-Mail die Kommunikation privat macht. Davon kann sonst niemand profitieren. Wenn Sie Ihre E-Mail-Adresse jedoch wirklich für die private Kommunikation bereitstellen möchten, finden Sie dies am besten in Ihrem Profil.
Daniel Grillo
Ist es nicht umgekehrt - # 3 schaltet die LED aus, # 4 schaltet die LED ein?
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
quelle
Vielen Dank an @joby Taffey für den mitgelieferten Link. Ich habe nach EEPROM-Funktionen gesucht und viel Hilfe von mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c erhalten. Vielen Dank.
Bishal Paudel
0

Wenn Sie mit einem digitalen Eingang eines mechanischen Schalters arbeiten, sollten Sie auch berücksichtigen, dass die Kontakte springen und sich so ändern, dass ein Tastendruck in einen mehrfachen Tastendruck umgewandelt wird.

Wenn Sie beispielsweise eine LED einschalten, während Sie die Taste gedrückt halten, müssen Sie sich wahrscheinlich nicht um das Entprellen kümmern. Für etwas komplizierteres (wie das Umschalten der LED beim Drücken einer Taste) ist das Entprellen ein Muss.

Jack Ganssle hat einen guten Leitfaden zum Entprellen

Mike
quelle