www.mikrocontroller.net

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


Autor: duron005 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: duron005 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interupt

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Siehe Interupt

Ach. Dort das gleiche Problem?

MfG Spess

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ spess53 (Gast)

>>Siehe Interupt

>Ach. Dort das gleiche Problem?

Nöö, die Lösung!

MFg
Falk

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

@Peter

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

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lutz (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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 . . .

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.