Forum: Compiler & IDEs [C] Probleme beim auslesen von Strings


von SinoTech (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bin gerade dabei mich mit Mikrocontrollern zu befassen und (nachdem 
die Grundlagen funktionieren) würde mir gerne ein paar Debug-Ausgaben 
über die UART Schnittstelle an den PC senden. Die Kommunikation 
funktioniert auch im großen und ganzen, nur kommt von den Strings die 
ich im Programm angegeben habe nur Müll an. Ich habe verschiedene 
Möglichkeiten ausprobiert (Im flash speichern und auslesen, String einem 
globalen/lokalen pointer zuweisen, ...) aber das einzige was 
funktioniert hat war:

- gcc-4-1-2: Byteweises befüllen eines Puffers, Puffer mit strcpy füllen
- gcc-4.3.3: Byteweises befüllen eines Puffers
- gcc-3.4.5: Byteweises befüllen eines Puffers

Als uM benutze ich den ATmega8, als Programmer den mySmartUSB MK 2 von 
myAvr.de (der reicht auch die Daten vom UART durch).
Den Code habe ich an das Post angehängt. Bin für jede Hilfe dankbar, 
denn mittlerweile weiß ich wirklich nicht mehr was ich machen soll.

Cheers,

Sino

von SinoTech (Gast)


Lesenswert?

Hätte ich beinahe vergessen:

1. Die Ausgabe auf dem Terminal sieht etwa so aus:

   4????'mnopqr

   Es werden also nur die Zeichenketten c5 und c6 korrekt gesendet

2. Gebaut wurde unter Linux mit gcc-4.1.2:

   avr-gcc -mmcu=atmega8 main.c -mmcu=atmega8 -c -o main.o
   avr-gcc main.o -L/usr/lib/binutils/avr/2.19.1/ 
-Wl,-Map=main.elf.map,--cref -o main.elf


Danke schonmal im voraus.

Cheers,

Sino

von gast (Gast)


Lesenswert?

ich hatte mit den flash sachen auch probleme ...

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

das hatte mir geholfen


C4 ist ja ein pointer .. das müsste auch etwas anders behandelt werden
ich tu mich mit zeigern auch schwer ^^

von Thomas W. (thomas100)


Lesenswert?

Dein Code ist so eigentlich richtig.

Zur Sicherheit hab ich ihn mal in meinen Atmega168 geladen und da läuft 
er.
(Ich hab allerdings keine serielle Schnittstelle dran sondern hab mit 
einem JTAG-ICE überprüft, ob die Daten im Senderegister ankommen)

Auch im Simulator das gleiche Ergebnis.

Hast du vielleicht Probleme mit der Frequenz, dass du die Baudrate nicht 
triffst und Samplefehler auftreten?
Parität falsch gewählt? Anzahl Stop-Bits falsch?

gast schrieb:
> C4 ist ja ein pointer .. das müsste auch etwas anders behandelt werden

C4 ist ein Pointerarray. Sobald du mit dem Indexoperator auf so ein 
Array zugreifst, erhälst du den Inhalt, in dem Fall also ein char.



Gruß
Thomas

von SinoTech (Gast)


Lesenswert?

Erstmal danke für eure Antworten.
Also der Code an sich scheint in Ordnung zu sein. Ich habe ihn jetzt mal 
unter Windows mit "MyAVR Workpad Plus" (war als Demo bei meinem 
Anfängerboard dabei :-) ) gebaut und dann funktioniert es.
Dachte dann es würde evtl. an den Settings liegen mit denen ich den 
avr-gcc unter Linux gebaut habe, und habe mir mal WinAVR installiert 
(benutzt den Win32 Port des gcc's). Kommt aber auf's gleiche raus als 
wenn ich unter Linux arbeite.

@Thomas
Benutzt du den gcc zum bauen? In dem Fall würde ich mir die Tage einen 
anderen Controller besorgen und testen, evtl. hat der gcc ja Probleme 
mit dem ATmega8.

Cheers,

Sino

von Oliver (Gast)


Lesenswert?

>In dem Fall würde ich mir die Tage einen
>anderen Controller besorgen und testen, evtl. hat der gcc ja Probleme
>mit dem ATmega8.

Wenn, dann hätte er mit allen AVR's Probleme. Unter Linux solltest du 
sicherstellen, daß du eine fehlerfreie avr-gcc-Version benutzt, die 
mitgelieferten avr-packages sind nicht immmer auf dem neuesten Stand.
Die aktuelle WinAVR-Version ist aber in Ordnung.

Und wenn myAVR das Programm, ohne zu meckern, übersetzt, dann nutzt das 
auch einen avr-gcc. Schau doch mal nach, welche Version das ist.

Oliver

von SinoTech (Gast)


Lesenswert?

Hab es jetzt endlich zum laufen bekommen. Fehler war das ich die 
Ausgabedatei vom letzten Befehl auf den ATmega brennen wollte:

1. avr-gcc -mmcu=atmega8 main.c -mmcu=atmega8 -c -o main.o
2. avr-gcc main.o -L/usr/lib/binutils/avr/2.19.1/ 
-Wl,-Map=main.elf.map,--cref -o main.elf

Bin davon ausgegangen das "main.elf" dann das fertige binary ist und ich 
es ohne Änderung direkt mit avrdude brennen kann.

avrdude -c avr910 -p m8 -P COM7 -v -U flash:w:main.hex

Da es aber ins flash geschrieben wird, muss man anscheinend vorhher die 
.eeprom Section rauswerfen (klingt logisch ;-) ):

avr-objcopy -O ihex -R .eeprom main.elf main.hex

Dann funktioniert es auch :-)

Danke nochmal für eure Antworten und ein schönes Wochenende.

Cheers,

Sino

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Oliver schrieb:

> Wenn, dann hätte er mit allen AVR's Probleme. Unter Linux solltest du
> sicherstellen, daß du eine fehlerfreie avr-gcc-Version benutzt, die
> mitgelieferten avr-packages sind nicht immmer auf dem neuesten Stand.

Neuer ist nicht unbedingt besser...
> Die aktuelle WinAVR-Version ist aber in Ordnung.

Auch WinAVR 20090313/20081205 hat kleine Bugs an Bord.

von Oliver (Gast)


Lesenswert?

>Auch WinAVR 20090313/20081205 hat kleine Bugs an Bord.

Schon, aber keine, die sich in den paar Zeilen des o.a. Programms 
bemerkbar machen.

Oliver

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.