Kein korrektes Signal von ATMEGA162 UART

Ich habe folgende Schaltung:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Und dieser Code, um es auszuführen:

#define F_CPU 4915200UL     // Quarz with 4.9152Mhz
#define BAUD 9600

#include <asf.h>
#include <avr/io.h>
#include "helpFile.h"        // set/clear Bit (LED) 
#include <util/delay.h>

void USART_Init( unsigned int ubrr )
{
    /* Set baud rate */
    UBRR0H = (unsigned char)(ubrr>>8);
    UBRR0L = (unsigned char)ubrr;
    /* Enable receiver ?nd transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format 8data, 1stop bit */
    UCSR0C = (1<<URSEL0)|(1<<USBS0)|(3<<UCSZ00);
}

void USART_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !( UCSR0A & (1<<UDRE0)) )
    ;
    /* Put data into bu?fer, sends the data */
    UDR0 = data;
}

void main( void )
{
    USART_Init(31);
    DDRB = ( 1 << PB0 );

    while(1)
    {
        USART_Transmit('C');
        PORTB ^= ( 1 << PB0 );  
        _delay_ms(1000);   
    }
}

Wenn ich diesen an ein UART/USB Tool anschließe und den Terminal Monitor mit 9600Boud rate und 8n1 starte bekomme ich leere Meldungen. Können Sie mir sagen, was ich falsch gemacht habe / was ich ändern muss, damit es funktioniert?

Der Kristall im Schaltplan ist falsch angeschlossen. Hast du es direkt auf dem eigentlichen Board?
@venny Entschuldigung, nur der Schaltplan war auf der Platine falsch, es ist richtig (oben korrigiert).
Sie scheinen nie die Ergebnisse von util/setbaud.h...
@IgnacioVazquez-Abrams, der aus älteren Tests stammt
Hast du auf externen Quarzoszillator umgestellt?
Die Kondensatoren an den Quarzleitungen (C1 und C2) sollten etwa 22 pF haben, nicht 22 uF.

Antworten (1)

Obwohl Sie angegeben haben, dass Sie verwenden 1 hör auf, USBS0 ermöglicht zwei. Aber das sollte nichts stören.

Größeres Problem ist im Baudratengenerator. Die Baudrate im Normalmodus wird berechnet als F Ö S C 16 ( UBRR+1 ) . Also ist UBRR F Ö S C 16 B R 1 und für 4.915200 M H z es ist 31 , nicht 51 .

Bearbeiten: Ein weiteres Problem gefunden, falsche Bitverschiebung im UART-Konfigurationsregister C. Es sollte sein 3<<UCSZ00 , nicht 3<<UCSZ01 .

Ich habe es von 51 auf 31 geändert und das Terminal auf 8n2, aber das Ergebnis ist dasselbe (ich bekomme etwas, aber nicht das Zeichen)
@kimliv Antwort aktualisiert, funktioniert es jetzt?
Okay, dass zwei Teile falsch waren. Ich werde es auch im obigen Code korrigieren, damit andere es verwenden können.