Hallo,
ich habe ein Problem mit einer LCD-Steuerung eines Hitachi-kompatiblen
LCDs. Im angehängten Code befinden sich in der lcd.c die init(), die
send_data() und die send_cmd() Funktion. Wenn ich folgendermaßen einen
String aufs Display bringen möchte funktioniert das wunderbar:
Hallo! schreiben möchte, dann erhalten ich nur schwarze Kästchen. Im
Detail ruft die funktion lcd_send() für die größe des Strings die
lcd_send_data-Funktion auf, die jeweils ein Byte, also ein Char sendet.
Hat einer vielleicht eine Erklärung, warum das so ist? Einen Ansatzpunkt
wo ich weitersuchen könnte nehme ich auch gern ;)
Danke GALDO
Was erwartet "lcd_send" denn für einen Parameter? Es wird ja vermutlich
ein Zeiger sein. Aber worauf (v.a. welchen Speicher) zeigt dieser
Zeiger? Je nach Einstellung werden konstante Strings (wie in der zweiten
Version) generell im Flash abgelegt. Wenn die Funktion aber einen
Pointer auf RAM haben möchte, dann knallts. Gibt es beim compilieren der
zweiten Version keine Warnung?
Schön, das Problem dürfte aber tatsächlich darin bestehen, dass "Hallo"
im Flash abgelegt wird, die Funktion die übergebene Adresse aber als
RAM-Adresse interpretiert und dementsprechend an der Stelle im RAM
nichts brauchbares findet, weil der String ja im Flash liegt... Du
müsstest entweder den String explizit im RAM anlegen (was Du ja in
Deiner ersten Version machst, was aber Speicherverschwendung ist) oder
die Funktion so umschreiben, dass sie den übergebenen Parameter "Zeiger
auf String" als "Zeiger auf String im Flash" interpretiert (und mit
pgm_read_byte aus der pgmspace.h auf die Elemente zugreift).
Johannes M. wrote:
> Schön, das Problem dürfte aber tatsächlich darin bestehen, dass "Hallo"> im Flash abgelegt wird
Bei welchem Compiler?
Beim gcc in der Standardeinstellung auf einem AVR wird das
mit Sicherheit nicht gemacht.
Karl heinz Buchegger wrote:
> Johannes M. wrote:>> Schön, das Problem dürfte aber tatsächlich darin bestehen, dass "Hallo">> im Flash abgelegt wird>> Bei welchem Compiler?> Beim gcc in der Standardeinstellung auf einem AVR wird das> mit Sicherheit nicht gemacht.
Deshalb schrieb ich ja weiter oben auch "je nach Einstellung".
Möglicherweise liegt der Hund tatsächlich woanders begraben, aber es
"riecht" eben genau danach, dass der String irgendwo liegt, wo ihn die
Funktion mit dem verwendeten Zeiger nicht findet, weil eben eine Adresse
von Speicher X als Adresse von Speicher Y interpretiert wird.
Johannes M. wrote:
> Karl heinz Buchegger wrote:>> Johannes M. wrote:>>> Schön, das Problem dürfte aber tatsächlich darin bestehen, dass "Hallo">>> im Flash abgelegt wird>>>> Bei welchem Compiler?>> Beim gcc in der Standardeinstellung auf einem AVR wird das>> mit Sicherheit nicht gemacht.> Deshalb schrieb ich ja weiter oben auch "je nach Einstellung".
Hmm. Hast du eine Idee, welche Option das sein könnte?
Ich hab jetzt mal in der WinAVR-gcc Doku geschmökert,
mir ist aber keine Option aufgefallen, die sowas bewirken
würde.
> Möglicherweise liegt der Hund tatsächlich woanders begraben, aber es> "riecht" eben genau danach, dass der String irgendwo liegt, wo ihn die> Funktion mit dem verwendeten Zeiger nicht findet, weil eben eine Adresse> von Speicher X als Adresse von Speicher Y interpretiert wird.
Geb ich die recht, es riecht tatsächlich danach. Kann
aber eigentlich nicht sein.
Karl heinz Buchegger wrote:
> Hmm. Hast du eine Idee, welche Option das sein könnte?> Ich hab jetzt mal in der WinAVR-gcc Doku geschmökert,> mir ist aber keine Option aufgefallen, die sowas bewirken> würde.
Mir jetzt auch nicht wirklich. Ich glaub ich stecke noch zu sehr in
anderen Compilern drin (CodeVision), die konstante Strings ohne zu
zögern ins Flash schreiben...
> Geb ich die recht, es riecht tatsächlich danach. Kann> aber eigentlich nicht sein.
Ist immer blöd, wenn es zwar die wahrscheinlichste Lösung ist, aber
andererseits auch wieder nicht sein kann... Dann müssen wir wohl weiter
suchen.
Es muss tatsächlich mit den "" zusammenhängen - ich gehe aber nicht
davon aus, dass Strings per Standard im Flash gespeichert werden (wär ja
per se Blödsinn)...
Ich hab also keine Idee :(
Wenn jemand noch nen Geistesblitz hat, bitte her damit. Ich verwenden
den AVR-GCC in der Version 4.2.0
schreibst, dann geht's auch, oder? Poste doch mal das Disassembly von
beiden Versionen, das sollte Klarheit schaffen.
Die Delays sind übrigens durchaus erforderlich, allerdings nicht in der
Länge. Siehe Datenblatt des Displays.