www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit UART Interrupt bei Mega8


Autor: Georg (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Georg (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.