Int0 und Int1: Einfluß auf das gesammte Programm?

Gast #92899
Hallo, ich will int0 und int1 als interupt für externen takt benutzen,
um eine high/low flanke auszuwerten. ich frage mich aber,
was passiert wenn bis zu 3000 flanken pro interrupt in der sek
ausgelöst werden.

also was passiert mit dem restlichen bascom-programmcode (lcd-anzeige,
diverse berechnungen etc) wenn "andauernd" (also teilweise bis zu
3000 mal in der sek ) INT0_isr und INT1_isr bei meinem mega16 mit 8MHZ
angesprungen wird. wird da noch was verarbeitet und ist der prozessor
nur in den beiden interrupt-routinen?

wie ist das eigentlich überhaupt, wenn gerade INT0_isr abgearbeitet
wird und INT1 ausgelöst wird? wird erst INT0_isr abgearbeitet und dann
INT1_isr angesprungen oder gleich INT1_isr?

besten dank

Micha
Gast
so isses, aber:
6000 Ints/s -> im Schnitt alle 166µs einer, bei 8MHz hast du also
jeweils rund 1300 Takte zwischen den einzelnen Interrupts, das reicht
also auf jeden Fall ersteinmal.
Interessant wird es, was du in der ISR machst. Wenn du da die 1300
Takte vertrödelst, reicht es natürlich irgendwann nicht mehr. Zur
eigentlichen Bearbeitungszeit kommen immer noch Aufruf, Retuung
diverser Register, Wiederherstellung, Rücksprung. Das ist sozusagen
"tote" Zeit. Manche Compiler gehen da recht rigeros vor und retten
alles mögliche, auch wenn es in der ISR gar nicht gebraucht wird. Da
hilft dann, die automatische Rettung auszuschalten und das per
Inline-Assembler zu machen, ist aber nichts für Anfänger.
Ich sage einfach mal: du hast gar kein Zeitproblem.
Gast
Falls Du weißt, wie lang (wieviele Befehle) die Interruptroutine ist,
kannst Du es ausrechnen. Bis auf ein paar Ausnahmen wird ein Befehl pro
Takt verarbeitet.
Wurde ein Interrupt ausgelöst, wird das Interrupt-Flag gelöscht, d.h.
es kann kein weiterer Interrupt ausgelöst werden, bis der RETI Befehl
ausgeführt wird. Wird ein Interrupt ausgelöst, während ein anderer
schon ausgeführt wird, dann merkt der Controller sich das und führt ihn
aus, sobald der erste beendet ist.
Genaueres, wie schon erwähnt, gibts in den Datenblättern.
Gast
Oder ich setze das Interrupt-Flag selber wieder am Beginn der
Interruptroutine, so das diese dann durch weiter, möglicherweise
wichtigere Interrupts unterbrochen werden kann.
Ich mache das so mit einem TimerInt (nur Tastenabfrage), der durch den
UART-Int unterbrochen werden darf, da mir dieser wichtiger ist.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.