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:
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;
}
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.
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
Lesezeichen