Die hier beschriebenen Techniken wurden nur auf dem Arduino Uno bzw. einem kompatiblem Board getestet und funktionieren vermutlich auf anderen Boards etwas anders!
Anstatt digitalWrite() / digitalRead()
zu verwenden, können die Pins des
Arduinos auch auf eine direkte Art angesprochen werden.
digitalWrite()
digitalWrite()
einige
Mikrosekunden benötigt, um ausgeführt zu werden)digitalRead() / digitalWrite()
.Es gibt drei sogenannte "Ports", die wir manipulieren können. Dies sind quasi Gruppen von Pins, die als Ganzes angesteuert werden.
Jeder dieser Ports kann über drei Register angesteuert werden (x ist jeweils der entsprechende Port, d.h. C, B oder D):
So kann man z.B. Pin 1-7 auf OUTPUT setzen und Pin 0 auf INPUT, indem man in setup()
folgende Zeile definiert:
DDRD = B11111110;
Allerdings sollte man sicherheitshalber die Definition folgendermaßen ausführen, um die Werte von Pin 0 (RX) und
1 (TX) nicht zu verändern:
DDRD = DDRD | B11111100;
Das folgende Beispiel setzt den Port B zunächst im setup()
auf den Modus
OUTPUT und legt dann an den Pins 2 und 4 abwechselnd HIGH und LOW an. Dazwischen liegt eine Verzögerungszeit
von 1 Sekunde.
void setup()
{
DDRD = B11111111; // set PORTD to output
}
void loop()
{
PORTD = B00010000; // set Pin 4 to HIGH all other to LOW
delay(1000);
PORTD = B00000100; // set Pin 2 to HIGH all other to LOW
delay(1000);
}
Dieses Beispiel zeigt die recht elegante Lösung für einen Binärzähler. Im Sketch kann man sehen, dass auch Dezimalzahlen an das Portregister übergeben werden können. So kann man leicht in einer Schleife den Iterator hochzählen und die "Bits" fallen dann sozusagen von alleine ab.
void setup()
{
DDRD = B00001111; // set PORTD (digital 0..3) to output
}
void loop()
{
for(byte i=0; i<16; i++) {
PORTD = i;
delay(250);
}
}
Im dritten Experiment wird der Port-B als Eingang konfiguriert und dessen Werte an die serielle Konsole weitergegeben.
void setup()
{
DDRB = B00000000; // set PORTB to input
Serial.begin(9600);
}
void loop()
{
Serial.println(PINB);
delay(1000);
}
zurück