Hallo Leute, ich habe da eine großes Problem, dass der eine oder andere sicher schon gehabt hat. Meine Hard- und Software: -Xplain mit XMEGA128A1 -AVRStudio -JTAGICE II Ich habe nun eine Musterfunktion bestehend aus 1000 Werten. Nun möchte ich gerne, dass diese Musterfunktion bei jedem Start vom µC in den SDRAM an eine bestimmte Adresse geschrieben wird. Schreiben in den SDRAM kann ich schon. Mein Problem ist jedoch, dass ich wohl schlecht einen Vektor mit 1000 Werte in den Flashspeicher anlegen kann. Gibt es da eine Möglichkeit diese Werte doch zu verwenden? Gruß Joe
ist der SDRAM groß genug? wie groß sind die Werte? 8-Bit unsigned? Wenn dem so wäre, müsstest du die Daten doch an 1000 verschiedene Stellen schreiben.... du kannst doch nicht 1000Bytes an eine einzige Stelle von 1Byte Größe schreiben...
was ist ein "Vektor mit tausend Werte" ?? Willst du in den SRAM EEPROM oder PROGMEM schreiben?
Sorry, habe mich wohl unverständlich ausgedrückt... (ja das ist wohl mein größtes Problem! :( ) Also das ganze nochmal: Ich habe eine Musterfuntion vorliegen (nicht im µC), bestehend aus 1000 Werten -> vektor[1000] Mit meinem ADC messe ich nun eine Spannung auch mit 1000 Werten -> vektor_gemessen[1000] Nun möchte ich vektor mit vektor_gemessen vergleichen und zwar im µC! Problem liegt hier alleine bei der Musterfunktion. Wenn ich den µC ausschalte und wieder einschalte, muss dieser sich ja die Musterfunktion irgendwo herholen. Da diese aber immer gleich ist, möchte ich sie irgendwie im µC abspeichern. Meine Frage lautet also, wie lege ich eine so große Musterfunktion am besten an? Ich hatte die Idee beim Programmieren eine Datei anzulegen, welche die Musterfunktion enthält. Diese Datei hätte dann eine Funktion. Beim ausführen dieser Funktion würde ich die benötigte Musterfunktion in den SDRAM schreiben, so dass die Musterfunktion mir im eigentlichen Programm über das auslesen des SDRAMs zur Verfügung steht. Das hätte den Vorteil, dass mein eigentliches Programm trotzdem übersichtlich wäre und sich nicht ein ewig langer Vektor darin befinden würde. Wie schon gesagt, meine Problem ist halt, wie lege ich so etwas an? Vielleicht bin ich aber auch auf dem Holzweg und es gibt eine viel bessere Möglichkeit eine so große Musterfunktion anzulegen. Gruß Joe
Schreibe deine Vergleichswerte in das EEPROM deines µC - Dort hinterlegt können sie gelesen und bei Bedarf auch neu geschrieben werden. Nach Ausschalten der Spannungsversorgung bleibt der Inhalt des EEPROM erhalten. Genau für solche Anwendungen ist das EEPROM da, um Kalib. Werte - Vergleichswerte etc.. zu speichern. Dein XMega128 hat 2 Kbytes EEPROM, reicht also für deine Vergleichswerte aus.
hallo Joe die von Rene angegebene methode ist sicherlich die beste moeglichkeit. du koenntest natuerlich auch dein array als static im programm definieren. oder geht es dir darum, wie du die daten in den MC bringst ? vielleicht habe ich dich nicht richtig verstanden. schoene gruesse hans --
Die Idee mit dem EEPROM ist natürlich die beste, jedoch war der Vektor mit 1000 Werten nicht der einzige Vektor. Bei 2kB mit int8_t vektor[1000] kann ich genau 2 Vektoren anlegen. Ich benötige aber ca. 5 Vektoren. Damit erübrigt sich das mit dem EEPROM. @ Hans Mayer Die Vektoren habe ich im Moment in einer Textdatei vorliegen. Wenn ich sie als static definiere werden Sie im SRAM angelegt, dieser hat insgesamt 8kB was ja ausreichen würde. Das nehme würde ich aber als Notlösung nehmen, denn 5kB meines Speichers wären verbraucht, damit hätte ich weniger Speicher für andere Sachen (gemessene Vektoren usw.). Warum ich auf den SDRAM abziele, ist, weil dieser 8MB groß ist. Er ist also groß genug, um alle Werte zu speichern. Deswegen ist mein Ziel die Daten bei jedem Start vom µC die Daten sofort dort auf bestimmte Adressen abzulegen. Ich könnte sie dann auch jederzeit wieder abrufen, solange der µC nicht abgeschaltet wurde. Für die beste, mir einfallende Lösung, wäre wohl die Daten im Flash abzulegen und sie von dort in SDRAM zu schieben, den Platz im Flash dann anschließend freigeben. Ich kann natürlich auch falsch liegen, da ich kein Guru in diesen Dingen bin. Gruß Joe
Du kannst auch externen EEPROM nehmen. Schreib dir ein Programm welches diesen EEPROM in deiner Schaltung bei ersten mal mit deinen Vektoren beschreibt und dann spiele dein Hauptprogramm auf deinen µC und lese die Vektoren von dem externen EEPROM aus. Das spart zumindest schonmal das schreiben des SRAMS. Hier mal ein 64Kbytes EEPROM mit I2C für schlappe 0,30€. http://www.reichelt.de/?ACTION=3;ARTICLE=36948;PROVID=2402
>Hier mal ein 64Kbytes EEPROM mit I2C für schlappe 0,30€.
Vorsicht!
Ist ein 64kbit EEPROM (8k x8)
(Wird gerne verwechselt ;-))
Rene K. schrieb: > Hier mal ein 64Kbytes EEPROM mit I2C für schlappe 0,30€. Das sind aber nur 64 Kilobit. Reicht aber trotzdem für 1000 Werte. mfg.
Rene K. schrieb: > Schreibe deine Vergleichswerte in das EEPROM deines µC Aber muss man hier nicht immer erst alles puffern, wenn man es neu beschreiben will, da nur zellenweise beschrieben werden kann und nicht byte-weise?
hallo, warum legst du die daten nicht einfach im programmspeicher ab? da dürfte platz genug sein. wenn du in C programmierst, kannst du die textdateien mit den daten so formatieren und im projektordner ablegen, dass der compiler sie selbstständig im speicher unterbringt. guck mal hier: Beitrag "Datenpaket in Programmspeicher - C" da steht auch beispielcode. die wahren adressen, unter denen der compiler die daten im programmspeicher ablegt, brauchst man noch nicht mal selber zu kennen, es gibt einen befehl, mit dem du ganz bequem per "fortlaufender" nummer bzw. virtueller speicheradresse die daten auslesen kannst. ist wirklich ein kinderspiel!
Bastler schrieb: > Vorsicht! > Ist ein 64kbit EEPROM (8k x8) > (Wird gerne verwechselt ;-)) Oh ja stimmt natürlich. Dito schrieb: > Aber muss man hier nicht immer erst alles puffern, wenn man es neu > beschreiben will, da nur zellenweise beschrieben werden kann und nicht > byte-weise? Er beschreibt es ja nur einmalig, die Vektoren werden sich ja nicht ändern oder?!
PS: Zitat aus dem angegebenen Link, wie man die Textdatei mit den Daten bequem in ein C-Array umwandeln kann, welches der Compiler dann selbstständig verwaltet: "In ein C-Array umwandeln (z.B. mit einem Hexeditor wie http://mh-nexus.de/en/hxd/) und dann einfach mitcompilieren." Die C-Array-Datei wird einfach in den Projektordner eingefügt und wie im Link Beitrag "Datenpaket in Programmspeicher - C" angegeben im Header (glaube ich) eingetragen.
Rene K. schrieb: > ...die Vektoren werden sich ja nicht > ändern oder?! Richitg! Sind ja auch Mustervektoren. Jan_Haar schrieb: > hallo, > warum legst du die daten nicht einfach im programmspeicher ab? > da dürfte platz genug sein. wenn du in C programmierst, kannst du die > textdateien mit den daten so formatieren und im projektordner ablegen, > dass der compiler sie selbstständig im speicher unterbringt. > > guck mal hier: > Beitrag "Datenpaket in Programmspeicher - C" > > da steht auch beispielcode. > > die wahren adressen, unter denen der compiler die daten im > programmspeicher ablegt, brauchst man noch nicht mal selber zu kennen, > es gibt einen befehl, mit dem du ganz bequem per "fortlaufender" nummer > bzw. virtueller speicheradresse die daten auslesen kannst. ist wirklich > ein kinderspiel! Danke, das habe ich gesucht. Das ist fast genau was ich wollte, ich muss es nur noch etwas "umbauen". Gruß Joe
Joe F. schrieb: > Danke, das habe ich gesucht. Das ist fast genau was ich wollte, ich muss > es nur noch etwas "umbauen". Freut mich! Viel Erfolg!
hallo Joe, > Für die beste, mir einfallende Lösung, wäre wohl die Daten im Flash darum habe ich ja urspruenglich gemeint, dass du sie mit "static" definierst. static definierte variablen sind im flash und nicht im ram. in etwas so: static int muster[] = { 1, -7, 4511, 815, 0, ..... } > abzulegen und sie von dort in SDRAM zu schieben, den Platz im Flash dann > anschließend freigeben. ich dachte die daten sind fix ? warum verschieben ? du kannst ganz normal darauf zugreifen. x = muster[i] ; schoene gruesse hans --
Ich habe zwar von C Null Ahnung, meine aber, dass ich den Begriff "Progmem" in Verbindung mit Array im Flash schon mal gelesen habe. ...
Hallo Leute, erstmal Danke für die verschiedenen Ideen und Möglichkeiten! Ich habe es mir nun ganz einfach gemacht, und habe diese langen Vektoren im Programmspeicher unter einer Funktion abgespeichert. Wenn ich die Funktion aufrufe, schreibt sie mir die benötigten Vektoren in den SDRam. Sieht zwar jetzt nicht mehr so schön aus, jedoch habe nicht viel Zeit mich weiter darum zu kümmern. Ein Problem habe ich noch: Wenn ich die besagte Funktion aufrufe, Funktion sieht so aus:
1 | void write_on_SDRAM(void){ |
2 | int vektor[5] = {0,1,2,3,4} |
3 | |
4 | for(int i=0;i<5;i++){ |
5 | __far_memwrite(ADDR+i,vektor[i]); |
6 | }
|
7 | }
|
dann habe ich das Problem, dass Speiherplatz durch "int vektor[5]" belegt wird. Dieses sehe ich auch beim Kompelieren. Hier wird unter Data die Platzbelegung mit 50% angezeigt. Dabei ist Data der SRam-Speicher. Nun ist meine Frage, nachdem ich den Vektor zu SDRam übertragen habe, kann ich dann diesen Platz bei Data im SRam irgendwie wieder freigeben? Sonst macht ja das Schieben in den SDRam gar keinen Sinn! Gruß Joe
Joe F. schrieb: > belegt wird. Dieses sehe ich auch beim Kompelieren. Hier wird unter Data > die Platzbelegung mit 50% angezeigt. Dabei ist Data der SRam-Speicher. > Nun ist meine Frage, nachdem ich den Vektor zu SDRam übertragen habe, > kann ich dann diesen Platz bei Data im SRam irgendwie wieder freigeben? > Sonst macht ja das Schieben in den SDRam gar keinen Sinn! Ich frage mich, wie du in weiterer Folge deine gemessenen Werte mit Musterwerten vergleichen willst, die nicht mehr existieren, weil das Array als lokale Variable in der Funktion write_on_SDRAM schon längst wieder gelöscht wurde, wenn die Funktion verlassen wurde. > Dieses sehe ich auch beim Kompelieren. Hier wird unter Data > die Platzbelegung mit 50% angezeigt. Klingt logisch. Solange du den Mustervektor im SRAM Speicher hast, genauso wie deine echten Daten, brauchst du im SRAM Platz für 2 mal 1000 Werte. Da führt kein Weg drann vorbei. Ein Lagerhaus hat ja auch nicht mehr Platz nur weil man ständig mit dem Gabelstapler Waren von einer Ecke in die andere fährt. Voll ist voll. 1000 Stück 2-Byte Integer brauchen knapp 2KB am SRAM. Punkt Deine Vergleichsfunktion muss die gemessenen Werte im SRAM mit den Musterwerten im Flash vergleichen! Nur so kriegst du Speicher frei.
Karl heinz Buchegger schrieb: > Ich frage mich, wie du in weiterer Folge deine gemessenen Werte mit > Musterwerten vergleichen willst, die nicht mehr existieren, weil das > Array als lokale Variable in der Funktion write_on_SDRAM schon längst > wieder gelöscht wurde, wenn die Funktion verlassen wurde. Also meiner Ansicht nach benötige ich einen Vektor, also meinen Messvektor mit 1000 Werten, im SRam-Speicher. Den Mustervektor mit 512 Werten benötige ich ja nicht direkt, ich benötige nur die einzelnen Werte des Mustervektors. Durch die folgende Schleife vergleiche VektorWert für MusterWert und nicht Vektor mit Mustervektor.
1 | for (int i=0; i<488; i++){ |
2 | for (int j=0, j<512; j++){ |
3 | if(vektor[i+j] == __far_memread(ADDR+j)){ |
4 | zähler++; |
5 | }
|
6 | }
|
7 | }
|
Ich hoffe, ihr versteht mich jetzt. Ich benötige also nur die gemessenen Daten als Vektor. Die Musterdaten lese ich direkt aus dem Speicher. Klar, das braucht nun mehr Zeit, aber mir kommt es nicht auf die eine ms an. > Klingt logisch. Solange du den Mustervektor im SRAM Speicher hast, > genauso wie deine echten Daten, brauchst du im SRAM Platz für 2 mal 1000 > Werte. Wie du oben an der for-Schleife erkennst, benötige ich nur 1 mal 1000 Werte. Deswegen wollte ich die Musterfunktion im SRAM als Speicher freigeben. Gruß Joe
Joe F. schrieb: > Also meiner Ansicht nach benötige ich einen Vektor, also meinen > Messvektor mit 1000 Werten, im SRam-Speicher. Den Mustervektor mit 512 > Werten benötige ich ja nicht direkt, ich benötige nur die einzelnen > Werte des Mustervektors. Richtig > Durch die folgende Schleife vergleiche VektorWert für MusterWert und > nicht Vektor mit Mustervektor. >
1 | > for (int i=0; i<488; i++){ |
2 | > for (int j=0, j<512; j++){ |
3 | > if(vektor[i+j] == __far_memread(ADDR+j)){ |
4 | > zähler++; |
5 | > } |
6 | > } |
7 | > } |
8 | >
|
> Auch das ist soweit nachvollziehbar. > Ich hoffe, ihr versteht mich jetzt. Ich benötige also nur die gemessenen > Daten als Vektor. Die Musterdaten lese ich direkt aus dem Speicher. > Klar, das braucht nun mehr Zeit, aber mir kommt es nicht auf die eine ms > an. Alles ok. Nur was hat das alles mit dem hier Beitrag "Re: Datensatz in µController einlesen" zu tun?
Karl heinz Buchegger schrieb: > Nur was hat das alles mit dem hier > Beitrag "Re: Datensatz in µController einlesen" > zu tun? Das Problem ist, dass ich meine Funktion, die ich ja im Programm einmal aufrufen muss, den Vektor generiert und den Speicher im SRam für diesen Vektor nicht wieder freigibt, obwohl ich ihn nach dem Übertragen in den SDRAM im SRam nicht mehr benötige! Deswegen ist meine Frage, ob man den Speicher im SRam NACH der Übertragung vielleicht manuell freigeben kann/muss. Vielleicht sehe ich das irgendwie falsch, aber scheint für mich logisch zu sein. Gruß Joe
Joe F. schrieb: > Das Problem ist, dass ich meine Funktion, die ich ja im Programm einmal > aufrufen muss, den Vektor generiert und den Speicher im SRam für diesen > Vektor nicht wieder freigibt, obwohl ich ihn nach dem Übertragen in den > SDRAM im SRam nicht mehr benötige! ALso du hast mich jetzt verloren. Jetzt kenn ich mich gar nicht mehr aus. Der Systemaufbau ist doch wie folgt Flash Speicher SRAM +------------------------------+ +----------------+ | | | | | +------------------+ | | +------+ | | | Programm | | | | 1000 | | | | | | | | Werte| | | | | | | +------+ | | +------------------+ | | | | | +----------------+ | +-----------------------+ | | | Vergleichsmuster 1 | | | | 1000 Werte | | | +-----------------------+ | | | | +-----------------------+ | | | Vergleichsmuster 2 | | | | 1000 Werte | | | +-----------------------+ | | | | +-----------------------+ | | | Vergleichsmuster 3 | | | | 1000 Werte | | | +-----------------------+ | | | +------------------------------+ Das Array mit 1000 Werten im SRAM brauchst du, weil du dort die laufenden Messwerte eintragen musst. Das geht nicht anders. Aber die Vergleichsmuster sitzen doch schon im Flash, wenn du es richtig programmierst. Und zwar vom Einschalten des Controllers an. Genauso wie auch das Programm von Anfang an vorhanden ist. Wenn der µC startet, dann ist das alles in seinem Flash-Speicher schon vorhanden. Wo muss da jetzt irgendwas übertragen werden?
:) Rege dich nicht auf! Dein Schaubild ist richtig. So habe ich es auch. Wenn ich das nun kompeliere, steht bei mir unter Data 52% (ca. 4kB) voll. Wenn ich anschließend mit dem Debugger die Werte anschaue, dann lagert das Programm seine angelegte Vektoren auf den SRam (mit 8 kB) aus und ich weiß nicht warum! Das ist eben der springende Punkt, warum ich die Daten überhaupt in den SDRam schieben will. Schaubild nach dem Kompelieren mit -Os: Program: 15326 bytes (11.0% Full) (.text + .data + .bootloader) Data: 4304 bytes (52.5% Full) (.data + .bss + .noinit)
Hi Karl heinz Buchegger, ich hoffe, ich habe in der letzten Nachricht nichts falsch gesagt/geschrieben, da du nicht mehr geantwortet hast. Gruß Joe
Joe F. schrieb: > Hi Karl heinz Buchegger, > ich hoffe, ich habe in der letzten Nachricht nichts falsch > gesagt/geschrieben, da du nicht mehr geantwortet hast. Nein, natürlich nicht. Aber ich kann auch nicht hellsehen.
Karl heinz Buchegger schrieb: > Aber ich kann auch nicht hellsehen. Meinst du mit hellsehen, dass du letzte Nachricht nicht gesehen hast, oder dass nach dem Kompelieren die Daten in den SRam ausgelagert werde? Sorry, dass ich da nocheinmal nachhacke, aber mich würde echt interessieren, wie man die Auslagerung der Daten in den SRam verhindern kann. Falls jemand dafür eine Lösung hat, bitte mitteilen! Gruß Joe
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.