Forum: Compiler & IDEs Ständiger Uart Complete Interrupt?


von Drago Köhler (Gast)


Angehängte Dateien:

Lesenswert?

Hallo NG,

folgendes Szenario:
Der ATmega8 soll mit einem Mega64 über den UART kommunizieren. Dabei
soll der Mega8 bei einem empfangenem Byte einen Receive Complete
Interrupt auslösen.

Schon bei dem Testprogramm wird ständig ein Interrupt ausgelöst, obwohl
am UART Eingang nichts angeschlossen ist. Wie kann das sein?

Gruß
Drago

Achso: Compiler ist der IAR.

von Jörg Wunsch (Gast)


Lesenswert?

Erstens bist Du mit dem IAR hier im falschen Forum -- schau mal bitte
auf die Überschrift.

Zweitens, lies Dir bitte das Datenblatt durch, wann die
Interruptbedingung für einen Empfangsinterrupt zurückgesetzt wird...

Außerdem: in einer Interruptroutine wartet man nach Möglichkeit nicht
längere Zeit.

von Drago Köhler (Gast)


Lesenswert?

Es soll ja ein Empfangsinterrupt ausgelöst werden, wenn ein
vollständiges Byte da ist.

Nur Das Problem ist, das es ja gar keinen Anlass gibt einen
Empfangsinterrupt auszulösen, da am UART nix angeschlossen ist...

> Außerdem: in einer Interruptroutine wartet man nach Möglichkeit
> nicht längere Zeit

alles nur für Testzwecke

von Jörg Wunsch (Gast)


Lesenswert?

> Nur Das Problem ist, das es ja gar keinen Anlass gibt einen
> Empfangsinterrupt auszulösen, da am UART nix angeschlossen ist...

Warum hast Du dann einen Interrupthandler und aktivierst den
Interrupt?

Irgendwelcher Schrott wird halt als Zeichen interpretiert (selbst ein
Zeichen mit `framing error' löst ja einen Interrupt aus, nachdem die
entsprechenden Taktzeiten rum sind), und der Fehler in Deiner ISR läßt
diese dann immer wieder aufrufen.

von Michael (Gast)


Lesenswert?

Wie beim GCC muß man auch beim IAR das UDR lesen, damit das Flag
zurückgesetzt wird.

von Peter D. (peda)


Lesenswert?

Es ist gängige Praxis, jedesmal, bevor man einen Interrupt freigibt, das
zugehörige Interrupt-Pending Flag zu löschen.

Damit vermeidet man eventuelle Fehlauslösungen.


Peter

von Drago Köhler (Gast)


Lesenswert?

ok, UDR auslesen fehlt noch. Stimmt. Das erklärt die Dauerschleife.

@Jörg
Du meinst irgend welches Rauschen am offenen RXD Pin (Da soll später
mal der Mega64 dran) kann einen Interrupt auslösen ?

von Jörg Wunsch (Gast)


Lesenswert?

Irgendein Bit, das als Startbit interpretiert wird, genügt.

von Drago Köhler (Gast)


Lesenswert?

Danke!
Es lag wirklich an dem Schaltungslayout, wodurch sämtlicher Schrott
einen Interrupt auslöste. Wenn der RXD-Pin mit einem Pull-Down
Widerstand gegen Masse gezogen wird, löst sich auch dieses Problem und
es treten keine "zufälligen" Interrupts mehr auf.
Das UDR muß natürlich, im Gegensatz zu meinem Erstposting ausgelesen
werden, um sich nicht in einer Dauerschleife zu verfangen.

Gruß
Drago

von Michael (Gast)


Lesenswert?

"Wenn der RXD-Pin mit einem Pull-Down
Widerstand gegen Masse gezogen wird, löst sich auch dieses Problem und
es treten keine "zufälligen" Interrupts mehr auf."

Das wundert mich ein bißchen: eigentlich sollten hierbei wiederholt
Interrupts ausgelöst werden, um dieses 'BREAK'-Signal anzuzeigen;
frame-error und overrun würde ich auch erwarten.
Ein Pullup wäre die richtige Beschaltung.

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.