Hallo Ist es möglich bei einem AVR einen Timer Interrupt von einem anderen Interrupt unterbrechen zulassen? Oder wie kann ich in C den Timer Int. beenden und die Funktion weiter bearbeiten lassen! Noch zur Info: Ich habe 3 schnelle Interrupts laufen (SIO -> 25KHz & Timer -> 40KHz). Nun muss ich zwischen dem Hauptprogramm und den Interrupts noch einen Timer (3,3KHz) hängen. Diese neue Timer soll das Hauptprogramm unterbrechen und selber von den anderen Interrupts unterbrochen werden können. Ein RTOS geht nicht! Grüsse, Peter
@ peter >Ist es möglich bei einem AVR einen Timer Interrupt von einem anderen >Interrupt unterbrechen zulassen? Ja. Dazu musst du in den Timerinterrupt mittels SEI die Interrupts wieder freigeben. In C könnte das ein wenig kniffliger werden. >Ein RTOS geht nicht! Brauchst du auch nicht. MFG Falk
SEI reicht? So, das habe ich jetzt getestet, erstmal sieht das gut aus. Der neue Interrupt wird wie gewünscht durch die anderen unterbrochen. Was ist mit dem "RETI" am Ende der neuen Interrupt Funktion? Stört das oder brauche ich den Befehl? VG, Peter
Im gcc ist genau das der Unterschied zwischen einer ISR mittels SIGNAL(signame) oder INTERRUPT(signame). Bei letzterem wird im Prolog der Funktion der Interrupt wieder "enabled", was "nested interrupts" ermöglicht / zur Folge hat. Achtung: Es gibt in den mir geläufige 8Bittern keine Prioritäten, es kann also jeder Interrupt innerhalb dieser Routine zuschlagen. Dein Code muß das vertragen können.
@Jörg: SIGNAL und INTERRUPT sind veraltet! Sie werden zwar aktuell noch unterstützt, sollten aber nicht mehr verwendet werden.
1 | ISR(XXX_vect) |
2 | {
|
3 | //Anweisungen
|
4 | }
|
erzeugt eine herkömmliche, nicht unterbrechbare ISR und
1 | void XXX_vect(void) __attribute__((interrupt)); |
2 | void XXX_vect(void) |
3 | {
|
4 | //Anweisungen
|
5 | }
|
kann für "nested Interrupts" verwendet werden.
@ Jörg >Achtung: Es gibt in den mir geläufige 8Bittern keine Prioritäten, es Lass das mal nicht den Peter hören . . . ;-) >kann also jeder Interrupt innerhalb dieser Routine zuschlagen. Dein Code >muß das vertragen können. In einer Routine ja, in einem Interrupt nicht unbedingt. MFG Falk
@ Falk Bei einigen 8051 Typen gibt es Prioritäten! Schlagt euch nicht was beim GCC gemacht wird, das hilft meinem ICC eh nicht weiter. Werde mir das Handbuch gleich ansehen, vielleicht gibt es hierzu eine Information, die ich nun meinem Problem zuordnen kann.
@johnny.m: Veraltet, aha, warum? Wieder was gelernt. Statt in einem konkreten Beispiel
1 | SIGNAL(SIG_OUTPUT_COMPARE1B) |
2 | {
|
3 | // mein Code
|
4 | }
|
schreibe ich nun also
1 | ISR(SIG_OUTPUT_COMPARE1B) |
2 | {
|
3 | // mein Code
|
4 | }
|
Wo ist da der substanzielle Unterschied?
Beim ICC Compiler gibt es anscheinend diese Unterscheidung nicht. Ich versuche es nun mit dem einfachen ein bau von "SEI" und hoffe das es nicht knallt. Wenn jemand noch eine Idee hat nur raus damit. Bin für fast alles offen.
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.