Arduino Input Tidsforhold
Kaldet til digitalRead(pin) tager tid, så det undersøges i det følgende
Testprogram
Der skrives et lille testprogram, der kan måle tiden det tager at kalde digitalRead, og i dette tilfælde gemme resultatet i en boolean variabel. Testkoden ser ud som følger:
void setup() {
// put your setup code here, to run once:
Serial.begin(1000000);
}
unsigned long tider[11];
bool temp;
byte n;
void loop() {
// put your main code here, to run repeatedly:
tider[0] = micros();
tider[1] = micros();
tider[1] = micros();
tider[1] = micros();
tider[1] = micros();
tider[1] = micros();
tider[1] = micros();
tider[1] = micros();
tider[1] = micros();
tider[1] = micros();
tider[1] = micros();
temp = digitalRead(4);
temp = digitalRead(4);
temp = digitalRead(4);
temp = digitalRead(4);
temp = digitalRead(4);
temp = digitalRead(4);
temp = digitalRead(4);
temp = digitalRead(4);
temp = digitalRead(4);
temp = digitalRead(4);
tider[2] = micros();
for (n = 0; n < 2; n++) {
Serial.println(tider[n+1] - tider[n]);
}
Serial.println();
delay(500);
}
Først måles der hvor lang tid det tager at lave en tidsmåling, det gøres ved at måle på 10 kald til micros(), der lagres i et array (der lagres bare til samme celle). Det tager ca. 2,8 us svarende til 45 maskininstruktioner.
Ti kald til digitalRead() samt en tidsmåling tager 32 us, eller 512 maskininstruktioner, så de 10 kald må tage 467 maskininstruktioner, hvilket betyder at et kald til digitalRead tager 47 maskininstruktioner eller 2,9 us
Hurtigere input
Ved at udnytte at man kan læse direkte i porten, så kan man aflæse ben 4 på følgende måde:
temp = PIND & 0b00010000;
Nu tager de ti læsninger af inputtet samt en tidsmåling kun 4 us, eller 64 maskininstruktioner, så de 10 læsninger tager 19 maskininstruktioner, hvilket betyder at en læsning nu tager 2 maskininstruktioner eller 0,125 us
Referencer