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?
Hi
>Macht das irgendeinen Sinn, hier Pull-ups zu ziehen?
Nein. Schalte einfach nach GND.
MfG Spess
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...
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?
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.
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.
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?
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!
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.
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.
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.
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.
> 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
}
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.
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
Alles klar, das wollte ich nur gewusst haben, weil ich geschlagene 4 STd damit verbracht habe, herauszufinden, ob das geht. Danke dir
> 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.
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
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.