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
die erste frage kannst nur du beantworten da niemand weiß was alles in deiner ISR steht. alles andere sollte im datenblatt stehen!
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.
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.
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.
im isr wird einfach eine variable um den faktor eins erhöht, also eine zeile code mit einem befehl und einer variable
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.