[erledigt] Wie „teuer“ ist digitalWrite()?

Hallo allerseits!

Ich möchte eine Bibliothek programmieren, mit der ich PWM auf einem beliebigen Pin machen kann. Ich weiß, solche Bibliotheken gibt es bereits, aber ich mag, wenn ich möglichst weit Bescheid weiß, wie etwas programmiert ist.

Meine aktuelle Überlegung ist, das mit einem Interrupt zu erledigen. Da Interrupts nicht ewig dauern dürfen, frage ich mich jetzt, wie lange ein digitalWrite wohl dauert. Ist das so schnell, dass man das notfalls 22 mal in einem Interrupt unterbringt, oder muss man das selbst implementieren, damit es so schnell läuft?

Vielen Dank vorweg!

Gregor

[Projekt] Schnelle Digital Eingabe/Ausgabe

@combie:
Schöne Makros!
Da hab ich wohl damals vor 11 Monaten 2 Tage nicht aufgepasst. (Und dir auch noch kein Karma verpasst)

@Gregor: Wieso 22 mal in einem Interrupt? Und wieso Interrupt? Du willst doch sicher einen der Timer mit beliebigen Pins statt der Hardwaremässig verschalteten verküpfen?

Danke für die Blumen!

michael_x:
... Wieso 22 mal in einem Interrupt? ...

Weil im Extremfall alle 22 Pins geschaltet werden müssen. Wenn ich das richtig mitbekommen habe, können auch die Analog-Pins wie digitale benutzt werden. D0-D13 + A0-A7 = 22 Pins.

Gruß

Gregor

combie:
[Projekt] Schnelle Digital Eingabe/Ausgabe

Danke für den Hinweis! Aber der beantwortet nicht meine Frage.

Gruß

Gregor

gregorss:
wie lange ein digitalWrite wohl dauert.

Wie lange ein digitalWrite dauert, das hängt vom verwendeten Board, der Taktfrequenz und vom Pin ab. Und in geringem Ausmaß sogar davon, ob Du den Pin HIGH oder LOW setzen möchtest.

Für die 16 MHz-Boards "Arduino UNO und MEGA2560 habe ich das mal ausgemessen, die Zeiten sind:

digitalWrite() auf dem UNO für einen nicht-PWM Pin: ca. 4µs
digitalWrite() auf dem UNO für einen PWM Pin: ca. 5µs

digitalWrite() auf dem MEGA2560 für einen nicht-PWM Pin: ca. 5µs
digitalWrite() auf dem MEGA2560 für einen PWM Pin: ca. 6µs

er Zeitunterschied von einer Mikrosekunde zwischen PWM-Pins und nicht-PWM Pins liegt darin, dass die Funktion digitalWrite auf PWM-Pins angewendet immer gleichzeitig auch PWM abschaltet, falls es auf diesem Pin aktiviert ist.

jurs:
...

Danke!

Gruß

Gregor

gregorss:
Danke für den Hinweis! Aber der beantwortet nicht meine Frage.

Da steht welche Taktfrequenz sich maximal erreichen lässt!
Daraus könntest du die Zeit für einen Zyklus berechnen.
Diesen durch 2 Teilen und du hast die Zeit für ein digitalWrite()

OK, vielleicht ist das auch zu kompliziert....

Dann messe doch selber!
Du hast mikros().
Kannst 1000 Ausgaben machen, und die dafür vergangene Zeit durch 1000 teilen und hast die Zeit für eine Ausgabe.

Dass du so wenig selber denken und rechnen kannst, damit hätte ich wirklich nicht gerechnet!
Aber OK, wenn man sich das vorkauen lässt, dann nutzt das Hirn nicht so schnell ab.

combie:
Da steht welche Taktfrequenz sich maximal erreichen lässt!

Das habe ich übersehen.

combie:
Dass du so wenig selber denken und rechnen kannst, damit hätte ich wirklich nicht gerechnet!
Aber OK, wenn man sich das vorkauen lässt, dann nutzt das Hirn nicht so schnell ab.

Nunja ... manchmal ist man halt so in eine Sache vertieft, dass man andere Dinge übersieht. Passiert Dir das etwa nie?!

Gruß

Gregor

NIE!
(vielleicht nicht das ganz große NIE, aber das mittlere NIE auf jeden Fall)

wenn das nicht trockener Humor ist ... :slight_smile: ganz trocken

Ich würde das nicht mehr mit digitalWrite machen sondern direkten Zugriff. Das erfordert aber viele if define wenn es noch universell mit UNO und MEGA werden sollen.

Naja, ein bisschen Spass, muss sein...
:o Und lästern, wenn der Betroffene mithört, steht da weit oben mit auf der Liste.. :o

Frei nach dem Motto:

Manchmal ist man der Hund, und manchmal der Baum.

Und Garantie drauf, ich werde hier auch noch einen Bock schießen. :smiling_imp:

Hallo,

jeder darf mal einen Bock anvisieren ... :slight_smile:

Wenn ich noch was zum Thema beitragen darf: schaut mal hier.

Übersichtlich und in echt richtig flott.

gregorss:
Weil im Extremfall alle 22 Pins geschaltet werden müssen. Wenn ich das richtig mitbekommen habe, können auch die Analog-Pins wie digitale benutzt werden. D0-D13 + A0-A7 = 22 Pins.

Gruß

Gregor

Nein. Der ATmega328 in SMD hat zwar 8 analoge Eingänge, es können aber nur 6 davon als digitale Pins verwendet werden. A6 uns A7 nicht. also 20 pins. ok wenn man den Reset wegfust kann der auch als digitaler Pin verwendet werden. Wenn man einen externen Takt verwendet kann auch einer der beiden Oszillator-Pins als Pin verwendet werden (einen internen Takt nehme ich mal an willst und kannst Du nicht verwenden).
Grüße Uwe

Klaus_ww:
Wenn ich noch was zum Thema beitragen darf: schaut mal hier.
Übersichtlich und in echt richtig flott.

Vielen Dank!

Gruß

Gregor