Forum: Mikrocontroller und Digitale Elektronik Int0 und Int1: Einfluß auf das gesammte Programm?


von Micha (Gast)


Lesenswert?

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

von Thomas K (Gast)


Lesenswert?

die erste frage kannst nur du beantworten da niemand weiß was alles in
deiner ISR steht.

alles andere sollte im datenblatt stehen!

von crazy horse (Gast)


Lesenswert?

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.

von thkais (Gast)


Lesenswert?

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.

von Ingo Henze (Gast)


Lesenswert?

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.

von Micha (Gast)


Lesenswert?

im isr wird einfach eine variable um den faktor eins erhöht, also eine
zeile code mit einem befehl und einer variable

von crazy horse (Gast)


Lesenswert?

null problemo, siehe oben.

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.