Was passiert bei einem Int?
- Das auslösende Ereignis setzt das zugehörige Flag in TIFR
- Die Int-Logik vergleicht das Flag in TIFR mit TIMSK und dem I-Flag
in SREG
- Im Falle eines Int wird der angefangene Befehl noch fertig
abgearbeitet und dann zum Int-Vektor gesprungen, nachdem der
Stand des Programmcounters auf dem Stack gesichert wurde.
- Bis hierhin ist die Zeit vergangen, die das Datenblatt glaube
'interrupt response time' (oder ähnlich) nennt. Das können je nach
Situation um die 5 bis 8 Takte sein.
- Nun kommt der Sprung in die ISR (2 Takte) und RETI (4 Takte).
- Irgendwann während der ISR wird das Flag in TIFR gelöscht (wann
genau, habe ich noch nicht ergründet, war mir noch nicht wichtig).
- Liegt zu diesem Zeitpunkt das auslösende Ereignis (Low-Level) noch
an, so wird das Int-Flag wieder gesetzt und das Theater beginnt
von vorn.
- War der AVR im Sleepmode (Power-down, also mit abgeschaltetem
Systemtakt), dann kommt noch die Aufwachzeit dazu, die zum
Einschwingen des Oszillators benötigt wird und mit den SUT-Fuses
eingestellt wird.
Mit einer Äußerung wie:
"Der Mega16 schafft xyz Interrupts pro Sekunde..."
würde ich mich aber stark zurück halten.
Denn einerseits ist dieser Wert uninteressant, da ihn niemand wirklich
braucht, andererseits ist dieser Wert sehr stark von anderen Faktoren
abhängig, wie Länge der ISR, Sleep-Mode und den Dingen, die ich in
meiner Betrachtung garnicht bedacht hatte.
Und irgendwie sehe ich auch keinen großen Sinn darin, den Mega16
mittels Low-Level Dauer-Interrupts mit leerer ISR machen zu lassen.
- Sorry...
...