[erledigt] Pull-up-Frage

Hallo zusammen!

Wenn man einen Taster an den Arduino anschließt, tut man das ja üblicherweise so, dass er den betreffenden Pin mit GND verbindet, wenn man den Taster drückt. Den Pin konfiguriert man dann so, dass der interne Pull-up-Widerstand aktiviert wird, wodurch ein digitalRead() bei nicht betätigtem Taster immer HIGH ergibt.

Für Anfänger ist das häufig verwirrend, weil man (also zumindest ich, als ich noch Anfänger war) einen betätigten Taster eher mit HIGH als mit LOW assoziiert. Wenn der Arduino je Pin einen Pull-down-Widerstand hätte, könnte man die Tasterei so behandeln, wie man es als Anfänger erwartet.

Gibt es einen Grund, warum man das so regelt?

Gruß

Gregor

hi,

möglicher grund:

auf einer platine hab' ich überall GND verteilt, meist mit einer ground plane. V+ müßte man extra hinlegen.

gruß stefan

Schaltungstechnisch ist es besser GND herumzuführen als die Versorgungsspannung.

Pullups sind Open-Collector freundlicher und überleben daher Sparmaßnahmen was Chipfläche angeht länger.

Viele Microcontroller haben Pullups und Pulldowns, wenn ich mich recht entsinne sogar der Due.

Und was die Logik der Tasten angeht, ob jetzt LOW gedrückt ist, oder HIGH, ist völlig egal. Mach dir klar, daß beide Zuordnungen völlig willkürlich sind und daß ein invertiertes Signal sowieso den gleichen Informationsgehalt wie ein nicht invertiertes hat.

Whandall: Und was die Logik der Tasten angeht, ob jetzt LOW gedrückt ist, oder HIGH, ist völlig egal. Mach dir klar, daß beide Zuordnungen völlig willkürlich sind und daß ein invertiertes Signal sowieso den gleichen Informationsgehalt wie ein nicht invertiertes hat.

Dass die Zuordnung willkürlich ist, ist klar. Ich bin nur gewohnt, dass man die Dinge üblicherweise so gestaltet, dass man sie intuitiv richtig handhabt/interpretiert.

Gruß

Gregor

Programmierer machen üblicherweise aus nicht-intuitiven Bitmustern was auch immer sie sollen, wenn denn genau definiert ist, welches irre Muster wann was bedeutet.

Der Chiphersteller möchte es möglichst billig haben, ohne auf Möglichkeiten zu verzichten.

Intuitive Bedienung, Sicherheit, Bequemlichkeit etc rangiert auf der Entwicklungsebene auf einem sehr niedrigen Platz.

Du kannst dir ja auch eine Klasse basteln, die die tatsächliche Polarität der Tasten versteckt, eine Tochterklasse von Bounce müsste da nicht viel Kode enthalten.

Whandall: Du kannst dir ja auch eine Klasse basteln, die die tatsächliche Polarität der Tasten versteckt, eine Tochterklasse von Bounce müsste da nicht viel Kode enthalten.

Mir geht es nicht darum, die Polarität zu verstecken oder so. Ich wollte nur wissen, warum das so geregelt ist.

Die Argumente von Dir und Eisbär (billig, Ground Plane) sind einleuchtend. Danke!

Gruß

Gregor

Ich wollte nur wissen, warum das so geregelt ist.

Damit die naiven Anfänger auch mal das abstrahieren lernen. :smiling_imp: Und ohne Zwang geht das nicht. :smiling_imp: :fearful: Freiwillig tun die das nicht. :fearful:

Ich tendiere zu glauben, daß Open Kollektor NPN Transistor Ausgänge Schuld an der Wahl sind. 1) Der Hersteller integriert nur einen Typ Widerstand nicht beide. Ist billiger als beide einzubauen man spart eine handvoll Transistoren und Widerstände und damit Siliziumfläche. 2) Der Pullup ist gut im Zusammenhang mit Open Kollektor Ausgängen. 3) An die Programmierer wird wenig gedacht da diese sowieso Profis sind und ihnen LOW oder HIGH egal ist bzw gleichgut zurecht kommen. Atmel hat nicht an die Arduino-Kondschaft gedacht, weil die damals nicht existierte und würd'es heute auch nicht tun.

Grüße Uwe

Hallo,
für Industrie-Elektronikdesigns gibt es die Regel: offene Eingänge dürfen direkt mit Ground verbunden werden, soll der Eingang auf “1”-Signal gelegt werden, ist das nur über einen Pullup erlaubt, um latchup-Effekte über die Stromversorgung zu vermeiden. Zudem kann so der Eingang auch hinterher noch leicht benutzt werden. Dann gibt es Logikfamilien, die offene Eingänge eigenständig als “1” erkennen und wieder andere, die eigenständig gar nichts erkennen, zu schwingen anfangen und an den Verlusten sterben.
Gruß Manfred

Was ist an "Taste nicht gedrückt" == LOW intuitiv? Der Knopf ist nicht gedrückt, also oben, also HIGH! Ist nicht ironisch gemeint :-)

olf2012: Was ist an "Taste nicht gedrückt" == LOW intuitiv? Der Knopf ist nicht gedrückt, also oben, also HIGH! Ist nicht ironisch gemeint :-)

Das ist zumindest mal eine echt gute Eselsbrücke :-)

Ich habe bislang immer „active-low“ gedacht und fand das immer irgendwie widersprüchlich.

Gruß

Gregor

gregorss: Ich habe bislang immer „active-low“ gedacht und fand das immer irgendwie widersprüchlich.

Ich bin verantwortlich, für die Schaltungen, welche ich baue, oder hier vorschlage. Nicht für die Empfindungen, welche du dabei hast, wenn du da drauf schaust.

Mein Vorschlag für eine bessere Eselsbrücke: "Strom durch Schalter/Taster" heißt EIN / Freigabe / Anforderung Dann ist egal ob Pull up, oder down

Sogar die Sicherheitsschaltungen sind damit abgedeckt. Denn die haben IMMER eine inverse Logik.(sonst nix TÜV usw.) Sobald Sicherheit gefordert ist, werden nur noch Öffner eingesetzt. z.B. die üblichen Notaus Pilze sind so typische Kandidaten.

combie:
Sogar die Sicherheitsschaltungen sind damit abgedeckt.
Denn die haben IMMER eine inverse Logik.(sonst nix TÜV usw.)
Sobald Sicherheit gefordert ist, werden nur noch Öffner eingesetzt.
z.B. die üblichen Notaus Pilze sind so typische Kandidaten.

Und ich dachte genau aus dem Grund ist das auf dem Bord so vorgesehen.
Zumindest merke ich mir das damit.

Um beim Start des Software + Hardware einen System Check zu machen kann ich so schnell nach Kabelbrüchen oder verklebten Tastern schauen.

Und ich dachte genau aus dem Grund ist das auf dem Bord so vorgesehen.

Meist werden im Arduino Umfeld Schließer verwendet.
Also NO Taster.
NO == Normal Open == Unbetätigt offen
Und, das ist auch gut und richtig so.

In Sicherheitsschaltungen werden grundsätzlich NC Schalter/Sensoren/Taster eingesetzt.
Das ist ein unabdingbares MUSS.
NC == Normal Closed == Unbetätigt geschlossen

Das hat nichts, aber auch gar nichts, mit Pullup oder Pulldown zu tun.
Nichts.
Das ist ein ganz anderes Thema.

Ich würde keine Offner benutzen da bei geschlossenen Kontakten über den Pullupwiderstand Strom fließt. Meist ist das (fast) egal weil man Arduino mit einem Netzteil oder USB mit spannung versorgt. Bei Bateriebetrieb macht das was aus.

olf2012: Was ist an "Taste nicht gedrückt" == LOW intuitiv? Der Knopf ist nicht gedrückt, also oben, also HIGH! Ist nicht ironisch gemeint :-)

gregorss: Das ist zumindest mal eine echt gute Eselsbrücke :-)

Das ist bei Pullupwiderständen aber genau falsch. Taster nicht gedrückt == HIGH Taster gedrück == LOW

Als Eselsbrücke kannst Du dir merken, daß es umgekehrt ist Betätigt == !HIGH

Grüße Uwe

Ich würde keine Offner benutzen da bei geschlossenen Kontakten über den Pullupwiderstand Strom fließt.

Ich stimme dem zu!

Aber auch nur, weil ich im gleichen Zug empfehle: Bitte keinen Arduino für sicherheitskritische Belange einsetzen!

combie: Bitte keinen Arduino für sicherheitskritische Belange einsetzen!

Stimme ich auch zu!

Wir programmieren in einer "Hochsprache", nicht in Assembler, da braucht man keine Eselsbrücken, das kann der Compiler erledigen. Und falls man aus technischen Gründen später doch einen Pulldown einsetzt oder einen NC-Taster verwendet, muss man nur zwei Zeilen im Code ändern:

const byte DOWN = LOW;
const byte UP = HIGH;

if (digitalRead(PIN_button) == DOWN) ...

Ich schreibe das immer in Englisch, weil es für mich einfacher lesbar ist als:

if (digitalRead(PIN_Taster) == GEDRUECKT) ...

Kann man für diesen Fall nicht die DigitalRead abfrage mit ! verneinen/invertieren. Dann ist doch alles wieder gleich?

Stefan