Forum: Compiler & IDEs Problem mit UART Interrupt bei Mega8


von Georg (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Ihr,

ich steige momentan von Bascom auf C um und stoße dabei häufig auf
Probleme die früher ohne Probleme liefen.
z.B. der UART Interrupt.
Ich lasse das angefügte Programm auf einem Mega 8 laufen. Doch leider
funktioniert der Interrupt nicht. Hardware ist auch ok, das habe ich
mit
einem anderen Programm ohne Interrupt getestet (gleicher Takt und
Baudrate). Ich hab auch das Datenblatt und die Suche hier im Forum
bemüht aber ich finde den Fehler einfach nicht.
Ich wäre echt dankbar wenn da jemand drüber schauen könnte.

Das Beispiel ist übrigens von www.kreatives-chaos.com (Super Seite
übrigens)

Danke schon mal
Georg

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> ich steige momentan von Bascom auf C um und stoße dabei häufig auf
> Probleme die früher ohne Probleme liefen.

Klar, weil BASCOM ja praktisch eine Art Laufzeitsystem mitliefert
(soweit ich weiß).  Solange du damit auskommst, ist das natürlich
komfortabel, weil solche Dinge wie die Interrupts der Entwickler für
dich bereits ordentlich bearbeitet hat.

> Doch leider funktioniert der Interrupt nicht.

Probier's doch mal mit dem (globalen) Einschalten der Interrupts. ;-)

Ein

sei()

irgendwo nach dem Initialisieren der Hardware könnte Wunder helfen.

Nur mal so:

    /* Daten aus dem Puffer lesen ... */
    buffer = UDR;

    /* ... warten bis der Sendepuffer leer ist ... */
    while ( !( UCSRA & (1<<UDRE)) )
        ;
    /* ... und gleich wieder zurück schicken */
    UDR = buffer;

Da musst du eigentlich nicht warten.  Die Daten können ja nicht
schneller einlaufen, als man sie auch wieder senden kann.  Da der
Sender einen einstufigen Puffer hat (außer dem Schieberegister mit dem
aktuell gerade in der Sendung befindlichen Zeichen gibt es noch ein
Pufferregister, das man während des Schiebens bereits wieder schreiben
kann), muss man nichtmal ein einziges Bit testen.  Die Routine
reduziert sich also zum etwas lustig anmutenden:

   UDR = UDR;

von Georg (Gast)


Lesenswert?

Hallo Jörg,

Dein Tip war natürlich entscheident. Habe sei() auch schon selber
probiert aber wohl nicht an der richtigen Stelle. Ich dachte eigentlich
die Interrupts sind automatisch durch das aufrufen der avr/interrupt.h
eingeschaltet.
Danke auch für den UDR=UDR;-Tip Funktioniert einwandfrei.

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.