Im AVR-GCC-Tutorial ist schön beschrieben, dass man beim Lesen von Variablen > 8 Bit, die durch eine ISR aktualisiert werden, vorher Interrupts mit cli deaktieren muss, um zu verhindern, dass die ISR während des Lesens den Variablenwert ändern. Nun ist die Frage, was man tun kann, wenn man alle Interrupts, z.B. beim Auswerten bestimmter Ereignisse braucht und sich nicht erlauben kannn diese zu deaktivieren? Hat vielleicht jemand eine Idee?
Das Lesen von Variablen braucht zwar u.U. ein paar Taktzyklen, aber die einzelnen Interrupt-Flags werden ja trotz globalem Disable gesetzt, wenn ein Interrupt-Ereignis auftritt. Wenn man dann mit sei() die Interrupts wieder freigibt, werden alle in der Zwischezeit aufgelaufenen Interrupts entsprechend ihrer Priorität der Reihe nach abgearbeitet, sofern man nicht per SW die Flags gelöscht hat. Im Normalfall reicht das von der Reaktionszeit noch aus. OK, ich weiß ja nicht, was Du für Verarbeitungsgeschwindigkeiten brauchst...
muss ich mal noch durchrechnen. Ich arbeite mit 16 Mhz und habe 6000 Ereignisse pro Sekunde zu verarbeiten, d.h. wechselnde Flanken auzuwerten, bei einem Quadratur Geber müssen 2 Spuren, alle Flanken erfasst werden. Insgesamt 60 Flanken pro Umdrehung. Wenn ich mit 6000 Umdrehungen pro Minute fahre, sind das 6000 Flanken pro Sekunde.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.