Problem mit UART Interrupt bei Mega8

Gast #237271
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
> 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
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.