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?
@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?
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.
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.
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?!
wenn das nicht trockener Humor ist ... 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.
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