www.mikrocontroller.net

Forum: Compiler & IDEs prgspace.h umsetzen


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
}

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist doch ziemlich einfach: Du hast einen Initializer mehr als
Feldelemente, d. h. Dein ANZAHL_KOMPONENTEN ist zu klein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.