in den Programmspeicher geladen
Dabei ist Datenx relativ groß, und so definiert
1
#define Daten0 {2,3,4,1, usw...}
nun gibt es 12 solcher Dateien und ab der 7. wird dann nicht mehr
ausgelesen bzw. wieder vorn angefangen.
ich denke ja, dass der Pointer nicht weiterzählt, weil er zu klein ist.
benutze folgende Auslesezeile:
1
aTemp=pgm_read_byte(&Tab0[CounterBytes]);
dabei ist der CounterBytes 16Bit groß, die ersten 6 Dateien werden gut
ausgelesen.
Was kann man tun?
Ich stell den Beitrag mal unter uC ein.
ich verwende ein Board mit dem ATMega 1280.
(Mod.: der Beitrag passt in dieses Unterforum, Doppelpost unbegründet)
ja,
es ist ja auch so, dass mitten in der 7. Datei dann wieder die erste
ausgelesen wird.
Also so, als würde der Adressspeicher überlaufen. Ich weiß nur nicht ob
es beim Einspeichern, also bei Progmem oder beim Auslesen passiert.
Ich denke, der Adressspointer müsste größer sein.
Es sind sehr viele 8Byte Konstanten - Messreihen.
> Also so, als würde der Adressspeicher überlaufen.
Nicht ganz, die Adresse (bzw. das Ergebnis der Adressberechnung) läuft
über.
> Ich denke, der Adressspointer müsste größer sein.
Ja, und zwar sizeof(uint32_t), nicht sizeof(void*) wie aus der Signatur
von pgm_read_byte_far() (siehe Doppelpost) eindeutig hervorgeht ->
Adresse selber ausrechnen.
Alternativ wäre noch zu klären, ob der Compiler mit __flash richtig(tm)
rechnen würde.
g457 schrieb:> Alternativ wäre noch zu klären, ob der Compiler mit __flash richtig(tm)> rechnen würde.
Ja, tut er: Er rechnet genauso wie in der Dokumentation beschrieben :-)
Danke erst mal, also es ist der ATM1280. Der ist zu 97% voll mit den
über PROGMEM eingelesenen Daten, das hat also funktioniert.
Die Größe schätze ich jetzt mal, da es Bytes von Dateien sind, die ich
vorher mit Delphi in eine h Datei umgewandelt habe.
Hier der Code-Auszug:
1
uint8_tTab0[]PROGMEM=TabDaten0,
2
Tab1[]PROGMEM=TabDaten1,
3
...
4
Tab11[]PROGMEM=TabDaten11;
dann die TabDaten – sie sehen etwa so aus.
Header File
1
#define TabDaten0 {156,4,57,32,... 45,68\
2
23,34,113, ... 78,54 \
3
24,200}
jetzt die Größen
ein File ist etwa 7KB groß
alle 12 Files sind ca. 110KB groß
ausgelesen habe ich bisher mit
Also mit
pgm_read_byte_far(&TabDaten10[i])
Das habe ich probiert, geht aber nicht, folgende Warnung erscheint;
warning: cast from pointer to integer of different size
Jens schrieb:> aTemp = pgm_read_byte(&Tab0[CounterBytes]);
wusel wusel. Mein Tipp für wenig Geld gibt es professionelle Compiler
die diesen Mist nicht brauchen.
Falk Brunner schrieb:> Vielleicht so.
Nein. Das grundlegende Problem hier ist, dass ein Pointer halt nur
16-Bit hat. Der "direkte" Weg geht also in keinem Fall.
Wieso gibt es hierzu eigentlich 2 Threads?
Beitrag "pgm_read_byte_far"
> habe gerade hier gefunden, dass der AVR-GCC tatsächlich Zeiger nur bis> 16bit akzeptiert. Na prima.
Schön dass mein Hinweis und meine Lösung von gestern Abend 2335 doch
noch gelesen wurden. Hatte schon befürchtet, dass die durchgeflutscht
seien.
Und wie schon gesagt: selber berechnen, das ist nur wirklich kein
Beinbruch.
Nix für ungut
@ Johann L. (gjlayde) Benutzerseite
>Nimm __memx, dann sind Zeiger 24 Bit groß.
Kann man das auch mal als gescheites Beispiel darstellen, damit es auch
normale Leute ohne ultimatives Insiderwissen verstehen?