digitalWrite() in loop

Grüße! :slight_smile:
als Beginner habe ich eine vermeintlich einfache Frage (die ich aber loswerden muss bevor ich richtig starte). Ich habe ähnliche Beiträge gefunden, die aber nicht konkret auf folgendes grundlegendes Problem eingehen:

void loop() {
digitalWrite(2, HIGH);
}

das Tutorial sagt:

If the pin has been configured as an OUTPUT with pinMode(), its voltage will be set to the corresponding value: 5V (or 3.3V on 3.3V boards) for HIGH, 0V (ground) for LOW.

Also wundere ich mich, ob der obige Code tatsächlich den (MOSFET) transistor hinter dem PIN 100.000 mal pro Sekunde schalten lässt, oder nur im 1. Durchlauf und danach effektiv nichts mehr passiert??
Ist der Code schädlich für den Arduino und bad practice ?

Wenn du den Pin D2 auf High setzt, bleibt dieser so lange High, bis er wieder auf Low gesetzt wird.
Oder ein Neustart durchgeführt wird.

Wie kommst du da drauf, dass er es 100.000 mal pro Sek. macht ?

Also wundere ich mich, ob der obige Code tatsächlich den (MOSFET) transistor hinter dem PIN 100.000 mal pro Sekunde schalten lässt, oder nur im 1. Durchlauf und danach effektiv nichts mehr passiert??

Eine durchaus gängige Methode...

Du kannst den Pin sooft High setzen, wie du willst, es passiert nix, wenn er vorher schon High ist.
Das tumbe setzen, ist manchmal einfacher und schneller, als Abfragen/Entscheidungen zu treffen.

Hi

Wenn der Pin NICHT als AUSGANG eingestellt wurde, schaltest Du so den PULLUP-Widerstand an/aus.
Auch Das reicht einem LL-N-FET, da der Pin durch den internen Pull-Up-Widerstand (10...50kΩ) nach Vdd gezogen wird und keine Verbindung nach GND besteht - das Potential also auf 5V anwächst.

Dem µC ist es sch*** egal, wie oft was wo geschaltet wird - ob's die angeschlossene Schaltung ab kann, ist hier eher die Frage.

Was Du nicht machen solltest: Zwei µC-Pins verbinden, BEIDE auf OUT stellen und gegensätzlich schalten lassen - dann stirbt mindestens einer der Pins.

MfG

PS: Das Setzen eines gesetzten Ausgang ist mir zwar ein Dorn im Auge, aber da Es nicht schadet und schneller ist als ein IF, viel verwendete Praxis.

HotSystems:
Wie kommst du da drauf, dass er es 100.000 mal pro Sek. macht ?

hallo, ich habe sowas ähnliches zum Testen gebaut:

void loop()
{
   for (long i=0; i < 100000; i++){
   }
digitalWrite(LED, HIGH);
}

Wenn ich mich recht erinnere, ging die LED nach ca. 1s an :wink: (unter der Annahme, dass er durch die for-Schleife so schnell läuft wie durch den loop() komm ich damit auf die Zahl).

Und damit ich dich richtig verstanden habe: nach dem 1. Durchlauf passiert hardware-technisch nicht mehr viel (wird also nichts immer wieder geschaltet)?

EDIT:
combie hat in der Zwischenzeit geantwortet:

combie:
Du kannst den Pin sooft High setzen, wie du willst, es passiert nix, wenn er vorher schon High ist.

das was mir wichtig war, ist wie gesagt das hardware-seitige an der ganzen Sache. Ich habe in diesem Bereich der Mikrocontrollertechnik nicht die Detailkenntnisse und die Sorge war, ob ich durch obigen Code die Lebensdauer (eines PINs) verkürze :confused:

EDIT:
@postmaster-ino
soweit alles verstanden (gute Nebeninformationen!)

postmaster-ino:
Dem µC ist es sch*** egal, wie oft was wo geschaltet wird - ob’s die angeschlossene Schaltung ab kann, ist hier eher die Frage.

ok ok, Sorgen endgültig verflogen :smiley:

postmaster-ino:
PS: Das Setzen eines gesetzten Ausgang ist mir zwar ein Dorn im Auge, aber da Es nicht schadet und schneller ist als ein IF, viel verwendete Praxis.

das war der springende Punkt!

Vielen Dank an alle!
(echt tolles Forum hier =) )

Eichhorn:
Und damit ich dich richtig verstanden habe: nach dem 1. Durchlauf passiert hardware-technisch nicht mehr viel (wird also nichts immer wieder geschaltet)?

Genau so ist das, aber das wurde dir ja nun mehrfach bestätigt.

Selbst wenn du einen Sketch schreibst, der (ohne digitalWrite) einen Pin mit 8 MHz schwingen lässt, schadet das deinem Arduino nicht.

OT:

Wenn ich mich recht erinnere, ging die LED nach ca. 1s an

Das war evtl. der bootloader. Und deine Schleife hat der Compiler vielleicht wegoptimiert.

Erst wenn du die 100000 verdoppelst und dann 2 s misst, hast du ein halbwegs glaubwürdiges Ergebnis.

michael_x:
Selbst wenn du einen Sketch schreibst, der (ohne digitalWrite) einen Pin mit 8 MHz schwingen lässt, schadet das deinem Arduino nicht.

Super, danke! :slight_smile:

michael_x:
Das war evtl. der bootloader. Und deine Schleife hat der Compiler vielleicht wegoptimiert.

Erst wenn du die 100000 verdoppelst und dann 2 s misst, hast du ein halbwegs glaubwürdiges Ergebnis.

Verstehe was du meinst. Bei so kurzen Zeiten nimmt der bootloader in Relation die meiste Zeit in Anspruch. (Ich habe aber tatsächlich auch bis 1 Mio laufen lassen, und denke dass es linear war)

Hallo
Setze vor der zu messenden Zeit eine variable mit dem Wert von millis und am Ende bildest du die Differenz zwischen dem Wert von millis und dem vorher abgespeicherten wert. Dann hast du die benötigte Zeit in etwa in ms

Du kannst das Ganze auch mit micros machen

Hi

... oder einfach so lange hin und her schalten (und Das zählen), bis die Sekunde um ist - wieder ein Fall für millis() oder micros().

Unterm Strich ist Es aber recht egal, wie lange der Befehl wirklich dauert - Das wird schon recht fix ausgeführt!
Bei wirklich zeitkritischen Dingen wird man eh um sehr hardwarenahe Zugriffe nicht drum herum kommen - aka das Timing zu WS2812B, wo die Assembler-Routienen schön in der Library betrachtet werden können.

MfG