Forum: Compiler & IDEs Flash schreiben und lesen


von Benno Müller (Gast)


Lesenswert?

Hallo mal wieder ;)

ich brauch ne Möglichkeit ein ziemlich großes Struct-Array auszulagern, 
da ich mit dem relativ kleinen RAM von 1kB im ATmega8 nicht weit komme 
(Kann 20 GPS-Koordinaten mit Datum, Zeit und Geschwindigkeit speichern, 
wenn ich jede Minute abfrage).

Da der Mega8 einen großen Flash-Speicher hat (8kB), würde ich diesen 
gerne nutzen. Jedoch habe ich bedenken, weil meines Wissens in diesem 
auch der Programmcode gespeichert wird. Zudem weiß ich nicht wie ich 
mein Struct-Array im Flash-Speicher speichere. Über die Suchfunktion 
hier bin ich auf folgende Funktionen gestoßen: 
http://www.mikrocontroller.net/forum/read-2-9890.html#10014. Jedoch wäre 
es nett wenn jmd. mal ein kleines Programmbeispiel posten würde.

von Peter (Gast)


Lesenswert?

z.B. so:

prog_char alpha[39][5] = {{b00000010,   // A
                                                                 b00000101,
                                                                 b00000111,
                                                                 b00000101,
                                                                 b00000101},
                                                                {b00000011,// 
B
                                                                 b00000101,
                                                                 b00000011,
                                                                 b00000101,
                                                                 b00000011},

.......

zeile[k].kfeld[1] = PRG_RDB(&alpha[l][k]);      // Charakter von Tabelle 
in Anzeigespeicher kopieren

...

Geht mit Strukturen entsprechend genauso.

Gruss,

Peter

von Peter (Gast)


Lesenswert?

ach ja, bevor ich es vergesse, diese Binärformate habe ich mir in einer 
Header-Datei definiert (wurde hier im Forum mal beschrieben). Die gibt 
es so nicht von Natur aus im avrgcc ;-)

Gruss,

Peter

von Benno Müller (Gast)


Lesenswert?

Hallo Peter,

erstmal vielen Dank für dein Beispiel. Jedoch kann ich damit wenig 
anfangen, denn ich weiß nicht was du da machst. Zunächst hast du ein 
Zweidimensionales Array deklariert und definiert mit Binärwerten. Haben 
die 39 und die 5 etwas zu bedeuten? Was für Binärwerte schreibst du in 
das Array? Was ist prog_char für ein Datentyp?

Mit PRG_RDB(&alpha[l][k]); scheinst du auf den Flash-Speicher über eine 
Adresse zugreifen zu können. Hast du vorher nur die Adresse definiert wo 
du deine Werte hernimmst?

Über welche Funktion/Makro kann ich Werte in den Flash schreiben?

Viele Fragen, aber ich hoffe du kannst sie mir beantworten.

Achja eine fällt mir noch ein ;) Ist der programm memory mit dem flash 
gleichzusetzen, oder nicht?

von Benno Müller (Gast)


Lesenswert?

Nochwas ;)

Im Flash befindet sich meines Wissens auch der Programmcode. Laufe ich 
nicht Gefahr diesen zu überschreiben? Wenn ja wie verhindere ich das?

von Benno Müller (Gast)


Lesenswert?

Vielleicht sollte ich noch ein Konkretes Beispiel posten:

typedef struct GPS_DATA_Message
{
  long POS_UTC;
  long DATE;
  long LAT;
  long LON;
  long SPEED;
} GPS_DATA_MESSAGE;

GPS_DATA_MESSAGE GPS_DATA_Message[NUMBER_MESSAGES];

So sieht mein Struct-Array bisher aus. Wenn ich das bisher richtig 
verstanden habe (und irgendwie glaube ich das nicht ;)), müsste das 
Struct-Array wenn ich dieses in dem Progmem schreiben will so aussehen:

typedef struct GPS_DATA_Message
{
  prog_long POS_UTC;
  prog_long DATE;
  prog_long LAT;
  prog_long LON;
  prog_long SPEED;
} GPS_DATA_MESSAGE;

GPS_DATA_MESSAGE GPS_DATA_Message[NUMBER_MESSAGES];

Richtig?!?!

von Peter (Gast)


Lesenswert?

> erstmal vielen Dank für dein Beispiel. Jedoch kann ich damit wenig anfangen, 
denn ich weiß nicht was du da machst.

Sehrwahrscheinlich weil du es komplizierter siehst als es ist.

> Zunächst hast du ein Zweidimensionales Array deklariert und definiert mit 
Binärwerten.

Ja, waren halt ein paar Zeilen aus einem meiner Programme, die ich als 
Beispiel herauskopiert hatte.

> Haben die 39 und die 5 etwas zu bedeuten?

Nein (s.o.)

> Was für Binärwerte schreibst du in das Array?

Das sind konstante Werte, die das Programm zur Laufzeit benötigt.

> Was ist prog_char für ein Datentyp?
Das ist ein char Datentyp, der als Konstante im Flash landet. Es gibt 
äquivalent noch prog_int, prog_long usw.

> Mit PRG_RDB(&alpha[l][k]); scheinst du auf den Flash-Speicher über eine Adresse 
zugreifen zu können.

So ist es.

> Hast du vorher nur die Adresse definiert wo du deine Werte hernimmst?

Nein, dies geschieht ja durch den Namen des Arrays, also in diesem Falle 
alpha.

>Über welche Funktion/Makro kann ich Werte in den Flash schreiben?

Also ich glaube, jetzt kommen wir an eine Stelle wo die 
Missverständnisse anfangen. Bei den Standard-AVRs kann man nur zur Zeit 
der Programmierung in den Flash schreiben. Ich bin mir nun nicht sicher 
aber ich meine mal etwas gelesen zu haben, dass die neuen Mega-Typen 
auch zur Laufzeit selbst per Programm in den Flash schreiben können aber 
ob das tatsächlich so ist und wie das geht und ob das überhaupt von 
irgendwelchen Compilern unterstützt wird, da bin ich überfragt weil ich 
für solche Geschichten bislang immer das EEPROM verwendet habe.
Jedenfalls die hier gezeigte Sache dient nur der Abspeicherung von 
konstanten Werten, die nicht zur Laufzeit verändert werden können. 
Wenn du eine persistente Datenspeicherung möchtest, die vom Programm 
selbst angelegt und zur Laufzeit verändert werden soll, dann solltest du 
eventuell nicht den Flash sondern das EEPROM nehmen.

> Im Flash befindet sich meines Wissens auch der Programmcode. Laufe ich nicht 
Gefahr diesen zu überschreiben? Wenn ja wie verhindere ich das?

Da wird nichts überschrieben, die Konstanten werden zum Zeitpunkt der 
Programmierung mit in den Flash übertragen.

> So sieht mein Struct-Array bisher aus. Wenn ich das bisher richtig verstanden 
habe (und irgendwie glaube ich das nicht ;)), müsste das Struct-Array wenn ich 
dieses in dem Progmem schreiben will so aussehen:

typedef struct GPS_DATA_Message
{
  prog_long POS_UTC;
  prog_long DATE;
  prog_long LAT;
  prog_long LON;
  prog_long SPEED;
} GPS_DATA_MESSAGE;

GPS_DATA_MESSAGE GPS_DATA_Message[NUMBER_MESSAGES];

> Richtig?!?!

Naja, ich würde es so schreiben:

struct GPS_DATA_Message
{
  prog_long POS_UTC;
  prog_long DATE;
  prog_long LAT;
  prog_long LON;
  prog_long SPEED;
};

GPS_DATA_Message GPS_DATA_Message[NUMBER_MESSAGES];

das müsste eigentlich so funktionieren.

Gruss,

Peter

von Benno Müller (Gast)


Lesenswert?

> Bei den Standard-AVRs kann man nur zur Zeit der
> Programmierung in den Flash schreiben.

Kann vielleicht jemand ne Aussage für die AT mega's treffen, bzw. im 
speziellen für den ATmega8? Mein Kollege behauptet steif und fest man 
könnte diesen während der Laufzeit beschreiben, da "In System 
Programable"

PS: Danke Peter für die ausführliche Antwort.

von mikki merten (Gast)


Lesenswert?

@Benno
Bei den neueren MEGA-Typen MEGA8,128,16,32 soll der SPM (Store Program 
Memory) endlich richtig funktionieren. Dieser ist zwar auch schon bei 
den alten MEGA-Typen implementiert, war dort aber mit Vorsicht zu 
benutzen. Auch heute ist die Nutzung nicht ganz unproblematisch, man 
muss schon einen intensiven Blick ins Datenblatt werfen. Die Funktion 
hat übrigens nur entfernt etwas mit dem Begriff ISP zu tun. Alle Atmel 
AT90S ATMega und fast alle TINY lassen sich In System programmieren.

von Sascha Weitkunat (Gast)


Lesenswert?

Liegt wohl eher am Self-Programing Feature der MEGA-Reihe... Mir währe 
aber so, als könne dies der MEGA103 auch?!

von mikki merten (Gast)


Lesenswert?

Stimmt. Allerdings ist der MEGA103 noch alte Maskentechnologie wie 
MEGA161, MEGA163 und MEGA323.
Hier hat Atmel dann in einigen Datenblatt Errata mitgeteilt, daß dieser 
Befehl zeitweise nicht wie gewünscht funktioniert.

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
Noch kein Account? Hier anmelden.