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