Forum: Mikrocontroller und Digitale Elektronik ATtiny2313 / LCD2x16 / String Ausgabe fehlerhaft


von Robert D. (d0rni)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe auch mal etwas, wo ich nicht weiter weiß.

Ich habe ein LCD an einem ATtiny2313 angeschlossen, und bis jetzt 
funktionierte auch alles einwandfrei. Nur jetzt - um so länger der Code 
wird, werden die übergebenen Strings an das LCD fehlerhaft ausgegeben. 
Wie auf dem Bild zu sehen ist die Ausgabe der Menütexte "PWM1-3" 
problemlos, gebe ich aber "Menu4" aus, kommen kryptische Zeichen. Dabei 
ist es egal, ob ich den µC mit internem Takt oder Quarz betreibe - der 
Fehler bleibt.

Software: AVR Studio 6, Toolchain 3.0.4.65, STK500 und AVRISP MKII.

Hat da jemand einen Hinweis für mich?

Gruss Robert

von holger (Gast)


Lesenswert?

>Hat da jemand einen Hinweis für mich?

Dein RAM ist alle.

von Robert D. (d0rni)


Lesenswert?

Vielen Dank, das ging ja mal schnell. Da das Projekt noch nicht 
vollständig ist, heist es einen größeren µC zu nehmen.

von Stefan E. (sternst)


Lesenswert?

Robert Dorn schrieb:
> Da das Projekt noch nicht
> vollständig ist, heist es einen größeren µC zu nehmen.

Nicht zwangsläufig. Man könnte sich auch erst mal damit beschäftigen, 
wie man diese ganzen Strings aus dem RAM fernhält.

von Total-Hirnöderl (Gast)


Lesenswert?

Könnte das eventuell mit den Umlauten zusammenhängen? Schreib mal 
'MENUE' anstatt 'MENÜ'
u.U. müsste man die Zeichen mit einem in die Entwicklungsumgebung 
eingebauten Zeicheneditor selbst definieren. ü ist nicht üblich, gäll? 
;-)

von c-hater (Gast)


Lesenswert?

Robert Dorn schrieb:

> gebe ich aber "Menu4" aus, kommen kryptische Zeichen.

Bist du sicher, daß es tatsächlich das ist, was du ausgibst oder könnte 
es es sein, daß du in Wirklichkeit "Menü4" auszugeben versuchst?
Der springende Punkt ist hier das Vorhandensein oder Nichtvorhandensein 
eines Umlauts.

Allerdings sieht die Anzeige doch tatsächlich eher nach einer 
Stack-Heap-Kollision aus, wie ihn holger vermutet. Ich würde mal 
behaupten, man sieht hier drei Rücksprungadressen von Funktionsaufrufen 
(oder ISRs) und eine lokale Variable mit Bytegröße (oder ein gerettes 
Register) mit dem Inhalt 0x20.

Und wie Stefan Ernst schon korrekt (wenn auch etwas undeutlich) schrieb: 
(konstante) Strings haben im RAM absolut nix zu suchen, die gehören in 
den Flash. Da ist erstens viel mehr Platz und zweitens können sie da 
nicht überschrieben werden. Jedenfalls nicht vom Stack...

von Robert D. (d0rni)


Lesenswert?

Hallo, das mit dem String in den Progmem schreiben werde ich mir mal 
genauer ansehen - das Tut dazu habe ich eben kurz überflogen. Habe ich 
bis jetzt noch nicht gemacht, sollte nicht so schwer sein.
Zu den Sonderzeichen: da wird keines mit übergeben, wenn es ein Zeichen 
nicht kennt kommt eben ein anderes heraus, aber nicht gleich eine 
komplett verbogene Ausgabe. Der Fehler tritt ja auch bei 16 x "x" auf.

von Robert D. (d0rni)


Angehängte Dateien:

Lesenswert?

Vielen Dank, läuft!

Werd einfach alle meine Strings in das Array schaufeln oder für gleich 
lange Strings ein 2-dimensionales Array anlegen wie im Howto 
beschrieben.


Gruss Robert

von Stefan E. (sternst)


Lesenswert?

Robert Dorn schrieb:
> Vielen Dank, läuft!

Glück. 'menutext' ist um eins zu klein.

Überhaupt ist dieses Umkopieren ganzer Strings ins RAM keine wirklich 
gute Lösung. Schreibe dir lieber eine zusätzliche lcd_string Funktion 
(lcd_string_P), die direkt Strings im Flash als Argument akzeptiert. 
Hätte obendrein den Nebeneffekt, dass du die Strings in den Aufrufen der 
Form lcd_string("XXXX"); ebenfalls auf sehr einfache Weise ins Flash 
verfrachten könntest.

von Robert D. (d0rni)


Lesenswert?

was meinst du mit zu klein, wegen der \0 Terminierung? Muss ich mir 
nochmal ansehen. Das mit der Übergabe als Argument - da hast du recht, 
da spare ich mir dann jedes Mal das umkopieren. :)

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.