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.
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
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
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?
Nochwas ;)
Im Flash befindet sich meines Wissens auch der Programmcode. Laufe ich
nicht Gefahr diesen zu überschreiben? Wenn ja wie verhindere ich das?
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?!?!
> 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
> 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.
@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.
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.