PROGMEM -- liest ab bestimmten Array nicht mehr aus

Gast #3196178
Lesenswert?

Habe mehrere Dateien mit mit
1
uint8_t    Tab0[]   PROGMEM = Daten0,
2
 Tab1[]   PROGMEM = Daten1,
3
bis ...
4
Tab12[]   PROGMEM = Daten12;

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?
#3196212
Lesenswert?

Hallo,

wie gross ist das Array den? Welcher Controller wird verwendet?
1
#define  pgm_read_byte_far(address_long)   __ELPM((uint32_t)(address_long)) 
2
#define  pgm_read_word_far(address_long)   __ELPM_word((uint32_t)(address_long)) 
3
#define  pgm_read_dword_far(address_long)   __ELPM_dword((uint32_t)(address_long)) 
4
#define  pgm_read_float_far(address_long)   __ELPM_float((uint32_t)(address_long))

http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

Gruß
Gast #3196466
Lesenswert?

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.
Gast #3196481
Lesenswert?

> 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.
Gast #3196661
Lesenswert?

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_t  Tab0[]   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
1
 x = pgm_read_byte(&TabDaten0[i]);
was bis zur 7. Tabelle wunderbar geht.
Gast #3196685
Lesenswert?

> 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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren