Fast Digital Write

English version.

Als erstes mal einen Dank an einen Freund von mir, der mich überhaupt auf dieses Thema gestoßen hat, als wir uns über mein neues Projekt (wieder Wassertropfenfotografie) unterhielten.

Wie der Titel schon vermuten lässt, handelt es in diesem Eintrag um die Geschwindigkeit, mit der man auf die digitalen Pins des Arduino zugreift.

Der Aufbau

Man braucht hier so wenig wie nur möglich: Ein Arduino und einen PC, um diesen zu programmieren. Ich nutze ein Arduino Nano v3, es kann aber auch das UNO problemlos mit dem selben Programm betrieben werden.

Das Programm

Im Grunde ist es recht einfach, die Ports „schneller“ zu setzen, denn es muss nur eine Kleinigkeit geändert werden. Anstatt des Arduino-Befehls digitalWrite() müssen C-Befehle herangezogen werden. Die folgenden Zeilen zeigen, welche Befehle mit welchen ersetzt werden müssen:

  • digitalWrite(Pin, HIGH);  –>  PORT{Port} |= _BV(PORT{Port}{Portnumber});
  • digitalWrite(Pin, LOW);   –>  PORT{Port} &= ~_BV(PORT{Port}{Portnumber});
{Port} & {Portnumber} bezeichnen hier Pins, wie sie am ATmega328 hinterlegt sind. Der ATmega ist das Kernstück des Arduinos, es handelt sich hierbei um den Mikrocontroller, welcher die Rechenoperationen des darauf befindlichen Programms durchführt.
Will man nun beispielsweise auf Pin 13 zugreifen, so schreibt man statt der gewohnten Befehle die folgenden:
  • HIGH: PORTB |= _BV(PORTB5);
  • LOW: PORTB &= ~_BV(PORTB5);
Um die Belegung der Pins herauszufinden kann man entweder nach „ATmega328 pinmapping“ suchen, oder ihr zieht meine Tabelle von GitHub zurate. Auf GitHub findet ihr zudem ein kleines Beispiel-Programm, welches die Dauer des Zugriffs verdeutlichen soll. Eintausend Write-Befehle (HIGH/LOW) haben folgendes ergeben:
  • Arduino-Befehl: 8280 Mikrosekunden
  • C-Befehl: 696 Mikrosekunden
Es lässt sich erkennen, dass der C-Befehl um das 12-fache schneller ist, was bei zeitkritischen Anwendungen doch einen beträchtlichen Unterschied macht. Aus diesem Grund bekommen alle meine Wassertropfen-Anwendungen nun ein Update!
Für gewöhnliche Anwendungen verbleibe ich bei den Standard-Befehlen, da diese einfach angenehmer zu lesen und zu interpretieren sind.
 .
Zum Schluss vielleicht noch ein paar Worte zur Ideologie von Arduino. Wenn ich mich mit Freunden unterhalte, die eine Ausbildung im Elektronik-Sektor genossen haben, dann sehen diese die Arduino-Welt eher skeptisch an. Sei es nun der Umstand, das digitalWrite() 12 mal so lange dauert, oder das es teilweise unnötige Stellen in Libraries gibt. Ich denke da etwas anders. Ich sage, das Arduino genau deswegen so groß und beliebt geworden ist. Jeder kann mit der riesigen Auswahl an Peripheriegeräten etwas anfangen und sich damit schnell und einfach wundervolle Projekte schaffen. Den Code kann man, wenn alles läuft, dann immer noch „aufräumen“.
.
Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s