Pinabfrage mit Pullups

OP #2673203
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?
Angehängte Dateien:
OP #2674196
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.
Angehängte Dateien:
#2674216
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.
Gast #2676855
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
}
#2676879
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.
Gast #2676896
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
Gast #2677101
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.
#2677189
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)
Gast #2678500
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren