Forum: Compiler & IDEs Datenaustausch mit ISR


von fambi (Gast)


Lesenswert?

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?

von johnny.m (Gast)


Lesenswert?

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...

von guenter (Gast)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

macht der avr zwischen mittagsschlaf und kaffee.

von fambi (Gast)


Lesenswert?

ok, danke

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
Noch kein Account? Hier anmelden.