Forum: Mikrocontroller und Digitale Elektronik interupts prioritätenproblem ( atmega8)


von duron005 (Gast)


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

von Michael U. (amiga)


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

von spess53 (Gast)


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

von duron005 (Gast)


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

von spess53 (Gast)


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

von Falk B. (falk)


Lesenswert?

Siehe Interupt

von spess53 (Gast)


Lesenswert?

Hi

>Siehe Interupt

Ach. Dort das gleiche Problem?

MfG Spess

von Peter D. (peda)


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

von Falk B. (falk)


Lesenswert?

@ spess53 (Gast)

>>Siehe Interupt

>Ach. Dort das gleiche Problem?

Nöö, die Lösung!

MFg
Falk

von spess53 (Gast)


Lesenswert?

Hi

@Peter

Nicht nur du. Nützt aber nichts, wenn z.B. die Baudrate im Vergleich zum 
Timerinterrupt zu hoch ist.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

'die Lösung!' oder '*Die* Lösung'. Mir fallen bei solchen Problemen 
meist mehr als eine ein.

MfG Spess

von Peter D. (peda)


Lesenswert?

spess53 wrote:
> Nicht nur du. Nützt aber nichts, wenn z.B. die Baudrate im Vergleich zum
> Timerinterrupt zu hoch ist.

Ich benutze nur bis 115200 Baud, das sind 1280 Zyklen pro Byte, also 
noch reichlich Zeit für andere Interrupts.


Peter

von Gast (Gast)


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?

von Falk B. (falk)


Lesenswert?

@ spess53 (Gast)

>'die Lösung!' oder '*Die* Lösung'. Mir fallen bei solchen Problemen
>meist mehr als eine ein.

Macht du heute einen auf Korithenkacker? Passend zur Weihnachtszeit . . 
.

Fragende Grüsse
Falk

von P. S. (Gast)


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?

von Lutz (Gast)


Lesenswert?

@Falk:
Also Dein Link führt ins Nirvana, vielleicht, weil Interrupt falsch 
geschrieben ist. Genauso wie Korinthenkacker ...

von Falk B. (falk)


Lesenswert?

@ Lutz (Gast)

>Also Dein Link führt ins Nirvana, vielleicht, weil Interrupt falsch
>geschrieben ist.

Na dann eben mit Doppel-R

Interrupt

> Genauso wie Korinthenkacker ...

Und noch einer von der Sorte. Naja . . .

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.