PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array zu groß für Datenerfassung



PCMan
21.11.2007, 10:53
Hallo Leute,
ich möchte ein paar Datenwerte aufnehmen (des Typs float) und diese in einem Array speichern. Da es sich um eine enorm große Datenmenge handelt, würde mich interessieren, was es denn noch für Wege gibt, die Daten zu speichern (evtl. im internen EEPROM?).
Ich habe mal rumgespielt:


float Abc[8192];

...führt zu einem Error:

error: size of array 'Abc' is too large



float Abc[8191];

...führt zu keinem Error.
Mein Bauchgefühl sagt mir, dass ich auf keinem Fall das Array der Größe 8191 benutzen sollte, weil mir nicht klar ist, ob das den Speicher überläuft und mein µC undefinierte Aktionen durchführt.

Wie würdet ihr erfahrenen Programmierer das anstellen?
Viele Grüße,
Simon

P.S.: ATMega32, avr-gcc (GCC) 4.1.2 (WinAVR 20070525), WinXP Pro, avr910.

PicNick
21.11.2007, 11:19
Logo, 8192 * 4 sind ja 32k. Da bilden sich bei einem Mega32 Beulen an der Oberfläche.
Also, entweder kann man die Zahlen irgendwie komprimieren,
oder es bleibt nur eine externer Speicher
oder ein größerer µC

PCMan
21.11.2007, 13:09
ah ok.
Gut, dann bleiben mir noch zwei Fragen:
* Ich hätte noch die Pins vom IIC frei. Gibt es (evtl im RN) irgendwo eine Anleitung/Tutorial wie ich einen externen Speicher an den IIC hänge? Welcher speicher wäre da eigentlich sinnvoll? Ich habe viele schreib und lesezugriffe.

* Ich nehme an, dass die maximale Größe die das Array in Bytes einnehmen darf nur so groß sein darf wie der Speicher (32k) MINUS dem, wass der Programm-Code einnimmt? Oder kann ich den Programmcode vernachlässigen, weil der woanders abgelegt ist (flash)? Wie könnte ich mir das errechnen, wie groß dass Array sein darf ohne dass mein µC abstürzt?

Hm, sind ja doch mehr als zwei Fragen! :)
Vielen Dank,
vG Simon

MeckPommER
21.11.2007, 13:54
Die Atmegas haben (anders als bei einem PC) unterschiedlichen Speicher für Variablen und das Programm. Das Programm ist fest im Flash, für variable Werte bleibt dir nur das SRAM und das EEPROM.

Bei vielen Datenzugriffen sollte man auf den Einsatz des EEPROMs verzichten, da diese Speicherzellen nur ca. 100.000 Mal beschreiben lassen und ferner arg langsam sind.

Wieviel Platz die jeweiligen Atmegas an SRAM und EEPROM haben, steht in den Datenblättern. der ATMEGA32 hat (wenn ich das richtig im Kopf habe) 2048 Bytes SRAM, das würde also für 512 floats reichen, wenn dein Programm keine weiteren Variablen nutzen würde.

Zu externem SRAM wurde hier im Forum schon viel geschrieben, ich empfehle die Suchfunktion.

Wenn du wirklich "enorm viele" Daten speichern möchtest, ist es vielleicht am sinnvollsten, diese Daten per µC auf eine Speicherkarte zu schreiben (eine SD-Card z.B.) und diese Daten dann an einem PC auszuwerten.

PicNick
21.11.2007, 13:56
Nun, Programmspeicher ist vom SRAM getrennt, die haben miteinander nix zu tun.
Der Programmspeicher hat 32k (deshalb ATmega32)
aaaaaber
er hat nur 2k = 2048 Bytes SRAM. und dort müßte dein Array rein (dann isses aber weg nach dem ausschalten)
oder 1k = 1024 Bytes EEProm, wenn das Array erhalten bleiben soll.

SRAM ist für dich daher sowieso nix, und der EEprom faßt nur 256 floats
Kurzum--> externer Speicher

Wenn du solche mega-Massen an Daten hast->
Es sollte möglich sein, MMC-Karten o.Ä mit dem µC zu verbinden, such mal in der Richtung

PCMan
21.11.2007, 14:03
Hallo PicNick,
das dachte ich mir, dass das schon in so eine Richtung hinausläuft ;)
Ich habe wie gesagt nur die I2C-Ports (SDA,SCL) frei + einen Interrupt Pin (INT0).
Wäre super wenn's da was gäbe...

PicNick
21.11.2007, 14:16
FÜr I2C gibt's eine Reihe von EEPROMS u. SRAMS
https://www.roboternetz.de/wissen/index.php/I2C_Chip-%C3%9Cbersicht
Am besten dann bei den Herstellern stöbern, bis du was findest.
Die I2C Programmierung ist dabei normalerweise nicht problematisch.

PCMan
21.11.2007, 14:46
Ne blöde Frage: was heißt bei der EEPROM beschreibung immer das "k bit" ?
Ist damit eine Übertragungsrate gemeint?

PCMan
21.11.2007, 15:10
Und noch was: der Übersicht nach gibt es ja nur SRAMs der maximalen Größe von 256 Bytes. Das wäre doch viel zu klein!? Gibt es keine größeren I²C Srams?

PicNick
21.11.2007, 16:01
k-Bit ist die Größe in Einheiten zu 1024
mit der I2C Rate hat das nix zu tun, das sind die üblichen 100- 400 kHZ

Du mußt ein bisschen rumsuchen, z.B.
www.alldatasheet.com

u. www.reichelt.de

(EE 24LC 32 P , < 1 € )

PCMan
21.11.2007, 19:28
Okay, ich denke ich bleibe dann beim eeprom. Die Geschwindigkeit spielt nämlich keine Rolle und wenn die Daten noch da sind nach Spannung-Weg, ist auch nicht verkehrt. Und wenn 100.000 mal beschreiben drin ist dann muss ich eben zusehen, dass durschnittlich jede Zelle gleich oft beschrieben wird. Im übrigem würde das heißen, dass 100.000 Messungen garantiert sind - das ist schon eine große Menge.
Dieses EEPROM was du da bei Reichelt gefunden hast, kannst du das empfehlen und hast du damit schon gearbietet? Es hat 32k, für wieviele float Arrays würde das langen? 32672/4=8168 Werte? Stimmt das?
Vielen Dank&Grüße,
Simon

Edit:
Ich hätte da noch eine Rechenfrage: wieso wird eigentlich der Faktor 4 bei Float-Variablen herangezogen?
Wie errechne ich, wieviel byte ein uint32_t[8168] Array benötigen würde? Wäre das der Faktor 3?
Vielen Dank

thewulf00
22.11.2007, 06:40
Float hat nunmal 4 Byte. Im Internet steht das: "4 byte Fließkomma-Typ mit 3 byte Mantisse und 1 byte Exponenten." D.h. dass die Floatzahl einen Wert von 0 - 16 Mio aufnehmen kann und das ganze mit einem (10er-)Exponenten versehen wird, der von -127 bis +128 geht.
Ein uint32 hat ebenfalls den Faktor 4, da die 32 für die Bitzahl steht, d.h. 4 Byte.

Hier hast Du eine Übersicht: https://www.roboternetz.de/wissen/index.php/C-Tutorial#int.2C_char.2C_short.2C_long_.28ganze_Zah len.29

PCMan
22.11.2007, 14:45
suuper, danke.
Alles klar :-)
vG Simon