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
>Hat da jemand einen Hinweis für mich?
Dein RAM ist alle.
Vielen Dank, das ging ja mal schnell. Da das Projekt noch nicht vollständig ist, heist es einen größeren µC zu nehmen.
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.
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? ;-)
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...
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.