Hallo allerseits,
zu dem Projekt aus meinem vorigen Topic noch eine Detailfrage:
Ich will die Zeit einer Umdrehung eines Fahrradrades (1 - 3x pro s) per Hallsensor messen, daran angepasst möchte ich LEDs per 595- Schieberegistern aufleuchten lassen.
Per pulseIn() die Umdrehungszeit zu ermitteln, geht bislang am besten, aber das hält nach einer Ausführung den Code auf, bis das nächste pulseIn() eingeht. Daher dachte ich, dass das per externem Interrupt genauer geht, da dieser doch nur wenige Takte brauchen sollte.
Tatsächlich hält dieser das Programm aber noch mehr auf, so dass es nur bei sehr langsamer Umdrehung überhaupt zum Aufleuchten der LEDs kommt.
Kann mir jemand sagen, woran das liegt? Vielleicht an der Art des Interrupts (ich hörte alternativ vom ISP bei ATMega µCs, doch der ist beim Arduino angebl. nicht belegt?!) oder an der Ausgabe per shiftOut()?
Wie kann ich den Ablauf, bspw. den Interrupt, schneller machen?
Gruß
Moritz
der ganze Code per Cloud
void setup() {
attachInterrupt(0, interrupt, FALLING); // wenn Hall- Sensor (active- low) an ISR0 ≙ Pin2 betätigt
}
void loop() {
start = (zeit / 2); // delay() will Millisekunden
gap = (zeit / 73); // delay() will Millisekunden
if ((zeit > 0) && (currTime < timeout)) { // auto- AUS- Funktion muss noch überarbeitet werden
delay(start); // bisschen mehr, um von dem Auslösepunkt wegzukommen
alpha('E');
alpha('_');
delay(gap);
}
}
void interrupt() {
currTime = millis(); // aktueller Zeitwert wird genommen
if (prevTime > 0) { // falls schon Zeit vergangen (≙ nicht erstes Mal)
zeit = currTime - prevTime; // Zeit seit letztem Auslösen ermitteln (≙ 1 Umdrehung), als "zeit" speichern
}
prevTime = currTime; // aktuellen Zeitwert als neuen Startwert merken
}