UART initialisieren

Gast #2292274
Lesenswert?
• ▲
▼
Hallo zusammen,
Verzweifle gerade daran meinen UART-Port ans laufen zu bekommen. Habe 
das MyAVR Mk2 Board und benutze WinAVR.
Hab es einfach mal mit dem Programm von Kreatives-Chaos versucht aber 
ich bekomme einfach nicht gesendet oder empfangen.
Hier der Quellcode:
#include <avr/io.h>
#include <inttypes.h>

// Sollte schon im Makefile definiert sein.
// In dem Fall hier einfach löschen.
#define F_CPU       3686400UL

#define BAUD        9600UL
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)

// USART initialisieren
void
uart_init(void)
{
    // Baudrate einstellen (Normaler Modus)
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
    UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

    // oder einfacher:
    // UBRR = UBRR_BAUD;

    // Aktivieren von receiver und transmitter
    UCSRB = (1<<RXEN)|(1<<TXEN);

    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

int
main(void)
{
    uint8_t buffer;

    // USART initialisieren
    uart_init();

    while (1)
    {
        // Warten bis Daten empfangen wurden
        while ( !(UCSRA & (1<<RXC)) )
            ;

        // Empfangsregister auslesen
        buffer = UDR;

        // Warten bis der Sendepuffer frei ist
        while ( !( UCSRA & (1<<UDRE)) )
            ;

        // Daten in den Puffer schreiben und damit senden
        UDR = buffer;
    }
}
Würde mich freuen wenn mich jemand unterstützen könnte.
Moderator Persönliche Seite #2292298
Lesenswert?
• ▲
▼
Anfänger schrieb:
>     // Aktivieren von receiver und transmitter
>     UCSRB = (1<<RXEN)|(1<<TXEN);
>
>     // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
>     UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

Dreh die beiden Zeilen mal von der Reihenfolge her rum.

Statt

     UCSRB = (1<<RXEN)|(1<<TXEN);

würde ich schreiben:

     UCSRB |= (1<<RXEN)|(1<<TXEN);

Das wird aber nicht der Fehler sein, sondern eher die Reihenfolge der 
beiden Befehle das Problem sein. Hatten wir hier im Forum erst kürzlich. 
Dass da immer wieder Leute reintappen, lag an der falschen Reihenfolge 
dieser beiden Befehle im UART-Artikel. Dieser wurde daraufhin angepasst.

Gruß,

Frank

Antwort schreiben

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.

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.