Atmega8 USART überträgt falsche Daten

Ich versuche, USART auf meinem atmega8-16PU-Mikrocontroller zum Laufen zu bringen. Ich habe die Dokumentation studiert und die Codebeispiele von dort genommen. Ich habe es geschafft, die Daten vom Mikrocontroller zum PL-2303HX-Chip zu übertragen, der über USB mit meinem Computer verbunden istGeben Sie hier die Bildbeschreibung ein

Das Problem ist, dass ich andere Daten erhalte als die, die ich von mcu sende. Hier ist der Code:

#define F_CPU 8000000UL // Clock Speed
#define BAUD 9600
#define MYUBRR (((F_CPU / (BAUD * 16UL))) - 1)

void USART_Init( unsigned int ubrr)
{
    /* Set baud rate */
    UBRRH = (unsigned char)(ubrr>>8);
    UBRRL = (unsigned char)ubrr;
    /* Enable receiver and transmitter */
    UCSRB = (1 << RXEN) | (1 << TXEN);
    /* Set frame format: 8 data bits, 1 stop bit */
    UCSRC = (1 << URSEL) | (1 << USBS) | (1 << UCSZ0);
}

void USART_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) );
    /* Put data into buffer, sends the data */
    UDR = data;
}

int main()
{
    USART_Init(MYUBRR);
    while(1)                      /* run continuously */
    {
        USART_Transmit('a');
        _delay_ms(100);
    }
}

Ich bekomme 0x80 0x00 auf der Seite des Empfängers und das ist nicht das 'a'-Symbol. Wenn es wichtig ist, wird ein 12-MHz-Quarz an den PL-2303HX-Chip angeschlossen. Was mache ich falsch?

Antworten (2)

Häufigster Fehler: Sie haben die (Standard-)Clock Div8 Fuse vergessen und Ihre MCU läuft mit 1 MHz statt 8 MHz. Versuchen Sie, Ihre COM-Baudrate auf dem PC auf 1200 Baud einzustellen.

Noch ein Nitpick:

#define FOSC 8000000UL // Clock Speed
...
#define MYUBRR (((F_CPU / (BAUD * 16UL))) - 1)

Beachten Sie, dass Sie es in Ihrem Makro definiert FOSC, aber dann verwendet haben .F_CPU

Danke für deine Antwort. Was die Define-Direktive betrifft, so ist es meine Schuld, ich habe den Code nicht richtig kopiert. Siehe bitte den Kommentar oben. Ich habe gerade versucht, die Baudrate des COM-Ports auf 1200 zu ändern, ohne Erfolg. Jetzt bekomme ich das 0xE1 aus dem Portcode und das ist immer noch nicht das 'a'-Zeichen
Ich habe 2 Stoppbits mit Baudrate 1200 verwendet und alles scheint richtig zu funktionieren! Vielen Dank. Aber mich interessiert trotzdem, warum die Daten bei Verwendung von 1 Stoppbit falsch übertragen werden?
Wo befindet sich DIV8?

Sie berechnen Ihre Baudrate falsch. Sie haben #define FOSC 8000000UL als Taktgeschwindigkeit Ihrer Uhr definiert, aber Ihre Baudratenberechnung erfordert ein F_CPU-Symbol. Dieses Symbol wird in der #include-Bibliothek als 1 MHz definiert. Ihre berechnete Baudrate ist also falsch, ebenso wie die Zeit in Ihrer Verzögerung. Ändern Sie also diesen FOSC in F_CPU und definieren Sie ihn vor dem #include oder definieren Sie ihn so, dass Sie die Option -D für Ihren Compiler verwenden. Hoffe das hilft

Entschuldigung, ich habe den Code falsch kopiert, FOSC wurde früher definiert, also wurde es nicht kopiert.