Forum: Mikrocontroller und Digitale Elektronik LOW-Level Interrupt


von razepuz (Gast)


Lesenswert?

Ich lese schon einige Zeit im ATmega16 Manual, doch darauf bin ich noch
nicht gestossen: Wie viele Interrupts werden eigentlich während einer
Sekunde im LOW-Level-Modus des externen Interrupts (INT0) ausgelöst?

von ...HanneS... (Gast)


Lesenswert?

Es kommt darauf an, wie lange deine ISR (Interrupt-Service-Routine)
dauert. Das Flag in GIFR kann sich nur einen IRQ merken, es ist halt
nur ein "1-Bit-Zähler". Wenn der abgearbeitet ist und kein neuer
aufgetreten ist, dann ist Schluss.
Kannst ja mal einen Zähler hochzählen lassen und sein Ergebnis an einen
Port ausgeben. ;-)

Wenn du den Low-Level-Int zum Wecken aus dem (taktlosen) Tiefschlaf
brauchst, dann kannst du doch in der ISR sofort auf Flankentriggerung
umschalten (oder ganz ausschalten) und das Flag in GIFR löschen. Den
Low-Level-Int aktivierst du dann erst wieder, wenn du den AVR schlafen
schickst.
Damit kannst du den AVR sicher wecken, hängst aber nicht im
Dauer-Interrupt.

...

von razepuz (Gast)


Lesenswert?

Danke für deine Antwort!

Mich hätte nur prinzipiell der theoretische Wert interessiert, wie
viele Interrupts eigentlich ausgelöst werden, wenn die Interrupt
Service Routine, sagen wir, keinen Befehl enthält.
Da dieser Modus ja vom Takt unabhängig ist, kann es also nicht sein,
dass bei jeder aktiven Taktflanke ein Interrupt ausgelöst wird, oder
doch? - Das wären ja selbst bei diesem 16MHz Controller schon 16Mio
Interrupts in der Sekunde.

Noch eine Sache: Weil du meintest, es hängt von der Länge der Interrupt
Service Routine ab. Daran habe ich gar nicht gedacht. Während der
Abarbeitung der ISR sind natürlich alle Interrupts standardmäßig
gesperrt. - Das mit dem Counter könnte ich ausprobieren...

Mich würde obiger Fall sehr interessieren, aber leider konnte ich im
ATmega16 Manual nichts dazu finden.

von ...HanneS... (Gast)


Lesenswert?

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

...

von samy (Gast)


Lesenswert?

Hi Alle;
Ich moechte wissen ,in welcher Dokumente kann man die Defintion der
low-level Funktionen fuer ATmel 128 finden.
z.B.
#define DB_PERIPHERAL_PORT_INIT() \
    do { \
        DDRB  |= BM(OLED) | BM(GLED); \
        PORTB &= ~(BM(OLED) | BM(GLED)); \
        DDRD  |= BM(UART1_RTS); \
        PORTD |= BM(UART1_RTS) | BM(UART1_CTS);\
        DDRE  |= BM(RLED) | BM(YLED); \
        PORTE &= ~(BM(RLED) | BM(YLED)); \
    } while (0)

danke

von Peter Dannegger (Gast)


Lesenswert?

Bei einem level getriggerten Interrupt wird sich nichts gemerkt, der
Interrupt wird solange ausgeführt, wie der Pin low ist.

Geht er wieder auf high bevor der Interrupt ausgeführt werden kann,
z.B. weil gerade ein anderer Interrupt abgearbeitet wird, geht er
verloren und es passiert gar nichts.


Ein Level getriggerter Interrupt macht nur Sinn zur Abfrage von
Peripheriebausteinen mit mehreren Interruptquellen z.B. Ethernet-Chip.
Im Interrupthandler wird dann eine Quelle bearbeitet und zurückgesetzt.
Wird nun dabei die nächste Quelle aktiv, bleibt der Pin auf low und man
geht noch einmal in den Interrutphandler rein. Mit einem
flankengtriggerten Interrupt wäre sie verloren gegangen und man würde
keinen weiteren Interrupt mehr erhalten.


Weiterhin kann der level-Interrupt auch zum Aufwecken aus dem Sleep
dienen.


Peter

von Karl (Gast)


Lesenswert?

>Mich würde obiger Fall sehr interessieren, aber leider konnte ich im
>ATmega16 Manual nichts dazu finden.

Wie wäre es mit Seite 13?

Interrupt Response Time

The interrupt execution response for all the enabled AVR interrupts is
four clock cycles minimum.
After four clock cycles the program vector address for the actual
interrupt handling routine is executed.
During this four clock cycle period, the Program Counter is pushed onto
the Stack. The vector is normally a jump to the interrupt routine, and
this jump takes three clock cycles.
If an interrupt occurs during execution of a multi-cycle instruction,
this instruction is completed before the interrupt is served.
If an interrupt occurs when the MCU is in sleep mode, the interrupt
execution response time is increased by four clock cycles.
This increase comes in addition to the start-up time from the selected
sleep mode.
A return from an interrupt handling routine takes four clock cycles.
During these four clock cycles, the Program Counter (two bytes) is
popped back from the Stack, the Stack Pointer is incremented by two,
and the I-bit in SREG is set.

von Hannes L. (hannes)


Lesenswert?

@Peter:
Gut zu wissen... - Danke...

...HanneS...

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.