Moin,
so, ich habe jetzt mal nen schnellen Vergleich gemacht, und wenn auch der Unterschied beeindruckend ist, die wirkliche Überraschung ist die absolute Geschwindigket.
Folgende Konfiguration:
Arduino UNO.
Test Programm 1:
#define SENSOR1 2
#define SENSOR2 3
long starttime;
void setup(){
Serial.begin(9600);
}
void loop(){
starttime = millis();
for (int i=0 ; i < 10000 ; i++){
if (digitalRead(SENSOR1) != digitalRead(SENSOR2)) {
// Hier kommt später ne Verzögerung rein, um zu prüfen, ob die Ports auch nach x Microsekunden noch unterschiedlich sind
if (digitalRead(SENSOR1) != digitalRead(SENSOR2)) {
// Aktion wenn auch nach x Microsekunden unterschiedliche Signale vorliegen
}
}
}
Serial.println(millis() - starttime);
}
Test Programm 2:
long starttime;
void setup(){
Serial.begin(9600);
}
void loop(){
starttime = millis();
for (int i=0 ; i < 10000 ; i++){
port = PIND;
if (bitRead(port,2) != bitRead(port,3)) {
// Hier kommt später ne Verzögerung rein, um zu prüfen, ob die Ports auch nach x Microsekunden noch unterschiedlich sind
port = PIND;
if (bitRead(port,2) != bitRead(port,3)) {
// Aktion wenn auch nach x Microsekunden unterschiedliche Signale vorliegen
}
}
}
Serial.println(millis() - starttime);
}
Ergebnis:
Die 10000 Durchläufe schafft das erste Programm (digitalRead) in 171 Millisekunden (= 17 Mikrosekunden / Durchlauf), während das zweite Programm (PIND) die 10000 Durchläufe in nur 24 Millisekunden (2.4 Mikrosekunden / Durchlauf) schafft.
BEEINDRUCKEND!
P.S. Die 17 Mikrosekunden im ersten Programm entsprechen übrigens den 0.004 Millisekunden, die MaFu vorher genannt hat: In meinen Versuch sind 4 DigitalRead für eine Schleife nötig, d.h. der einzelne DigitalRead benötigt tatsächlich 4 Mikrosekunden.
Da im zweiten Beispiel nur zwei Auslese Befehle nötig sind, heisst dies, dass die PIND Konstellation ca um den Faktor 4 schneller ist als DigitalRead (und nicht Faktor 20 wie ich irgendwo gelesen habe).
Auf jeden Fall steht fest: Bei diesen Geschwindigkeiten brauch ich mir diesbezüglich keine Sorgen machen, und Hardwarelösungen sind auch nicht nötig.
Alles in allem: Arduino rocks! Cheers.