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
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
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
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
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
Hi
>Siehe Interupt
Ach. Dort das gleiche Problem?
MfG Spess
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
@ spess53 (Gast) >>Siehe Interupt >Ach. Dort das gleiche Problem? Nöö, die Lösung! MFg Falk
Hi @Peter Nicht nur du. Nützt aber nichts, wenn z.B. die Baudrate im Vergleich zum Timerinterrupt zu hoch ist. MfG Spess
Hi 'die Lösung!' oder '*Die* Lösung'. Mir fallen bei solchen Problemen meist mehr als eine ein. MfG Spess
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
>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?
@ 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
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?
@Falk: Also Dein Link führt ins Nirvana, vielleicht, weil Interrupt falsch geschrieben ist. Genauso wie Korinthenkacker ...
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.