Die ganzen Ansteuerroutinen fürs LCD funktionieren problemlos, zB
Ausgabe von strings im RAM, aber mit Flash und Pointern habe ich
irgendwie Probleme :( Weiß vielleicht jemand, wo sich bei mir der Fehler
versteckt hat?
Oh, Entschuldigung, habe vergessen zu erwähnen:
mein LCD hat 8 horizontale "pages", die in 128 vertikale Segmente
aufgeteilt sind, also nehme ich 8 unsigned char-arrays mit jeweils 128
bytes und verbinde die in einem pointer array mit 8 pointern.
LCD wird pageweise beschrieben:
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7 usw...
miro schrieb:> aufgeteilt sind, also nehme ich 8 unsigned char-arrays mit jeweils 128> bytes
????
Jedes deiner Arrays hat aber keine 128 Bytes, sondern nur 16 (17).
>und verbinde die in einem pointer array mit 8 pointern.
das hab ich schon verstanden. Das ist auch in Ordnung so, wie du das
gemacht hast. Nur eben dass du versuchst Daten durch die Gegend zu
kopieren, die nicht existieren.
Kann es sein, dass du denkst, dass memcpy_P in einem Array aufhört zu
kopieren, wenn es auf ein \0 stößt? Dem ist nicht so.
memcpy_P( ziel, quelle, wieviele_Bytes );
Die Anzahl Bytes wird umkopiert. Egal welcher Byteinhalt.
Es gibt in C 2 Funktionsfamilien, die ähnlich sind. Die str...
Funktionen und die mem... Funktionen. Die str... Funktionen sind für
Strings, also Abfolgen von Zeichen, die mit einem \0 beendet werden. Die
str... Funktionen wissen das und richten sich danach. Den mem....
Funktionen hingegen ist es völlig egal, was die Bytes bedeuten. Beim
Aufruf wird die Anzahl der Bytes angegeben und genau auf dieser Anzahl
Bytes arbeiten sie. Ungeachtet des Inhalts oder irgendwelcher Bedeutung
der Bytes.
Dein memcpy_P kopiert 128 Bytes. Und wenn deine Arrays zu Ende sind,
dann holt sich memcpy_P eben die nächsten Bytes aus dem Flash, was auch
immer gerade dort steht. Solange bis es 128 Bytes umkopiert hat.
Jetzt erklärt sich plötzlich das ansonsten unverständliche \0 in den
Arrays und auch die Verwendung des Terminus "String" in deiner
Überschrift.
Problem gelöst,
ich habe übersehen, dass die Bytes zuerst in die entsprechenden Fonts
konvertiert werden und so natürlich nicht direkt kopiert werden können,
Entschluldigung für diesen verwirrdenden Beitrag!
MfG miro
Karl Heinz Buchegger schrieb:> prog_void
Das kann man sich vorsorglich schon mal abgewöhnen; wird in zukünftigen
avr-lic-Versionen wahrscheinlich deprecated. Einfach deshalb, weil
avr-gcc das nicht unterstützt.
Falk Brunner schrieb:> @Johann L. (gjlayde) Benutzerseite>>>> prog_void>>>Das kann man sich vorsorglich schon mal abgewöhnen;>> Das ist der offizielle Weg für sowas?
Ich versteh die Frage nicht.
Natürlich bin ich nicht Sprecher der avr-libc o.ä.,
und Release-Notes für 1.8.0 finde ich auch keine.
Jedoch ist progmem in einem typedef in avr-gcc nicht
dokumentiert, war es wohl auch nie und funktioniert
mehr oder weniger per Zufall — ungefähr so wie
nicht-dokumentierte Opcodes in einem Prozessorkern.
Der entsprechende Bugreport wurde als WON'T FIX geschlossen.
Erstens gibt es quasi keine avr-gcc Entwickler und die Resourcen
sind sinnvoller in wirklichen Bugs, Optimierungen oder neuen
Features wie Built-Ins investiert anstatt ein was zu implementieren,
das undokumentiert ist, lediglich qua glücklichem Umstand (noch)
funktioniert und keine neue Funktionalität bringt.
progmem in einer Deklaration ist dokumentiert und wird natürlich
auch weiterhin unterstützt.
WON'T FIX bedeutet in dem Falle auch, daß der Compiler keine
Diagnostic ausgibt bei der Verwendung von progmem in typedef.
Zweitens gibt es keinen Grund für progmem in einem Typen.
progmem sagt was über die Ablage, nicht über das Typelayout wie
z.b. packed.