Hi,
ich verzweifel grad daran einen String über UART auszugeben. Einzelne
Zeichen kann ich problemlos senden, wenn ich 'a' sende kommt auch ein
'a' am PC an. Sende ich hingegen einen String z.Bsp: "Hello World!"
zeigt der PC nur "'abcdefghijk". Der µC sendet also die richtige Anzahl
an Zeichen nur der Inhalt stimmt nicht.
Ich verwende einen AtMega 8515 mit 8Mhz externem Quarz, eine Baudrate
mit 38400 Baud und den Quelltext aud dem AVR-GCC UART Tutorial.
1 | #include <avr/io.h>
|
2 | #include <stdio.h>
|
3 | #include <stdint.h>
|
4 |
|
5 | #define BAUD 38400ul // baud rate
|
6 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
|
7 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
|
8 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
|
9 |
|
10 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
11 | #error baud rate error!
|
12 | #endif
|
13 |
|
14 | int main () {
|
15 | // init UART
|
16 | UBRRH = UBRR_VAL >> 8; // set baud rate (38400)
|
17 | UBRRL = UBRR_VAL & 0xFF;
|
18 | UCSRB |= (1<<RXEN) | (1<<TXEN); // enable RxD / TxD
|
19 | UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); // frame format 8bit data + 1 stop bit
|
20 |
|
21 | uart_puts("Hello World!);
|
22 |
|
23 | }
|
24 |
|
25 | int uart_putc(unsigned char c) {
|
26 | while (!(UCSRA & (1<<UDRE))) // waits until UART data register is empty
|
27 | ;
|
28 | UDR = c; // sends char
|
29 | return 0;
|
30 | }
|
31 | void uart_puts (char *s) {
|
32 | while (*s != '\0') { // send all chars except \0 (end of string)
|
33 | uart_putc(*s);
|
34 | s++; // increment pointer
|
35 | }
|
36 | }
|
F_CPU ist in den Projekteinstellungen von AVR-Studio angegeben.
Hat irgend jemand eine Idee warum das nicht klappt?