Problem mit UART Interrupt bei Mega8

Gast #237271
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
Angehängte Dateien:
Moderator Persönliche Seite #237272
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;
Gast #237273
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren