ATMEGA 8515 UART sendet Mist statt string

Gast #2408368
Lesenswert?

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?
#2408397
Lesenswert?

DerVerzweifelte schrieb:
> zeigt der PC nur "'abcdefghijk".

Wenn genau das angezeigt wird, habe ich eine recht genaue Vorstellung, 
was falsch sein könnte. In dem geposteten Code ist dieser Fehler zwar 
nicht enthalten, aber das ist ja auch gar nicht der tatsächliche Code. 
Dieser würde ja noch nicht mal compilieren. Also zeig erst mal den 
richtigen Code, dann sehen wir weiter.
Gast #2408484
Lesenswert?

1
#include <avr/io.h>
2
#include <stdio.h>
3
#include <stdint.h>
4

5
#define F_CPU 8000000ul
6
#define BAUD 38400ul      // baud rate
7
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
8
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
9
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
10

11
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
12
  #error baud rate error!
13
#endif
14

15
int uart_putc(unsigned char c);
16
void uart_puts (char *s);
17

18
int main () {
19
// init UART
20
UBRRH = UBRR_VAL >> 8; // set baud rate (38400)
21
UBRRL = UBRR_VAL & 0xFF;
22
UCSRB |= (1<<RXEN) | (1<<TXEN); // enable RxD / TxD
23
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); // frame format 8bit data + 1 stop bit
24

25
  uart_puts("Hello World!");
26

27
}
28

29
int uart_putc(unsigned char c) {
30
  while (!(UCSRA & (1<<UDRE)))  // waits until UART data register is empty
31
  ;                              
32
  UDR = c; // sends char                     
33
  return 0;
34
 }
35

36
void uart_puts (char *s) {
37
  while (*s != '\0') { // send all chars except \0 (end of string)
38
      uart_putc(*s);
39
      s++; // increment pointer
40
  }
41
}

Sry, hab den Quelltext gekürzt (UART Empfangsfunktionen rausgeworfen) 
und hab ausversehen die Prototypen der Funktionen gelöscht...
#2408531
Lesenswert?

DerVerzweifelte schrieb:
> Sry, hab den Quelltext gekürzt (UART Empfangsfunktionen rausgeworfen)
> und hab ausversehen die Prototypen der Funktionen gelöscht...

Ich bin nicht wirklich davon überzeugt, dass das jetzt der Code ist, mit 
dem die Ausgabe "'abcdefghijk" kommt. Denn in dem Code, der diese 
Ausgabe produziert, steht mit ziemlicher Sicherheit "uart_putc(s);" und 
nicht "uart_putc(*s);".
Gast #2408543
Lesenswert?

Nein, dass ist der Quelltext. uart_putc(s) würde keinen Sinn machen, ich 
will ja ein Zeichen ausgeben daher nimmt man ja das Zeichen auf das der 
Pointer zeigt also uart_putc(*s). Das war mir schon klar, aber irgendein 
Fehler muss ja noch da sein, weil immer noch net geht...
Gast #2408568
Lesenswert?

So ich hab in der Zwischenzeit mal ein neues Projekt angelegt und den 
Code reinkopiert, um sicherzustellen dass ich net irgendwas verstellt 
hab. Und siehe da es läuft.
Woran liegts? Ich hab das Projekt mit AVR-Studio 4 erstellt nutzte aber 
mittlerweile AVR-Studio 5, weil mir der Editor besser gefällt, ob dass 
die Ursache ist?
Gast #2408614
Lesenswert?

Ja das neue in AVR-Studio 5 erstellte Projekt läuft. Da is wohl beim 
Konvertiren der Projektdaten irgendetwas schiefgelaufen, da konnte ich 
lange nach dem Fehler im Quelltext suchen...
Danke für die Hilfe!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren