mikrocontroller.net

Forum: Compiler & IDEs Mega32 gcc


Autor: Jens P. (jmoney)
Datum:

Bewertung
0 lesenswert
nicht 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:
strcat (string,itoa(OCR1A,tmp,10));
funktioniert einwandfrei, aber bei
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.
;)

Autor: Uwe Nagel (Gast)
Datum:

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

Autor: Jens P. (jmoney)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jens P. (jmoney)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jens P. (jmoney)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Uwe Nagel (Gast)
Datum:

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

Autor: Jens P. (jmoney)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.