Nach pinmode(n,OUTPUT) Signale mit digitalRead(n) einlesen

Hallo Allerseits,
und eine Frage von einem Arduino-Neuling:

Wenn ich einen digitalen I/O als OUTPUT konfiguriere, dann kann ich von diesem lesen. Laut Reference ist dieser aber niederohmig und ich dachte daher, man sollte 5V (z.B. über den 5V-Pin des Arduinos) nicht ohne Vorwiderstand auf auf den entsprechenden Pin geben. Da ich einige Beispiele gefunden habe, bei denen dies (also ohne Vorwiderstand) aber gemacht wurde, habe ich es getestet und es scheint zu funktionieren. Das ATmega328-Datenblatt zeigt zwar die Schaltung eines digitalen Pins, aber um ganz ehrlich zu sein, ich verstehe es nicht ganz.

Ich habe also kein Programmierproblem, sondern nur ein Verständnisproblem. Wenn mir dieses jemand erklären würde wäre das schön. Wenn dies an einer anderen Stelle des Forums schon abgehandelt wurde, dann sorry und mir bitte den Link posten.

Schonmal ein Dankeschön

Ich verstehe dich kaum....

Wie auch immer....
Wenn die "Max Ratings" des Datenblattes überschritten werden, droht Fehlfunktion.

Da hast du was falsch verstanden oder bist einen Fake aufgesessen.

Klar kann man von einem Output Pin lesen, aber nur das was man vorher mit digitalWrite reingeschrieben hat, nicht was am Pin anliegt.

Auf keinen Fall an einem auf Output stehenden Pin eine Spannung anlegen.

Auf keinen Fall an einem auf Output stehenden Pin eine Spannung anlegen.

... ohne eine Last dazwischen.
Genausowenig darf man OUTPUT Pins direkt mit GND verbinden.
Wenn man weiss, dass der Output Pin HIGH (LOW) ist, schadet die Verbindung mit Vcc (GND) zwar gerade nicht, ist aber sinnlos. Wenn man es nicht weiss, kann man so einen Kurzschluss produzieren, der im aller-günstigsten Fall am PC USB abschaltet... aber das garantiert keiner.

Ein Pin kann (unter anderen Sachen) als Eingang oder Ausgang programmiert werden.

Wenn es mit pinMode(pin,OUTPUT) als Ausgang definiert wird ist es ein Ausgang und kann NICHT auf Masse oder 5V Versorgungsspannung geschaltet werden sondern mit einem Eingang oder einer (nicht alzugroßen) Last verbunden werden (zB einer LED mit Vorwiderstand).

Wenn es mit pinMode(pin,INPUT) als Eingang definiert wird ist es ein (hochohmiger) Eingang und kann mit Masse oder 5V Versorgung (auch ohne Schutzwiderstand) direkt verbunden werden oder über einem Taster,Kontakt,Widerstand ecc oder auch einem anderen Ausgang mit eiem Spannungspegel beaufschlagt werden.

Du kannst jederzeit von Eingang zu Ausgang umschalten falls es die Beschaltung zuläßt (nichts kaputgeht).

Du kannst einen Eingang mit einem Ausgang verbinden und umgekehrt.

Manchmal ist es sinnvol einen Widerstand zum Schutz zwischen Ausgang und Eingang zu schalten zB wenn die beiden von verschiedenen Spannungsquellen versorgt werden.

Grüße Uwe

Ich sehe, mit dieser Fragestellung war hier noch keiner konfrontiert. Zumindestens keiner derer, die bisher geantwortet haben. Trotzdem allen vielen Dank.

Warum mir überhaupt daran gelgen ist: wenn ich die Pins als INPUT konfiguriere muß ich Pulldowns anbringen wenn sie nicht floaten sollen und bei PULLUP_INPUT haben sie umgekehrte Logik, was auch nicht immer erwünscht ist. Wenn ich die Pins aber auf OUTPUT konfiguriere liegen diese (wie auch immer) auf definiertem LOW-Potential. Es ist also einfach eine schlanke Methode, wenn man schnell mal was ausprobieren will und keine Lust hat 12 Pulldowns zu applizieren. Laut Atmel-Datenblatt (18.2.4.) spricht da auch nichts dagegen.

Es funktioniert auch. Ich aktiviere über Pin 0-12 einen Buzzer in verschiedenen Frequenzlagen direkt mit dem 5V-Spannungspin auf der Prozessorplatine. Nur aktivieren, gespeißt wird der Buzzer über Pin 13. Ich hatte an Pins 0-12 teilweise Minutenlang (bis mir der Buzzer auf die Nerven ging) 5V anliegen ohne Schaden für Board und/oder Prozessor. Zugegeben, ich habe einen China-Nachbau für 3 Euro dafür verwendet, mein UNO aus seriöser Produktion war mir dann doch zu schade für diesen Versuch.

Mich würde nur interessieren warum dies funktioniert. Aus dem Datenblatt (Figure 18-2. General Digital I/O) werde ich da nicht ganz schlau.

Bei Interesse poste ich das kleine Progrämmchen auch gerne.

Am liebsten würde ich jetzt "Schwachk*pf" zu dir sagen....

Aber das darf ich nicht, denn das wäre sicherlich unhöflich!

Ja Combie, Sie scheinen eher einer der Jüngeren zu sein. Bei denen ist es in Mode, den anderen zu diskreditieren, dann braucht man sich nicht mit Argumenten auseinander zu setzen. Ich hatte gedacht es gäbe in diesem Forum jemand, der sich besser als ich mit Schaltungstechnik auskennt und vielleicht sogar von Chiplayout tiefere Kenntnis hat. Pech, daß ich grad an einen Dokuleseverweigerer gekommen bin. Anyway, ich poste noch einen Link, der mir gezeigt hat, daß dies wohl gehen muß. Sind aber wahrscheinlich auch Schwachköpfe:

Bevor sich jemand beschwert, über die Redefinition von setup(), die Dame hat sich dafür im Kommentar entschuldigt. Es ist halt auf Spanisch. Da mir dies nicht so liegt, ok eigentlich garnicht, dachte ich mir hier wäre ich besser aufgehoben. Aber jetzt versuche ich es halt doch mal bei TechKrowd.

P.s.: Ich habe den UNO jetzt am externen Netzteil in die weit entfernte Abstellkammer gestellt. Da buzzt er jetzt noch und der digitale I/O lächelt unbeeindruckt mich an.

[ot]
Das wird ja mal sehr interessant!
(gehe mal eben Cola und Chips holen)
[/ot]

Gehen Sie lieber ein Bier holen. Oder lesen Sie die Doku.

bei PULLUP_INPUT haben sie umgekehrte Logik, was auch nicht immer erwünscht ist

#define AN LOW
#define AUS HIGH

Das ist doch nicht so schwer. Und generell kann man sich daran gewöhnen. Low aktive Eingänge gibt es in der Elektronikwelt ständig

Gehen Sie lieber ein Bier holen.

Gerade keins da...
Aber du könntest ja mal mit einem 6er Pack vorbei kommen.
Dabei können wir uns dann auch darüber unterhalten, und eventuell herausfinden, wo du mit deiner Denke falsch abgebogen bist.

@Serenifly, Danke für den Tip, aber dann müßte ich mit GND an den DIO gehen und dies würde ich mir ohne Vorwiderstand nicht getrauen. Daher würde ich gerne bei der "schlanken Methode" bleiben, falls dies den Chip nicht belastet bzw. langfristig zerstört (läuft immer noch).

@Combie, habe hier noch 2 Kästen. Besser Sie kommen rüber zu mir. :slight_smile:

Sorry, aber deine Erklärungen erschließen sich mir nicht!

Einerseits sprichst du von Inputs und Pull up/down.
Da scheint mir alles richtig zu sein.
Bis auf deine Begründung der ungeliebten inversen Logik.
Das ist wohl eher Geschmackssache.

Dann sprichst du von OUTPUT und digitalRead().
Klar tuts digitalRead(), es zeigt dir das was du selber am Ausgang gesetzt hast.
Es sei denn, der Prozessor ist kaputt.
Da habe ich schon keine Ahnung was du meinst.

Und dann sprichst du von einem Buzzer, ok, die Teile gibts.
Aber was hat das mit Vorwiderständen und digitalRead() zu tun?

Und ob du den Buzzer gegen Vcc oder GND klemmst, oder an einen anderen Pin?
Ist doch alles vollkommen egal...
Ok, manche Buzzer haben ein Plus Zeichen, das solltest du beachten.

@Combie, habe hier noch 2 Kästen. Besser Sie kommen rüber zu mir.

Wenn es nicht zu weit ist....
48XXX

Erst mal das wichtigste: 64xxx, das klappt heute wohl nicht mehr. Jetzt lese ich erstmal den Rest.

Hier ist das Progrämmchen:

int Buzzer = 13;
int i = 0;
int tones[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494};

void setup() {
pinMode(Buzzer, OUTPUT);
for (i = 0; i < 12; i++) {
pinMode(i, OUTPUT);
}
}

void loop() {
for (i = 0; i < 12; i++) {
if (digitalRead(i) == HIGH) {
tone(Buzzer, tones*);*

  • delay(500);*
  • }*
  • }*
  • noTone(Buzzer);*
    }
    Der Buzzer hängt an 13, die andere Seite an GND.
    Das ganze benötigt 3 Drähte zum Steckbrett. Sonst nichts. Ich finde das gut, wenn es klappt. Bis jetzt klappt es immer noch.

Du machst also wirklich mit den pins 0 bis 11 Kurzschlüsse gegen 5V?
Ja?

Damit kommt mein Eingangssatz voll zur Geltung:

Wie auch immer....
Wenn die "Max Ratings" des Datenblattes überschritten werden, droht Fehlfunktion.

Und du bewegst dich weit außerhalb der Spezifikation.

Und auch meinen Schwachk*pf von eben, möchte ich relativieren!
Was du da tust, ist grundlegend falsch.
Suche selber ein Wort, mit dem man jemanden bezeichnet, bezeichnen könnte, welcher grundlegendes falsch macht und weiter darauf beharren möchte.

Wirft deine Verwendung von tone() nicht ein Warning, oder so?
Aktiviere doch mal die Meldungen....

Ist das ein aktiver, oder passiver Buzzer?

Der UNO läuft immer noch. Ach ja, die Jugend. Wenn Sie meinen ersten Post durchlesen (und auch ein paar danach) ich schalte 5V auf die DIOs. ActiveHigh um es mal auf Deutsch zu sagen. Und ich will nur wissen, warum der das verkraftet. Ich verstehe das Chiplayout nicht (ganz). Ich lasse das Ding jetzt bis morgen weiter laufen, dann bin ich mir sicher, daß der UNO auch den Rest des Jahres laufen wird. Dies nennt sich Induktion der Ingenieure: klappts einmal, klappts zweimal und wenn es das dritte Mal klappt, dann klappt es immer. :smiley:

Eine Erklärung dafür hätte ich halt trotzdem gerne.

Grüßle aus dem Südhessischen

Eine Erklärung dafür hätte ich halt trotzdem gerne.

Nenne es Glück, oder Gnade.

Tipp:

Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist überzeugt, dass er genug davon habe.

Quelle: René Descartes

Noch ein Nachtrag, die Maxratings schaue ich mir zuerst an. Da steht aber Strom drin als output. Ich mache aber input auf einen output und das scheint zu funktioniern. Ich will doch nur wissen warum.

Der Buzzer ist passiv, aber das tut nichts zur Sache. Der wird über Pin 13 angesteuert. Ich muß mal nachschauen, hatte ich nicht das ino gepostet? Doch habe ich. Ist doch nicht so schwer zu verstehen, oder?

Übrigens, wenn die Welt sich jetzt nicht andersrum dreht, bei Konfiguration auf Output ist das Ding niederohmig. GND sollt da kein Problem sein. Aber warum verkraftet der kleine auch 5V auf einen niederohmigen Ausgang?

Ich hätte mit allem keine Probleme, wenn nach dem ersten Versuch der UNO eine Krätsche gemacht hätte. Aber er läuft immer noch. Ich versuche dies nur zu verstehen.

Alle Meldungen sind angeschaltet. Warum sollte der tone() eine Warnung liefern? Der macht was ihm gesagt wird. Und der hat nicht mit den DIOs 0-12 zu tun, der hängt and 13.

Ach ja, wenn der Thread geschlossen wird, dann glaube ich, wirst DU den S*F zurücknehmen müssen.

Und noch ein Grüßle