Inputs nicht belegt, aber digitalRead bringt "1"?

Hallo allerseits!

Kurz zur Vorgeschichte: Seit ein paar Wochen habe ich 2 Arduino-Kits (Sunfounder), um mich eingehend damit zu beschäftigen. Durch die Schaltungen und Programme des Starterkits habe ich mich durchgearbeitet. Meine arg verblassten Programmierkenntnisse kommen langsam wieder. :)

Gestern habe ich einen Schrittmotor-Treiber (SilentStepStick) an den Uno angeschlossen und "rumprogrammiert" und getestet. Lief auch alles ohne Probleme. Heute nun, mittendrin im Erweitern meines Programmes, bekam ich plötzlich keinen Kontakt mehr zu meinem Board per USB (Problem 1, um das es hier nicht geht). Daraufhin habe ich das zweite Kit ausgepackt und den Mega2560 angeschlossen (gleiche I/O-Pins). Aber das Programm läuft einfach nicht so wie es soll. LED an Ausgängen blinken nicht mehr, sondern leuchten an-/abschwellend (ja, ich habe sie mit digitalWrite() angesprochen). Nach erneutem Übertragen der Software aufs Board hat es funktioniert, aber dann war es bei einer anderen LED so. Dann habe ich die I/Os verschoben auf über 21. Dann taten die LED wieder das, was sie sollten. Aber dann habe ich etwas anders bemerkt: 2 Eingänge, an denen ich 2 Taster einlesen will, lieferten ständig "1", auch wenn gar nichts angeschlossen war.

Hab dann ein kleines Testprogramm geschrieben, das alle digitalen I/O-Pins als INPUT definiert, alle Pins einliest und seriell ausgibt. An das Board ist nur das USB-Kabel angeschlossen.

void setup() {

pinMode(0, INPUT);
pinMode(1, INPUT);
pinMode(2, INPUT);

...

pinMode(51, INPUT);
pinMode(52, INPUT);
pinMode(53, INPUT);

Serial.begin(9600);

}

void loop() {

Serial.print(digitalRead(0), DEC);
Serial.print(" ");
Serial.print(digitalRead(1), DEC);
Serial.print(" ");
Serial.print(digitalRead(2), DEC);
Serial.print(" ");

...

Serial.print(digitalRead(50), DEC);
Serial.print(" ");
Serial.print(digitalRead(51), DEC);
Serial.print(" ");
Serial.print(digitalRead(52), DEC);
Serial.print(" ");
Serial.println(digitalRead(53), DEC);

}

Alle Eingänge sind HIGH, außer Pin 1, der ist LOW. Ausgabe des seriellen Monitors:

1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Hmmm... Das ist doch nicht normal, oder? Oder habe ich irgendwo einen dicken Knoten in meinen Gedanken?

Zum Problem meines Uno-Boards (siehe oben) habe ich noch keine funktionierende Lösung finden können. Die Übertragung startet, der grüne Balken bleibt kurz vor dem Ende stehen, der Programmablauf unterbricht kurz und das "alte" Programm läuft wieder los. Und funktioniert ohne Probleme. Komplette Deinstallation und Neuinstallation der Arduino-Software brachte auch nix.

Hat jemand eine Idee, wieso sich mein Mega-Board so verhält?

Schöne Pfingsten! :)

Viele Grüße Stefan.

Stoffel74: Hmmm... Das ist doch nicht normal, oder?

Das ist verschieden. Manche haben es nach zwei Wochen gerafft, wie ein Eingang an einem Mikrocontroller funktioniert. Und manche eben noch nicht.

Da Du es offenbar noch nicht gerafft hast, hier in Kurzform:

Die Pins am Mikrocontroller sind Tri-State und können in drei Zustände geschaltet werden: - Ausgang niederohmig LOW (OUTPUT/LOW) - Ausgang niederohmig HIGH (OUTPUT/HIGH) - Eingang hochohmig (INPUT)

Im Zustand "INPUT" ist der Eingang für sich grundsätzlich "floatend", d.h. er kann zufällige und beliebige Zustände annehmen.

Als Grundbeschaltung für einen INPUT Pin ist es daher zwingend notwendig, diesen auf einen bestimmten logischen Pegel zu "ziehen", was durch Beschaltung mit einem Pull-Widerstand erfolgt. Du kannst den INPUT Pin daher nach Deiner freien Wahl: - mit einem Pull-Down Widerstand gegen GND anschließen, dann ist er LOW - mit einem Pull-Up widerstand gegen 5V anschließen, dann ist er HIGH Ist der INPUT nirgends angeschlossen ==> dann ist der Eingang "floating" und es ist nicht vorhersehbar, ob Du an ihm HIGH oder LOW feststellst.

Typische Größe für einen Pull-Widerstand: 4,7 Kilo-Ohm

Alternativ zu externen Pull-Widerständen haben Mikrocontroller auch "eingebaute" PullUp-Widerstände, die per Software aktiviert werden können. Das ist praktisch, weil Du dann zum Anschließen eines einfachen Schalters keinen externen Pull-Widerstand benötigst, sondern den eingebauten verwenden kannst. Der eingebaute PullUp-Widerstand wird aktiviert, indem Du den pinMode nicht auf INPUT, sondern auf INPUT_PULLUP setzt. Dann ist der Pin immer HIGH, solange Du ihn nicht mit einem Schalter gegen Masse/GND durchschaltest.

Einen nirgends angeschlossenen Pin durch Setzen von pinMode INPUT ohne äußere Beschaltung auf LOW zu setzen, funktioniert NIE. Dazu braucht es einen externen PullDown-Widerstand, der am Pin und an GND angeschlossen ist und den INPUT dabei auf LOW zieht.

Pin 0 und Pin 1 sind für die Serielle Schnittstelle reserviert, wenn du mit Serial.print(XY) arbeitest würde ich immer einen Bogen darum machen die beiden Pins zu verwenden. ArduinoBoardMega2560

Wenn Du die Pins 0 und 1 beschaltest kann es sein, daß Du keine Sketch mehr draufladen kannst. Grüße Uwe

Die Erklärung von Jurs trifft übrigens auf alle CMOS Bauteile zu und ist nix Arduino Spezifisches.
Da P und N Kanal hier zusammenhängen treten kleine Kriechströme auf die zufällige Werte erzeugen können. Verstärkt wird das Phänomen wenn du keinen Pullup hast und du eine Leitung an den Eingang anschließt, diese wirkt wie eine Antenne und produziert dir noch Einstrahlungen dazu. Deshalb ist bei einem externen Pullup noch wichtig das er so nah wie möglich am Eingang des Arduino verbaut ist.

Gruß

Hallo Jurs,

es ist immer wieder faszinierend: kaum macht man es richtig, funktioniert es! :grinning: Vielen Dank für die kurze und knackige Erklärung!

Bananenjoe schrieb:

Pin 0 und Pin 1 sind für die Serielle Schnittstelle reserviert, wenn du mit Serial.print(XY) arbeitest würde ich immer einen Bogen darum machen die beiden Pins zu verwenden.

Beim Uno hatte ich doch tatsächlich nicht ran gedacht und aus Mangel an freien Pins gerade diese beiden belegt... :confused:

Auch danke an Uwe für diesen Hinweis!

Scherheinz schrieb:

Die Erklärung von Jurs trifft übrigens auf alle CMOS Bauteile zu und ist nix Arduino Spezifisches. Da P und N Kanal hier zusammenhängen treten kleine Kriechströme auf die zufällige Werte erzeugen können. Verstärkt wird das Phänomen wenn du keinen Pullup hast und du eine Leitung an den Eingang anschließt, diese wirkt wie eine Antenne und produziert dir noch Einstrahlungen dazu. Deshalb ist bei einem externen Pullup noch wichtig das er so nah wie möglich am Eingang des Arduino verbaut ist.

Meine Elektronik-Kenntnisse sind wohl doch verblasster als ich dachte... :(

Vielen Dank nochmal für die Antworten!! :)

Viele Grüße Stefan.