String via Usart senden (Xmega)

Gast #1500085
Lesenswert?

Schönen guten Abend,

ich stehe gerade irgendwie auf dem Schlauch.

Ich versuche mit einem Xmega128A1 über den Usart einen String zu 
übertragen, das funktioniert aber nicht richtig.

Der Usart ist richtig initialisiert, ich kann einzelne Chars richtig 
übertragen und ich kann auch ein char-array (siehe unten b[]) 
übertragen, nicht aber das "Hello World". Ich nutze das Standard 
make-File von avrgcc. Ich hatte erst gedacht, das "Hello World" wird 
nicht beim Starten ins SRAM kopiert, das müsste aber der Fall sein. Nach 
dem kompilieren steht auch in der Statusteile:
Data:         24 bytes (0.3% Full)
(.data + .bss + .noinit)

(Im Programm ist noch einen String zum Testen, deshalb die 24 bytes)

Ich habe noch nie damit bei AVRs Probleme gehabt, gibts beim Xmega 
irgendwas zu beachten?

Für Tipps wäre ich dankbar.
Thorsten
1
char b[20];
2

3
b[0] = 'A';
4
b[1] = 'B';
5
b[2] = 'C';
6
b[3] = 'D';
7
b[4] = 'E';
8
b[5] = 0;
9

10
usart_sendstring(b);                   // geht
11

12
usart_sendstring("Hello world\n\r");   // geht nicht
13

14
void usart_sendstring(const char *s)
15
{
16
  while (*s)
17
  {  
18
    while((USARTC0.STATUS & USART_DREIF_bm) == 0) {};
19
    USARTC0.DATA = *s;
20
    s++;
21
  }
22
}
23

24
void usart_putc(char c)
25
{
26
    while((USARTC0.STATUS & USART_DREIF_bm) == 0) {};
27
    USARTC0.DATA = c;
28
}
#1503194
Lesenswert?

> Ich versuche mit einem Xmega128A1 über den Usart einen String zu
> übertragen, das funktioniert aber nicht richtig.

Kannst du das etwas präzisieren? 'funktioniert nicht' ist die denkbar 
schlechteste aller Fehlerbeschreibungen.

Ansonsten würde ich noch vorschlagen in der usart_sendstring auf 
uasrt_putc zurückzugreifen. Das ist jetzt aber nicht dein Problem
1
void usart_sendstring(const char *s)
2
{
3
  while (*s)
4
  {  
5
    usart_putc( *s );
6
    s++;
7
  }
8
}
Gast #1503386
Lesenswert?

Hallo ihr beiden,

wenn ich den string "Hello world" übertragen möchte, kommt eben nicht 
das an, was ankommen sollte. Das Array kommt allerdings richtig an und 
das verstehe ich nicht ganz, da ja eigentlich sowohl der String als auch 
das Array im SRAM des Mikrocontrollers liegen und es hier eigentlich 
keinen Unterschied bei der Ausgabe gibt, ausser vielleicht der 
Speicherinhalt und natürlich die Startadresse.

Ich habe erst vermutet, dass vielleicht der String nicht ins SRAM gelade 
wird, der ist aber dort. Das habe ich mit dem Simulator getestet, der 
String liegt an Adresse 0x2000, hier fängt beim Xmega das SRAM an. Das 
erste Byte, welches in das Usart-Datenregister kopiert wird, ist das "H" 
... kommt mir irgendwie unheimlich vor :-D

Ich werde das alles auch noch mal mit Hardwaresimulator testen, da ist 
bestimmt irgenwo ein blöder Denkfehler. Ich habe das alles schon x-mal 
mit AVRs gemacht. Naja, was bisher oft bei solchen Sachen geholfen hat, 
ein bisschen Abstand von der Sache, und plötzlich löst sich das Problem 
wie von selber ... kennt der eine oder andere von euch bestimmt auch ;-)

Thorsten

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