Forum: Mikrocontroller und Digitale Elektronik String via Usart senden (Xmega)


von Thorsten (Gast)


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
}

von Helmut R. (heru01)


Lesenswert?

Hallo Thorsten,

Vorschlag :
1
void usart_sendstring(char *s)
2
{
3
  while (*s)
4
  {  
5
    while((USARTC0.STATUS & USART_DREIF_bm) == 0) {};
6
    USARTC0.DATA = *(s++);    
7
  }
8
}

Ohne dass ich jetzt getestet habe oder auf 1000 Dinge zu gucken.

Teste das mal aus.

Gruß
Helmut

von Karl H. (kbuchegg)


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
}

von Thorsten (Gast)


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

von Manuel K. (mkauf)


Lesenswert?

Hi,

naja was meinst du mit "kommt nicht das raus was soll" kommt irgendwas 
raus ? oder komms zu oft oder ..... ?!?

Gruß

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.