PROGMEM -- liest ab bestimmten Array nicht mehr aus

Gast #3196178
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
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 #3196390
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)
Gast #3196466
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
> 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
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 #3196668
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
Gast #3196685
> 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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.