Hallo, habe ein Problem bei der Umsetzung von prgspace.h: Ich möchte Initialwerte die sich nur selten ändern in den Flash-Speicher schreiben. Habe gelesen das in pgmspace.h Funktionen dafür definiert sind. Allerdings wird in der Beschreibung sowie im FAQ nur auf Strings Bezug genommen, deswegen würde mich mal interessieren ob sich das mit Char oder Integer Werten auch machen lässt? Strings sollten doch nichts anderes als Char Werte sein, nur mit \0 abgeschlossen? Aber wie muß ich das dann schreiben: PGM_P array[KOMPONENTE][IDENT] PROGMEM = {???} array[x][y] unsigned char table[3][6] = { { 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00 }, { 0x00, 0x21, 0x7f, 0x01, 0x00, 0x00 }, { 0x21, 0x43, 0x45, 0x49, 0x31, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}; Lesezugriff: ? char X_VAR; strcpy_P (X_VAR, table[1][1]); Schreibzugriff: ? strcpy_P (table[1][1], X_VAR); Gibt es einfachere Möglichkeiten? Der Unterschied zwischen den zwei Beispielen im FAQ wird mir auch nicht ganz klar. Danke Thomas
In der gcc-Portierung des Application-Codes fuer den AVR-Butterfly werden pgmspace-Funktionen in vielfaeltiger Form genutzt. Das kann mglw. als Beispiel dienen. siehe http://www.siwawi.arubi.uni-kl.de/avr_projects/ (Ich stelle den Server z.Zt. (5.11.03) auf neue Hardware um, es kann daher zeitweilig zu Ausfaellen kommen, bei Problemen einfach etwas spaeter nochmal versuchen.) Das Thema kommt auch immer wieder im avrfreaks gcc-Forum und in der avr-gcc mailing-list auf, in den Archiven sollte sich also auch einiges dazu finden lassen. Martin
Mein Programm läuft jetzt soweit, bin mir nur nicht sicher ob ich es richtig umgesetzt hab. Hab es mal drangehängt, vielleicht kann mal jemand einen Blick drauf werfen. ich benutze nie PGM_P??? Hab den Unterschied der beiden Beispiele im FAQ nicht wirklich verstanden. Wie kann ich sehen ob mein Array wirklich im Flash-Speicher steht? Ist es möglich (mit memcpy_P) das Array zusätzlich noch in den RAM zu kopieren um Werte im Array zu ändern? Danke Thomas #include <avr/io.h> #include <avr/pgmspace.h> #define ANZAHL_KOMPONENTEN 3 #define ANZAHL_IDENTIFIER 7 const unsigned char init_werte[ANZAHL_KOMPONENTEN][ANZAHL_IDENTIFIER] PROGMEM = { { 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00 }, //Komponente 0 { 0x00, 0x21, 0x7f, 0x01, 0x00, 0x00 }, //Komponente 1 { 0x21, 0x43, 0x45, 0x49, 0x31, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; int main(void) { while(1) { init_wert = pgm_read_byte(&init_werte[byte1_werte.Slave_Adresse][byte1_werte.Ident]) ; } return 0; }
Erstmal prima, das es nun laeuft. >ich benutze nie PGM_P??? Indirekt schon. Ist auch nicht wichtig, funktioniert ja so. > Wie kann ich sehen ob mein Array wirklich im Flash-Speicher steht? Wenn der Wert von init_wert wir erwartet ist, dann kommen die Daten wohl aus dem Flash-Array. Im Zweifel die Ausgabedateien des Compilers durchschauen, dort werden Konstanten im Flash als solche markiert. >Ist es möglich (mit memcpy_P) das Array zusätzlich >noch in den RAM zu kopieren um Werte im Array >zu ändern? Sollte funktionieren. Zugriff aufs Array im RAM dann ohne pgm_* "Klimmzuege". Martin
Moin, hab da zwei Compiler-Warnungen aus denen ich nicht schlau werde. Jemand einen Tip?? main.c:57: warning: excess elements in array initializer main.c:57: warning: (near initialization for `init_werte') const unsigned char init_werte[ANZAHL_KOMPONENTEN][ANZAHL_IDENTIFIER] PROGMEM = { { 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00 }, //Komponente 0 { 0x00, 0x21, 0x7f, 0x01, 0x00, 0x00 }, //Komponente 1 { 0x21, 0x43, 0x45, 0x49, 0x31, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } // << main.c:57 }; Danke und Ciao, Thomas
Ist doch ziemlich einfach: Du hast einen Initializer mehr als Feldelemente, d. h. Dein ANZAHL_KOMPONENTEN ist zu klein.
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.