Forum: Mikrocontroller und Digitale Elektronik UART initialisieren


von Anfänger (Gast)


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.

von XXX (Gast)


Lesenswert?

Hallo

Speck doch dein Programm erst mal ab auf nur senden.
Wenn das funktioniert, dann kommt das Empfangsprogramm
dran.

MfG
Joachim

von Markus O. (pipimaxi)


Lesenswert?

Was genau funktioniert denn nicht? Senden? Empfangen? Wo bleibt er 
hängen? Meine Glaskugel is leider kaputt -.-

MfG
Markus

von Frank M. (ukw) (Moderator) Benutzerseite


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

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.