www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Richtiges anschliessen von Tastern und LED's an einen ATMega


Autor: Michael Sutter (suttermichi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin dabei mir ein AVR Experimentierboard mit einem ATMega8 
aufzubauen. Nun habe ich folgende Frage: Wie schliesse ich die LED's und 
die Taster richtig an. Ich finde nähmlich egal wieviele Schaltpläne ich 
auch suche immer die gleiche Lösung wie im Dateinanhang.

Aber das finde ich doch sehr unlogisch, denn in diesem Fall leuchtet ja 
die LED, wenn der Portausgang auf logisch 0 steht. Und wenn ich den 
Taster drücke liegt am Porteingang eine logische 0 an.

Ich finde das müsste doch genau umgekehrt sein, also die LED auf GND. 
Und die Taster auf VCC (Widerstand auf GND). Damit bei einer logischen 1 
am Portausgang auch die LED brennt und der Taster beim drücken eine 
logische 1 an den Porteingang liefert.

Oder versthe ich da etwas falsch??

Gruss

Michi

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Sutter schrieb:

> Ich bin dabei mir ein AVR Experimentierboard mit einem ATMega8
> aufzubauen. Nun habe ich folgende Frage: Wie schliesse ich die LED's und
> die Taster richtig an. Ich finde nähmlich egal wieviele Schaltpläne ich
> auch suche immer die gleiche Lösung wie im Dateinanhang.

Im Regelfall lässt man beim Taster den Widerstand auch noch weg.
Der µC hat einen eingebaut und kann ihn bei Bedarf zuschalten.

> Aber das finde ich doch sehr unlogisch, denn in diesem Fall leuchtet ja
> die LED, wenn der Portausgang auf logisch 0 steht. Und wenn ich den
> Taster drücke liegt am Porteingang eine logische 0 an.

Macht ja nichts :-)
Software ist geduldig. Der ist es egal, ob sie jetzt einen Pin auf 1 
oder auf 0 setzen muss, damit die LED leuchtet :-)

Der Grund dafür liegt in der Vergangenheit:
Frühere Prozessoren konnten mehr Strom vertragen, wenn der Strom von 
aussen in den µC hineinläuft (also von extern + über den Prozessor nach 
GND) als umgekehrt.

Und das ist dann so geblieben. Es gibt nichts was sich so hartnäckig 
hält, wie eine Tradition.

> Und die Taster auf VCC (Widerstand auf GND). Damit bei einer logischen 1
> am Portausgang auch die LED brennt und der Taster beim drücken eine
> logische 1 an den Porteingang liefert.

Bei Eingabeelemente macht man das alerdings wirklich gerne umgekehrt. 
Ruhezustand ist High, Betätigung ist Low.
Ist der Ruhezustand auf einem Draht die positive Spannung, dann merkst 
du sofort, wenn der Draht abgerissen ist: Die Schaltung dahinter geht 
dann auf Dauerfeuer über.

Hast du aber Masse als Ruhezustand, dann kannt du den Draht abreissen 
und merkst meistens gar nichts, bis du den Taster zum ersten mal 
betätigst und sich nichts rührt.

Lieber einen Fehler frühzeitig durch Fehlfunktion zu erkennen als dann 
wenn man die Funktion brauchen würde und nichts rührt sich.

Dazu kommt natürlich, dass die AVR zwar PullUp Widerstände eingebaut 
haben aber keine PullDown

Autor: Michael Sutter (suttermichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heisst im Klartext, dass ich am besten einfach von vorneherein 
umdenke und wenn ich die LED leuchten lassen will eine 0 anstelle einer 
1 setzten muss. Und bei den Tastern genau so.

Richtig??

Gruss

Michi

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>dass ich am besten einfach von vorneherein
>umdenke und wenn ich die LED leuchten lassen will eine 0 anstelle einer
>1 setzten muss.

Nö. Musst du nicht, du kannst es auch anders herum machen. Und gerade 
für Experimentierboards, wo man mal schnell was probieren, und den 
Portzustand per LED anzeigen will, ist "1 = An" eingängiger. Das das bei 
älteren Prozessoren nicht geht, mag ja so sein, aber früher war eben 
doch nicht alles besser.

Die Schaltung dazu solltest du alleine hinbekommen :-)

Oliver

Autor: Michael Sutter (suttermichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also dann kann ich es doch so machen:

Michael Sutter schrieb:
> Ich finde das müsste doch genau umgekehrt sein, also die LED auf GND.
> Und die Taster auf VCC (Widerstand auf GND). Damit bei einer logischen 1
> am Portausgang auch die LED brennt und der Taster beim drücken eine
> logische 1 an den Porteingang liefert.

Ich wusste eben gar nicht ob das überhaupt so geht! Oder ob es aus 
irgend einem Grund so sein muss wie die angehängte Schaltung.


Gruss

Michi

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Sutter schrieb:
> Und die Taster auf VCC (Widerstand auf GND). Damit ... der Taster beim drücken 
>eine logische 1 an den Porteingang liefert.

Das kann man machen, allerdings ist beim AVR da schalten gegen Masse 
üblich, weil der Pull-Up-Widerstände schon eingebaut hat. Pull-Down muß 
man extra dranbasteln.

Oliver

Autor: Michael Sutter (suttermichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK dann werde ich das so machen!
Finde ich nähmlich viel logischer wenn bei 1 die LED brennt und bei 0 
nicht!

Vielen Dank!!!!


Gruss

Michi

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
suttermichi aus OB bei TT?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Sutter schrieb:
> OK dann werde ich das so machen!
> Finde ich nähmlich viel logischer wenn bei 1 die LED brennt und bei 0
> nicht!

Man gewöhnt sich an alles.
#define  SET_1( PORT, BIT )    PORT &= ~( 1 << (BIT) )
#define  SET_0( PORT, BIT )    PORT |=  ( 1 << (BIT) )

#define  LED_ON( PORT, BIT )   SET_0( PORT, BIT )
#define  LED_OFF( PORT, BIT )  SET_1( PORT, BIT )

#define LED_PORT   PORTB
#define LED_DDR    DDRB
#define ALARM_LED  PB0
#define READY_LEF  PB1


int main()
{
  LED_DDR = ( 1 << ALARM_LED ) | ( 1 << READY_LED );

  while( 1 ) {
    ....


    LED_ON( LED_PORT, ALARM_LED );

    ...

    LED_OFF( LED_PORT, ALARM_LED );
    LED_ON( LED_PORT, READY_LED );

  }

.... ist letztendlich nur eine Frage, wie man sich die Software aufbaut, 
ob man sich mit diesen 0/1 Geschichten ständig rumschlagen muss oder ob 
das nur an einer Stelle zentral gesammelt ist.

Autor: Blackbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, die Kernfrage war ja nach der Beschaltung auf einem "AVR 
Experimentierboard". Die Betonung liegt da ganz klar auf Experimntieren.

In einer endgültigen Anwenderschaltung kann man es machen, wie man will, 
aber beim Experimentieren kann es schon mal vorkommen, dass man einen 
Eingang, an dem ein Taster hängt, als Ausgang schaltet. Was dann?

Die Taster an GND (oder Vcc) sollten schon mit einem Reihenwiderstand 
von ca. 150 Ohm und einem Pullup (oder Pulldown) von ca. 10 kOhm 
betrieben werden.

Und wenn die LEDs alle über je einem Transistor mit Basis- und 
Kollektor-Widerstand betrieben werden, nutzt man den 
AVR-Ausgangs-Aussteuerbereich von 40mA nicht aus, kann die so 
beschalteten LED-Anzeigen aber auch parallel auf einen Eingang zur 
Pegelkontrolle hängen OHNE Beeinflussung des Pegels.

Wie oben geschrieben - nur zum Experimentieren. Auf dem STK600 ist es 
jedenfalls so gemacht worden


Blackbird

Autor: Blackbird (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Bild von einem ATMega8535/16/32/644-Experimentierboard.
Quarz steckt in einer Fassung, alle 10pol. "Stecker" sind 2reihige 
Stiftleisten mit Ausnahme der beiden Wannenstecker für ISP und JTAG.

Die Beschaltung der Tastern und LEDs ist stromsparend und 
kurzschlußfest.

Blackbird

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Der Grund dafür liegt in der Vergangenheit:
> Frühere Prozessoren konnten mehr Strom vertragen, wenn der Strom von
> aussen in den µC hineinläuft (also von extern + über den Prozessor nach
> GND) als umgekehrt.

Übrigens nicht nur bei historischen Prozessoren - auch beispielsweise 
bei den STM32 (Cortex M3) gilt das:

Datenblatt 
http://www.st.com/stonline/products/literature/ds/...
> Output driving current
> The GPIOs (general purpose input/outputs) can sink or source up to +/-8
> mA, and sink +20 mA (with a relaxed VOL).

Bei AVRs ist es aber wirklich egal.

MfG, Heiko

Autor: Michael Sutter (suttermichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Tipps!

Ich habe am Board nun etwas weiter gelötet, und die LED's und Taster so 
angeschlossen, dass bei einer 1 die LED leuchtet und beim drücken des 
Tasters ein 1 Impuls an den Port geliefert wird.

Ich werde mich nochmals melden, sobald ich das Bord fertig aufgebaut 
habe.

Gruss

Michi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.