www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Stringprobleme mit WinAVR (char x[])


Autor: Thomas Decker (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich arbeite gerade an meinem ersten Projekt mit einem ATmega.
Gearbeitet habe ich schon mit einem 80C51 und einem Renesas R8C.
Folgendes Problem bringt mich gerade zum grübeln:
Manchmal funktioniert die Funktion und manchmal nicht, es hängt davon
ab, wo ich sie aufrufe.
Der ATmega springt jedes mal in die Funktion, aber manchmal trifft die
Bedingung der while()-Schleife schon von Anfang an nicht zu. So als
wäre der übergebene String 0 Zeichen lang.
Hat jemand eine Idee?

Grüße
Thomas

Autor: Thomas Decker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sollte dazu erwähnen, wie die Funktion aufgerufen wird:
Normalerweise einfach so: sendString("test");
Dabei wird ja automatisch nach dem letzten Zeichen eine NULL angefügt,
um das Ende des Strings zu markieren.
Die While()-Schleife läuft ja solange, bis die NULL erreicht ist. Wie
kann die NULL schon vorher auftauchen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Funktion an sich ist in Ordnung.
Bedenke: Was du siehts, sind die Auswirkungen eines
Fehlers, der an ganz anderer Stelle sitzen kann.
Du siehts immer nur die Auswirkungen, niemals
die Ursache. Ein derartiges Verhalten kann
durch vielerlei Dinge verursacht werden.
Die häufigsten:
 * Array Überlauf
 * Du weist etwas an eine String Konstante zu
 * Da wir auf einem µC mit arge eingeschränkten
   Resourcen sind, ist auch ein Stacküberlauf
   nicht auszuschliessen.


Da

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Überprüfe mal bitte auf die binäre Null '\0'. Ich bin mir nicht
sicher ob der C-Standard vorsieht das '\0' == 0 ist.

Wenn du dir nicht sicher bist, untersuche mal wann die Schleife
abbricht:

unsigned char sendString(char string[])
{
unsigned char i;
i = 0;

while(string[i] != 0)
{
  sendByteAsClear2(string[i]);
  i++;
}
return i;
}

und danach vielleicht mal i abfragen, welchen Wert das hat. Noch besser
wäre es, du würdest den Nullterminierten String nicht einfach
voraussetzen, sondern die Länge des Strings der Funktion mitgeben.

Ansonsten ist (wie Karl Heinz schon sagte) der Code den wir hier sehen
in Ordnung

Gruß Andreas

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du sehr viele Aufrufe mit viel Text? Die Eigenart des AVR-GCC
besteht darin, den "Text" zwar als Konstante im Flash abzuspeichern,
aber zu Beginn der Programmausführung in den Ram zu kopieren. Somit
wäre es durchaus möglich, dass bei vielen Texten irgendwann der Ram
voll ist.
Es gibt eine Möglichkeit dies zu verhindern, schau Dir hierzu die
Bibliothek "pgmspace.h" an. Im Tutorial könnte dies weiterhelfen:
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Thomas Decker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antworten, es scheint wirklich daran zu liegen, dass
ich zu viele "Strings" habe. Mal ein paar auskommentiert und das ganze
funktioniert perfekt. Werde mir den Link heute abend mal genau
anschauen.

Die Dezimalzahl 0 entspricht dem ersten Ascii-Zeichen "NULL",
deswegen klappt das auch ohne \.

Zum Thema RAM: Ich verwende einen ATmega168, eigentlich war ein ATmega8
geplant, aber ich habe sicherheitshalber doch auf doppelten Flash
gewählt. RAM hat der aber auch nur 1k. Über 512Bytes werden davon schon
von einer FAT16-Schreib/Leseroutine belegt.

Aufgabe des ganzen:
Der ATmega ist immer im Power-Down-Mode, wird per interrupt alle 15min
von einem Realtime-IC(
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2686 ) geweckt und liest
an einem Analogeingang den Druck eines Drucksensors ein und schreibt
diesen Wert mit der Aktuellen Uhrzeit/Datum auf eine MMC-Karte.
Das ganze hat den Zweck, den Wasserstand in einer Höhle zu
dokumentieren.

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.