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.
Liegt wohl eher am Self-Programing Feature der MEGA-Reihe... Mir währe aber so, als könne dies der MEGA103 auch?!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.