phthalo:
Ich möchte, dass die Unterbrechung einer Lichtschranke möglichst schnell erfasst wird.
Definiere mal: Wie schnell ist "schnell" bei Dir?
phthalo:
Der entsprechende Eingang am Arduino Mega 2560 wird LOW, wenn das passiert. Der Arduino braucht in dieser Zeit nichts weiter zu tun, als auf LOW zu warten.
Wie erfasse ich diesen LOW-Zustand schneller:
Erstens:
while(true)
{
if (digitalRead(PIN_LICHTSCHRANKE) == LOW) { "tue dies und das"}
}
oder zweitens mittels eines interrup auf diesen Pin?
attachInterrupt(0, "tue dies und das", FALLING);
oder drittens??
Es ist relativ unergiebig, über den Arduino-Code zu diskutieren, wenn die Haupt-Auslöseverzögerung von der Lichtschranke her kommt.
Beispiel "Lichtschranke mit mechanischem Relais": Wenn der Ausgang der Lichtschranke mit einem mechanischen Relais geschaltet wird, ist das langsamste der Schaltvorgang des Relais. Relais können zum Schalten durchaus 0,01s brauchen, also 10 ms bzw. 10000µs.
Lichtschranken mit Transistorausgang sind viel schneller als solche mit Relaisausgang.
Welche Art Ausgang hat Deine Lichtschranke?
Zweiter Punkt ist das Messprinzip einer Lichtschranke: Handelsübliche Lichtschranken arbeiten zwecks Vermeidung von Fehlauslösungen mit "gepulstem Licht". So wie auch die bekannten Infrarot-Fernbedienungen. Der Lichtstrahl ist nicht einfach nur Licht, sondern moduliertes Licht mit einer aufgeprägten Frequenz. Oft im Infrarot und ganz oft mit einer Frequenz von 38 kHz. Egal ob die Lichtschranke dann hellschaltend oder dunkelschaltend betrieben wird, es entsteht immer eine Auslöseverzögerung, die ca. 10 Wellenlängen der Modulation entsprechen.
Hellschaltend: Lichtschranke schaltet, sobald sie 10 Stück 38 kHz Impulse empfangen hat
Dunkelschaltend: Lichtschranke schaltet, sobald sie 10 Stück 38 kHz Impulse ausgeblieben sind
Die theoretisch minimale Auslöseverzögerung handelsüblicher Lichtschranken liegt also bei
10/38 ms = 0,263 ms = 263 µs
In der Praxis ist die Auslöseverzögerung deutlich länger, da die schnellste Elektronik nicht mit Lichtgeschwindigkeit arbeitet, näheres sollte im Datenblatt der Lichtschranke stehen.
Ob Du nun einen Code für den Arduino schreibst, der das Signal der Lichtschranke in 0,002ms (2µs) oder fünfmal langsamer in 0,01ms (10µs) auswertet, macht dann den Kohl doch wirklich nicht mehr fett, oder? Denn es ändert an der Gesamtzeit doch praktisch nichts:
263µs + 2 µs = 265 µs
263µs +10 µs = 273 µs
Unterschied 273/265 = 1,03 = 3% mehr Auslösezeit bei fünfmal langsamerem Arduino-Code.
Bestenfalls, denn die Lichtschranke an sich wird langsamer sein als das theoretisch denkbare Minimum.
Das macht den Kohl auf der Arduino-Programmierseite nicht wirklich fett, oder?
Was soll das werden und wofür soll es sein?