Forum: Compiler & IDEs ATMEGA 8515 UART sendet Mist statt string


von DerVerzweifelte (Gast)


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?

von Stefan E. (sternst)


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.

von DerVerzweifelte (Gast)


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...

von Stefan E. (sternst)


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);".

von DerVerzweifelte (Gast)


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...

von Stefan E. (sternst)


Lesenswert?

DerVerzweifelte schrieb:
> uart_putc(s) würde keinen Sinn machen,

Natürlich würde es das nicht. Aber es würde exakt die beschriebenen 
Symptome erzeugen: Länge passt, aber Inhalt ist "'abcdefghijk".

Poste mal das lss-File.

Nachtrag: weitere Möglichkeit, du hattest diesen Fehler früher mal drin 
und programmierst das falsche (alte) HEX-File in den Controller.

von DerVerzweifelte (Gast)


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?

von DerVerzweifelte (Gast)


Lesenswert?

Durch das neue Projekt kann es das alte HEX-File net sein.

von Stefan E. (sternst)


Lesenswert?

DerVerzweifelte schrieb:
> Durch das neue Projekt kann es das alte HEX-File net sein.

Wie jetzt? Ich denke das neue Projekt ist das, was funktioniert?

von DerVerzweifelte (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.