WinAVR kann ja aufgrund der nur 2Byte großen Pointer nur bis zu 64K an ROM-Daten (also im Flash) addressieren. Daher packt er diese Daten ja auch an den Anfang. Jetzt habe ich aber viele große Datenbereiche, die insg. über 64K groß sind. Wie komme ich jetzt da ran? Normal arbeite ich mit: Datenbereich: const unsigned int Datenbereich1[12000] PROGMEM = { ................} const unsigned int Datenbereich2[9876] PROGMEM = { ................} .... const prog_uint16_t *Datenblock; und greife dann mit "pgm_read_byte" darauf zu. Aber alles ab einem Addressbereich >64K fängt wieder bei 0 an (d.h. an die Daten hinter 64K komme ich so nicht ran). Was kann ich da nun machen? Gibt es einen Trick, um an verschiedene Datenbereiche ranzukommen, die dann teilweise auch hinter der 64K Grenze liegen (aber immer woanders, ich weiß ja vor der Kompilierung nicht unbedingt, was alles eingebunden wird). Danke
Für alles was über 64 K geht, musst Du die "*_far"-Funktionen zum lesen nehmen, also z.B. "pgm_read_byte_far" anstelle von "pgm_read_byte". Die arbeiten mit 32-Bit-Adressen. Schau einfach mal in die libc-Doku. Da müsste alles drin stehen.
Der kritische Teil sind nur die diversen _P-Funktionen, die kann man dann gar nicht mehr benutzen.
Aus Datenblatt ATmega128 <cut> The RAMPZ Register is normally used to select which 64K RAM Page is accessed by the Z-pointer. As the ATmega128 does not support more than 64K of SRAM memory, this register is used only to select which page in the program memory is accessed when the ELPM/SPM instruction is used. The different settings of the RAMPZ0 bit have the following effects: RAMPZ0 = 0: Program memory address $0000 - $7FFF (lower 64K bytes) is accessed by ELPM/SPM RAMPZ0 = 1: Program memory address $8000 - $FFFF (higher 64K bytes) is accessed by ELPM/SPM </cut> Also etwas mit RAMPZ(0) und ELPM spielen?!
@Werner: Es geht hier um C-Programmierung! Und in der AVR-libc gibts entsprechende Funktionen, wie oben bereits erwähnt. Es ist nicht wirklich sinnvoll, jemandem, der in der libc-Doku noch nicht einmal "pgm_read_byte_far" findet, nichts von Assembler-Befehlen und der Manipulation von Zeigern erzählen, auf die er als C-Programmierer (anscheinend) ohne Assembler-Kenntnisse eh keinen direkten Zugriff hat...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.