www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LOW-Level Interrupt


Autor: razepuz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: razepuz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

...

Autor: samy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:
Gut zu wissen... - Danke...

...HanneS...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.