Forum: Mikrocontroller und Digitale Elektronik Datensatz in µController einlesen


von Joe F. (joe1234)


Lesenswert?

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

von neuling (Gast)


Lesenswert?

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...

von neuling (Gast)


Lesenswert?

was ist ein "Vektor mit tausend Werte" ??

Willst du in den SRAM EEPROM oder PROGMEM schreiben?

von Joe F. (joe1234)


Lesenswert?

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

von Rene K. (draconix)


Lesenswert?

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.

von Hans M. (Firma: mayer) (oe1smc) Benutzerseite


Lesenswert?

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

--

von Joe F. (joe1234)


Lesenswert?

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

von Rene K. (draconix)


Lesenswert?

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

von Bastler (Gast)


Lesenswert?

>Hier mal ein 64Kbytes EEPROM mit I2C für schlappe 0,30€.

Vorsicht!
Ist ein 64kbit EEPROM (8k x8)
(Wird gerne verwechselt ;-))

von Thomas E. (thomase)


Lesenswert?

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.

von Dito (Gast)


Lesenswert?

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?

von Jan_Haar (Gast)


Lesenswert?

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!

von Rene K. (draconix)


Lesenswert?

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?!

von Jan_Haar (Gast)


Lesenswert?

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.

von Joe F. (joe1234)


Lesenswert?

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

von Jan_Haar (Gast)


Lesenswert?

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!

von Hans M. (Firma: mayer) (oe1smc) Benutzerseite


Lesenswert?

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

--

von sebastians (Gast)


Lesenswert?

> static definierte variablen sind im flash
stimmt nicht.

von Hannes L. (hannes)


Lesenswert?

Ich habe zwar von C Null Ahnung, meine aber, dass ich den Begriff 
"Progmem" in Verbindung mit Array im Flash schon mal gelesen habe.

...

von Joe F. (joe1234)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Joe F. (joe1234)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Joe F. (joe1234)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Joe F. (joe1234)


Lesenswert?

:)

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)

von Joe F. (joe1234)


Lesenswert?

Hi Karl heinz Buchegger,
ich hoffe, ich habe in der letzten Nachricht nichts falsch 
gesagt/geschrieben, da du nicht mehr geantwortet hast.

Gruß Joe

von Karl H. (kbuchegg)


Lesenswert?

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.

von Joe F. (joe1234)


Lesenswert?

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