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.
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.
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
> 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.
Wie beim GCC muß man auch beim IAR das UDR lesen, damit das Flag zurückgesetzt wird.
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
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 ?
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
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.