interupts prioritätenproblem ( atmega8)

Gast #1072654
Lesenswert?

hallo zusammen,

Folgendes Problem. Ich habe einen atmega8 am laufen. Timer 0 alle 50 ms 
im interrupt. Das Problem ist, dass noch die UART im interupt läuft. 
Wenn nun etwas verschickt wird und vom atmega8 der interrupts der UART 
anspricht... kann es sein (wenn es gerade in einem ungünstigen Augeblick 
passiert), dass der Kontroller dann das empfangene ignoriert. (es wird 
der interrupt nicht ausgefuehrt) Ich habe schon ein paar Sachen 
ausprobiert mit sei() usw..(interrupts wieder aktivieren) aber es hat 
alles nichts geholfen. Weiss wer rat, wie ich das beheben kann?

danke und lg
#1072660
Lesenswert?

Hallo,

das kann normalerweise nicht passieren, der Interrupt bleibt stehen bis 
am Ende der Timer-ITQ der Interrupt wieder freigegeben wird und wird 
dann ausgeführt.

Es können Daten vom UART verloren gehen, wenn die Timer-IRQ länger 
braucht als der UART um 1 Byte zu empfangen, dan wird das vorige 
überschrieben und das passende Errorflag gesetzt.

Das wäre aber ein Designfehler bei Dir.
Grundregel ist nicht ohne Grund: Interruptroutinen kurz halten, Flags 
setzen damit die main-Routine sich um den Kram kümmern kann, wenn Zeit 
da ist.

Gruß aus Berlin
Michael
Gast #1072677
Lesenswert?

Hi

>prioritätenproblem

Gibt es nicht. 'Wer zu erst kommt, mahlt zu erst'

> (es wird der interrupt nicht ausgefuehrt)...

Wenn während eines laufenden Interrupts ein anderer auftritt, wird der 
gespeicheret und nach Beenden des laufenden ausgeführt. Ausnahme: Dauert 
die erste Interruptroutine zu lange, und trifft während der Zeit ein 
weiterer Interrupt der anderen Quelleein, geht der vorherige verloren. 
Das fällt aber in die Kategorie: Programmierfehler.

MfG Spess
Gast #1072684
Lesenswert?

danke für deine antwort. Es ist schon war.. meine timerinterrupt routine 
ist nicht gerade die kuerzeste. Es geht um das setzen und ruecksetzen 
von ports zu ganz bestimmten Zeiten (muss auf 50 ms genau sein). wenn 
ich das in der mainroutine machen wuerde, wäre das nicht mehr so 
genau!!??.. oder wie siehst du das ganze?

lg
Gast #1072707
Lesenswert?

Hi

>oder wie siehst du das ganze?

Dazu fehlen mir weiterführende Informationen. Allerdings habe ich bisher 
bei keinem Programm mit verschiedenen Interruptquellen Datenverluste bei 
der UART gehabt. Und meine Interruptroutinen sind manchmal auch nicht 
gerade minimalistisch. Vielleicht liegst aber auch nur an der 
Assemblerprogrammierung.

MfG Spess
#1072740
Lesenswert?

duron005 wrote:
> danke für deine antwort. Es ist schon war.. meine timerinterrupt routine
> ist nicht gerade die kuerzeste. Es geht um das setzen und ruecksetzen
> von ports zu ganz bestimmten Zeiten (muss auf 50 ms genau sein).

Selbst 1ms Genauigkeit sollte noch genug Rechenzeit übrig lassen, um 
nebenbei die UART einzulesen.

Ich benutze die UART in der Regel mit FIFO, d.h. der Interrupt liest nur 
in die FIFO ein und das Main kann dann in aller Ruhe den Datenrecord 
parsen.

Ein FIFO-Beispiel:
Beitrag "AVR-GCC: UART mit FIFO"


Peter
Gast #1072766
Lesenswert?

>meine timerinterrupt routine
>ist nicht gerade die kuerzeste. Es geht um das setzen und ruecksetzen
>von ports zu ganz bestimmten Zeiten

Was soll beim Setzen von Ports derart lange dauern, dass Dir dadurch 
UART-Interrupts verloren gehen? Du hast nicht zufällig irgendwelche 
Warteschleifen (Delay_ms etc.) im Interrupthandler?
Gast #1072872
Lesenswert?

duron005 wrote:
> Ich habe schon ein paar Sachen
> ausprobiert mit sei() usw..(interrupts wieder aktivieren) aber es hat
> alles nichts geholfen. Weiss wer rat, wie ich das beheben kann?

Also wenn du im Timerinterupt die Interupts wieder freigegeben hast, wer 
sollte dann den UART-Interupt aufhalten? Da muss du etwas Anderes 
vergurkt haben... poste doch mal ein reduziertes Minimalbeispiel.

P.S.: Sicher, dass dann nicht der Timer-Interupt ueberlaeuft?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren