interupts prioritätenproblem ( atmega8)

Gast #1072654
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
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
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
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
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
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
#1072757
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
Gast #1072766
>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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.