Forum: Compiler & IDEs Mega32 gcc


von Jens P. (jmoney)


Lesenswert?

Hi,

ich habe Ulrich Radigs Webserver nachgebaut und sammle grade meine
ersten Erfahrungen mit C.
Dabei hab ich ein Problem, dem ich einfach nicht auf die Schliche
komme:
1
strcat (string,itoa(OCR1A,tmp,10));
funktioniert einwandfrei, aber bei
1
strcat (string,itoa(OCR2,tmp,10));
startet der Webserver quasi neu (er zeigt MMC/SD-Card nicht gefunden).

Ich kann OCR1A, OCR1B, als auch OCR2 ansonsten ganz normal beschreiben,
PWM funktioniert auch wie erwartet. Nur an dieser Code-Zeile hängt er
sich immer auf.

Da ich wie gesagt ganz neu in C bin, hoffe ich, einen dummen
Anfängerfehler gemacht zu haben, der euch alten Hasen sofort auffällt.
;)

von Uwe Nagel (Gast)


Lesenswert?

Wie hast du deine Strings (tmp, string) definiert ?
Passt da auch rein, was du reinschreibst?

von Jens P. (jmoney)


Lesenswert?

string ist als "char string[40]" und tmp als "char tmp[5]"
definiert.
tmp hab ich testweise schonmal größer gemacht (15), half nicht..

Danke trotzdem für den Tip!

von Uwe Nagel (Gast)


Lesenswert?

OCR2 ist ein 8-Bit Register, itoa erwartet und liest hier auch 16 Bit.
Offenbar gibt es ein Unglück, wenn auch noch TCNT2 gelesen wird.
Warum ist mir noch unklar. OCR1A hat 16 Bit.
Gibt der Compiler keine Warnung aus?

von Jens P. (jmoney)


Lesenswert?

OK jetzt habe ich den string auch mal größer gemacht und siehe da es
funktionierte.
In der Funktion tcp_add_datastring() wird der Stringpointer einfach
solange inkrementiert, bis der char 0 ist. Wenn ich den String immer
auf diese weise leere und mit strcat neue Zeichen hinten anhänge (das
macht doch strcat oder?), dann rennt mir die Variable also früher oder
später sonstwo hin. Ist das ein Fehler in tcp_add_datastring() oder
benutze ich es nur falsch?
Mein Lösungsansatz wäre jetzt, in tcp_add_datastring den ursprünglichen
Pointer zu sichern und am Ende wieder zu setzen. Ist das legitim oder
zerhau ich mir damit wieder was anderes?

von Jens P. (jmoney)


Lesenswert?

Nein der Compiler gibt keine Warnung aus. Bin ich also auf der falschen
Fährte? Sollte ich stattdessen lieber zuerst die 8bit-Register in
16bit-Variablen schreiben? Ich habe diese Code-Zeile nur von Ulrich
kopiert und das Register ausgetauscht. Bei ihm schien es auch immer
ohne Probleme zu funktionieren..

von Uwe Nagel (Gast)


Lesenswert?

habs grade mal ausprobiert, der Compiler macht bei 8 und 16 Bit
Registern alles richtig. Da läuft wohl wirklich dein 'string' über.

von Jens P. (jmoney)


Lesenswert?

Herzlichen Dank Uwe. Ich habe das mit dem Pointer zwischenspeichern mal
ausprobiert. Das macht zumindest im Moment hier das, was es soll. Werde
das mal Ulrich Radig unterbreiten.
Direkt an meinem ersten Tag C ein Pointerproblem behoben
aufdieschulterklopf ;)

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.