Forum: Mikrocontroller und Digitale Elektronik Interupt prioritäten beim AVR?


von peter (Gast)


Lesenswert?

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


von Falk (Gast)


Lesenswert?

@ 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



von Peter (Gast)


Lesenswert?

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

von Jörg (Gast)


Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

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

von Falk (Gast)


Lesenswert?

@ 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


von Peter (Gast)


Lesenswert?

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

von Jörg (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.