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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.