Hi,
also ich habe jetzt auch zwei Stunden rumprobiert und mich gewundert warum bei mir nur Zeichenmüll rauskam. Ich hatte erst
UCSRB = (1<<RXEN) | (1<<TXEN);
UCSRC = (1<<UCSZ1) | (1<<UCSZ0);
UCSRC = (1<<URSEL)
da stehen und damit funktioniert es NICHT.
Ändere ich es auf
UCSRB = (1<<RXEN) | (1<<TXEN);
UCSRC = (1<<URSEL)| (1<<UCSZ1) | (1<<UCSZ0);
um funktioniert es (nur so am Rande).
Hier hast du ein funktionierendes Programm was du verwenden kannst:
Ich hab halt alles vom UART händlich gemacht (finde ich zum ersten lernen bischen besser als die "fertigen" Libs zu verwenden. Da versteht man den Ablauf bischen besser.Code:/* * Hallo Welt.c * * Created: 03.05.2012 20:46:19 * Author: Daniel */ #define F_CPU 16000000UL // CPU Takt für das delay #include <avr/io.h> #include <avr/interrupt.h> #include <string.h> #include <util/delay.h> #include <stdlib.h> char data[50] = "Hallo"; // Text der ausgegeben werden soll int lenght = 0x00; int main(void) { UART_Init(); while(1) { Send_UART_Char(data); _delay_ms(500); } } void UART_Init() { UCSRB = (1<<RXEN) | (1<<TXEN); // Rx und Tx aktivieren UCSRC = (1<<URSEL)| (1<<UCSZ1) | (1<<UCSZ0); // 8 Bit Nachrichtenlänge einstellen UBRRH = 0x00; UBRRL = 0x33; // Baudrate auf 19200 festlegen } void Send_UART_Char(char data[]) { char Counter; lenght = strlen(data); while(Counter < lenght) { while (!(UCSRA & (1<<UDRE))); UDR = data[Counter]; Counter++; } Counter = 0x00; while (!(UCSRA & (1<<UDRE))); UDR = 0x0A; while (!(UCSRA & (1<<UDRE))); UDR = 0x0D; }
Vergleich das mal mit deinem Programm. Von der void Send_UART_Char brauchst du dann nur die Zeilen nehmen die nur 1 Zeichen senden (der Rest ist eine Schleife womit ein ganzer String gesendet wird). Ein einzelnes Zeichen sendest du so:
while (!(UCSRA & (1<<UDRE)));
UDR = 0x0D;
Ich denke du hast sicher nur eine Kleinigkeit verkehrt gemacht![]()







Zitieren

Lesezeichen