Forum: Mikrocontroller und Digitale Elektronik Pinabfrage mit Pullups


von Ralf F. (raffaello)


Angehängte Dateien:

Lesenswert?

Hallo Community,
im Anhang ist eine beispielhafte Schaltung
+5V gehen auf Schalter, die  mit den Pins eines uC verbunden sind.
Die entsprechenden Pins werden als Eingang definiert und gleichzeitig 
werden die Pull-Ups gezogen, angenommen DDRA=0x00 & PORTA=0xFF.
Je nachdem, welcher Schalter umgelegt ist, soll mit einer if-Abfrage 
abgefragt werden und das dazugehörige Programm ausgeführt werden.

Macht das irgendeinen Sinn, hier Pull-ups zu ziehen?

von spess53 (Gast)


Lesenswert?

Hi

>Macht das irgendeinen Sinn, hier Pull-ups zu ziehen?

Nein. Schalte einfach nach GND.

MfG Spess

von STK500-Besitzer (Gast)


Lesenswert?

Ralf F. schrieb:
> Macht das irgendeinen Sinn, hier Pull-ups zu ziehen?

Nö.
Schöner wäre es eh, den Schalter gegen Masse schalten zu lassen und die 
eingebauten Pullups zu benutzen.
Allerdings nur bis zu einer bestimmten Leitungslänge...

von Input (Gast)


Lesenswert?

Ralf F. schrieb:
> Macht das irgendeinen Sinn, hier Pull-ups zu ziehen?

Welcher Pegel steht am Eingang an, wenn der Schalter geschlossen ist, 
und welcher Pegel steht an, wenn der Schalter offen ist und der Pullup 
wirkt?

von Ralf F. (raffaello)


Lesenswert?

Input schrieb:
> Ralf F. schrieb:
>> Macht das irgendeinen Sinn, hier Pull-ups zu ziehen?
>
> Welcher Pegel steht am Eingang an, wenn der Schalter geschlossen ist,
> und welcher Pegel steht an, wenn der Schalter offen ist und der Pullup
> wirkt?

Das muss ich noch herausfinden, werde das Ergebnis Montag mal posten.

von Input (Gast)


Lesenswert?

Ralf F. schrieb:
> Das muss ich noch herausfinden, werde das Ergebnis Montag mal posten.

Hey, das geht auch sofort mit Papier und Bleistift. Du sollst Dir das 
überlegen und nicht probieren.

von Ralf F. (raffaello)


Lesenswert?

Wenn ich gegen Masse schalte, liegt am Pin LOW-Potenzial an und dann 
müsste ich in der if-Abfrage vergleichen, ob am Pin LOW-Potenzial 
anliegt?

von STK500-Besitzer (Gast)


Lesenswert?

Ralf F. schrieb:
> Wenn ich gegen Masse schalte, liegt am Pin LOW-Potenzial an und dann
> müsste ich in der if-Abfrage vergleichen, ob am Pin LOW-Potenzial
> anliegt?

Ja!

von Ralf F. (raffaello)


Lesenswert?

Input schrieb:
> Ralf F. schrieb:
>> Das muss ich noch herausfinden, werde das Ergebnis Montag mal posten.
>
> Hey, das geht auch sofort mit Papier und Bleistift. Du sollst Dir das
> überlegen und nicht probieren.

Ok, werd ich gleich machen. Habe vor kurzem mit uC angefangen und am 
Anfang ist das recht viel Input.

von Ralf F. (raffaello)


Lesenswert?

An der Stelle Danke für die schnelle Hilfe.

von Ralf F. (raffaello)


Angehängte Dateien:

Lesenswert?

Input schrieb:

> Welcher Pegel steht am Eingang an, wenn der Schalter geschlossen ist,
> und welcher Pegel steht an, wenn der Schalter offen ist und der Pullup
> wirkt?

Hallo Input,
ich hab mich daran versucht und vielleicht kannst du mir sagen, ob ich 
auf dem richtigen Weg bin. Meine Lösung ist im Anhang.
Letztlich ist es egal, wie die Beschaltung aussieht, solange ich meine 
if-Abfrage so schreibe, dass das herauskommt, was ich haben will.
Bsp.
wenn PA0 = LOW --> mach nichts
wenn PA1 = High -->mach was
oder umgekehrt
wenn PA0 = High -->mach nichts
wenn PA1 = Low --> mach was
kann man das so plakativ sagen? Auch wenn es professionelle oder 
gebräuchliche Muster gibt bei einer Pin-Abfrage.

von Karl H. (kbuchegg)


Lesenswert?

Ralf F. schrieb:

> kann man das so plakativ sagen?

Ich denke du hast es jetzt.

Der springende Punkt ist, dass du elektrisch den Eingang nie offen haben 
willst. Das der also kein definiertes Potential aufweist. Denn dann 
sammelt der Eingang jedes elektromagnetische Feld aus der Umgfebung ein, 
das er kriegen kann. Und davon gibt es rund um uns jede Menge. Jedes 
Verlängerungskabel, an das du deine Stehlampe angeschlossen und 
eingeschaltet hast, ist eine kleine Antenne die ein 50Hz Feld abstrahlt. 
Jeder Fernseher strahlt ein bischen was ab, jeder MP3 Player, du selber 
bist eine Antenne, über die du elektromagnetische Felder aufsammelst und 
wenn du in die Nähe des µC kommst, strahlst du diese wieder auf den 
Eingang ein etc.

Also: Der Eingang darf nicht einfach offen bleiben


     o------------------------------> Eingang vom µC

wie erreichst du das?
Na, zb in dem ein Widerstand nach +5V geschaltet wird

                       o 5V
                       |
                      +-+
                      | |  R
                      +-+
                       |
    o------------------+------------> Eingang vom µC


Wenn jetzt nichts weiter auf der Leitung ist, dann zieht dieser 
Widerstand die Leitung auf +5V. d.h. am µC hast du einen definierten 
Pegel von +5V. Wenn der Widerstand nicht zu groß ist, dann sind die 
Felder in der Umgebung zu schwach, als das sie daran was ändern könnten.

Aber: DU willst ja auch definiert dem µC etwas mitteilen können. Mit 5V 
alleine kannst du nichts mitteilen. Du brauchst einen 2.ten Zustand. Der 
besteht darin, dass du die Leitung definiert auf 0 ziehst. Da der 
Widerstand R einen gewissen Wert hat, brauchst du einen kleineren 
Widerstand, damit du die Leitung einigermassen vernünftig auf 0 ziehen 
kannst. Der kleinste mögliche Widerstand ist ein Kurzschluss. Und ein 
Taster macht gezielt einen direkte Verbindung, schliesst also seine 
Anschlüsse kurz

                       o 5V
                       |
                      +-+
                      | |  R
                      +-+
                       |
    o--------+---------+------------> Eingang vom µC
             |
           \
            \  Taster
             |
             |
     --------+--------- 0V

Wird der Taster (oder Schalter) geschlossen, dann besteht eine direkte 
Verbindung (ein Kurzschluss) der Eingangsleitung mit Masse. Und dann hat 
der Widerstand R keine Chance mehr die Leitung auch nur ein bischen in 
Richtung +5V zu ziehen. Die Leitung hat definiert 0V Potential, welches 
sich für den µC als 0 präsentiert.

Perfekt. Genau das was du brauchst. Du hast 2 verschiedene Pegel am 
Eingang des µC
  einmal +5V, welches sich in deinem Programm als 1-Bit am 
entsprechenden Eingangsport präsentiert und die dann entsteht, wenn der 
Taster(SChalter) offen ist. Der Widerstand R sorgt dafür.

  und einmal Masse, welches sich in deinem Programm als 0-Bit 
präsentiert. Sie entsteht, weil der Taster eine direkte Verbindung mit 
Masse herstellt und der Widerstand das Potential nicht mehr ziehen kann. 
Gegen direkte Masse hat er keine Chance.

Aber: in keinem Fall ist die Leitung einfach offen. Egal ob der Taster 
gedrückt oder bnicht gedrückt ist, immer gibt es eine definierte 
Verbindung mit entweder +5V oder mit 0. Mit 0 auf direktem Weg, mit +5V 
auf indirektem Weg über den Widerstand.


Das ist der entscheidende Punkt. Und natürlich muss man dann eben das 
Programm so gestalten, dass es das berücksichtigt. Aber das ist das 
kleinere Problem. Im Programm ist das nur ein Zahlenwert und den kann 
ich austauschen wie ich lustig bin bzw. die jeweils entsprechend andere 
Abfrage machen. Das kostet mir nichts.


So, jetzt erhebt sich noch die Frage: Kann man das ganze auch anders rum 
machen? Also den Taster nach +5V schalten lassen und der Widerstand soll 
gegen Masse ziehen


                   +5V
                   |
                 Taster
                   |
        o+---------+-------------> µC
                   |
                   R
                   |
             ------+----- Masse

Und die Antwort drauf ist: Klar kann man! Letzten Endes ist es ja egal, 
ob die Leitung bei nicht gedrücktem Taster jetzt auf 0 oder auf +5V 
liegt. Den entscheidenden Punkt 'Leitung darf nicht einfach offen sein' 
hat man genauso erreicht.
Warum macht man dann die andere Variante lieber?
Ganz einfach: Weil der AVR den entsprechenden Widerstand nach +5V schon 
eingebaut hat. Man muss ihn nur per Software aktivieren und er ist da. 
Extern braucht man dann nur den Taster(Schalter) anschliessen und fertig 
ist die Sache.

von Ralf F. (raffaello)


Lesenswert?

Wunderbar, dann habe ich das Thema für mich begriffen. Und einen großen 
Dank an Dir Karl Heinz für die sehr schöne und detaillierte Erklärung.

von Roman (Gast)


Lesenswert?

> Macht das irgendeinen Sinn, hier Pull-ups zu ziehen?

Geht diese Art der Pin-Abfrage nicht auch? Letzendlich spart man damit 
den Strom, da entweder der Schalter offen ist und kein Strom fließt und 
bei geschlossenem Schalter die Spannungen sich aufheben?
Wie sieht dann die if-Abfrage (angenommen DDRA=0x00 & PORTA=0xFF) aus, 
wenn ein Schalter umgelegt ist und eine Anweisung ausgeführt werden 
soll, Bsp. für PA0?

if((PINA & (1<<PA0))//wahr
{
 Anweisung
}

von Karl H. (kbuchegg)


Lesenswert?

Roman schrieb:
>> Macht das irgendeinen Sinn, hier Pull-ups zu ziehen?
>
> Geht diese Art der Pin-Abfrage nicht auch?

Du beziehst dich auf das allererste Bild in diesem Thread?

Wenn ja:

Jetzt denkst du noch mal ganz scharf nach.
Wenn der Schalter offen ist, zieht der Pullup den Pin auf +5V.
Wenn der Schalter geschlossen ist, zieht der Schalter den Pin auf +5V.

Wo ist also der Unterschied, ob der Pin offen oder geschlossen ist? In 
beiden Fällen liegt der Pin auf +5V und der µC liest eine 1 ein. Wenn 
aber der µC in beiden Fällen eine 1 einliest, wie unterscheidest du dann 
zwischen offenem und geschlossenem Schalter?

Und wenn du jetzt einwendest: dann benutz ich halt keinen Pullup, dann 
scroll einfach ein bischen nach oben und lies den etwas längeren Artikel 
den ich da geschrieben habe. Insbesondere den ersten Absatz.

von oldmax (Gast)


Lesenswert?

Hi
> Letzendlich spart man damit den Strom, ....
Da muss ich auch mal einen schlauen Spruch lassen.. Strom kan man nicht 
sparen, da er in einem Stromkreis überall gleich ist... wenn du etwas 
sparen möchtest, muss es ja irgendwoanders hin..
Ok, genug geblödelt. Der Grund, warum ich mich hier melde ist eigentlich 
ein anderer:
Wenn man Schalter nach GND abfragt ist häufig die nachgeschaltete Logik 
etwas schwierig. Bei einem gedrückten Taster denken wir automatisch an 
eine "1" und so schleichen sich schnell Fehler ein. Ich habe mir 
angewöhnt, nach dem Einlesen die Signale zu drehen (Assemblerbefehl COM 
oder eine Exclusiv-Oder mit "1"). Damit bin ich wieder richtig mit der 
Annahme, das ein gedrückter Taster eine "1" ist.  Natürlich kann man 
Schalter und Taster auch an VCC schalten, dann müssen aber die interen 
Pull-Ups aus und externe Pull-Downs dran. Wie gesagt, mit einem offenen 
Eingang arbeitet es sich nicht sauber. Kann funktionieren, muss aber 
nicht.
Gruß oldmax

von Roman (Gast)


Lesenswert?

Alles klar,
das wollte ich nur gewusst haben, weil ich geschlagene 4 STd damit 
verbracht habe, herauszufinden, ob das geht.
Danke dir

von Roman (Gast)


Lesenswert?

> Wo ist also der Unterschied, ob der Pin offen oder geschlossen ist? In
> beiden Fällen liegt der Pin auf +5V und der µC liest eine 1 ein. Wenn
> aber der µC in beiden Fällen eine 1 einliest, wie unterscheidest du dann
> zwischen offenem und geschlossenem Schalter?

if(!(PINA & (1<<PA0))
{
//Aktion
}
Es geht, keine Ahnung wieso.

von (prx) A. K. (prx)


Lesenswert?

Roman schrieb:

> Es geht, keine Ahnung wieso.

Realität != Bild?

von Roman (Gast)


Lesenswert?

A. K. schrieb:
> Roman schrieb:
>
>> Es geht, keine Ahnung wieso.
>
> Realität != Bild?

in dem Fall Realität == Bild
wie dem auch sei, schönen Tag

von Karl H. (kbuchegg)


Lesenswert?

Roman schrieb:
> A. K. schrieb:
>> Roman schrieb:
>>
>>> Es geht, keine Ahnung wieso.
>>
>> Realität != Bild?
>
> in dem Fall Realität == Bild
> wie dem auch sei, schönen Tag

Na dann mach mal folgendes: (Pullup ist aus.)

Greif mal mit deinem Finger auf den Pin.
Leg dein Handy neben die Schaltung und lass dich anrufen
Leg die Schaltung in die Nähe vom Fernseher.
(oder was du sonst noch so in deiner Umgebung hast und sehr 
wahrscheinlich irgendwelche elektromagnetischen Felder erzeugt. Alles 
mit einem Motor ist zb ein heisser Kandidat, stärkere Trafos ebenfalls)

von Roman (Gast)


Lesenswert?

Freunde,
ich entschuldige mich. In EAGLE war das Monster auf 5V aber auf der 
Platine auf GND!
:-)
falls wir schon dabei sind, habt ihr Erfahrungen mit ADC-Kanälen, 
insbesondere beim Wechsel des ADC-Kanals in Abhängigkeit von der 
Pin-Abfrage?

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.