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


von Michael S. (suttermichi)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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

von Michael S. (suttermichi)


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

von Oliver (Gast)


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

von Michael S. (suttermichi)


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

von Oliver (Gast)


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

von Michael S. (suttermichi)


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

von Bastler (Gast)


Lesenswert?

suttermichi aus OB bei TT?

von Karl H. (kbuchegg)


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.
1
#define  SET_1( PORT, BIT )    PORT &= ~( 1 << (BIT) )
2
#define  SET_0( PORT, BIT )    PORT |=  ( 1 << (BIT) )
3
4
#define  LED_ON( PORT, BIT )   SET_0( PORT, BIT )
5
#define  LED_OFF( PORT, BIT )  SET_1( PORT, BIT )
6
7
#define LED_PORT   PORTB
8
#define LED_DDR    DDRB
9
#define ALARM_LED  PB0
10
#define READY_LEF  PB1
11
12
13
int main()
14
{
15
  LED_DDR = ( 1 << ALARM_LED ) | ( 1 << READY_LED );
16
17
  while( 1 ) {
18
    ....
19
20
21
    LED_ON( LED_PORT, ALARM_LED );
22
23
    ...
24
25
    LED_OFF( LED_PORT, ALARM_LED );
26
    LED_ON( LED_PORT, READY_LED );
27
28
  }

.... 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.

von Blackbird (Gast)


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

von Blackbird (Gast)


Angehängte Dateien:

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

von Heiko (Gast)


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/13586/stm32f101c8.pdf
> 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

von Michael S. (suttermichi)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.