Hallo
also zu deinem Code:
UCSRC = (3<<UCSZ0);
Ich weiß nicht ob das so geht...
Ich würde es vielleicht so versuchen:
UCSRC = (1<<UCSZ1) | (1<<UCSZ1);
Und warum verwendest du 2 Stoppbits? Einfach nur so, oder bringt das irgendwie Vorteile?
Und hier nochmal mein erster Code, den ich mal irgendwann im Internet gefunden hab. Auf meinem Atmega16 funktioniert er, vielleicht kannst du damit deine Schaltung testen.
Code:
#include <avr/io.h>
#include <inttypes.h>
// Sollte schon im Makefile definiert sein.
// In dem Fall hier einfach löschen.
#define F_CPU 16000000UL
#define BAUD 9200UL
#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);
// 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;
}
}
mfG
Lesezeichen