Wie die Speicherauslastung für Variablen erkennen?

Hallo Leute,

ich habe ein kleines Problem.
In einem Atmega328 benutze ich relativ viele Variablen.
Unter anderem auch Arrays wie dieses:
uint8_t Adressen[8][120];

Jetzt ist mir aufgefallen, dass der µC "lustige" Dinge macht, wenn das Array zu groß ist.
Ich denke, dass irgendwo unzulässig Speicherbereiche überschrieben werden.
Dass die Arrays korrekt indiziert werden habe ich mehrmals kontrolliert.

Kann man irgendwie kontrollieren, ob man zuviele Variablen deklariert hat?

Grüße,

Tom

Der ATmega328 hat 2kByte Ram
Wieviel Ram Du für Variablen verbrauchst kannst Du anhand der verwendeten Byte errechen
Ein uint8_t Adressen[8][120]; brauct 960 Byte
Es gibt auch die Möglickeit den freien Speicherplatz zu ermitteln:
http://www.arduino.cc/playground/Code/AvailableMemory

Aber, da Du sagst daß der Arduino ungewollte und unerklärbare Symptome zeigt ist Deine Annahme richtig, daß Du zuviel RAM brauchst.

Lösungen und Infos:

Grüße Uwe

Hallo Uwe,

wow! Das ist mal ne super Antwort!
Vielen Dank für den Lesestoff. Nun ist mir einiges klarer geworden.

Dieses Array ändert sich während der Laufzeit nicht.
Von daher könnte ich es auch beim Init ins Eeprom schreiben.
Zur Laufzeit lese ich dann einfach die jeweils benötigten 8 Byte aus.
Da schlafe ich jetzt erstmal noch drüber.

Vielen Dank und Grüße,

Tom

Das EEPROM und der Flash Speicher sind nicht das gleiche. EEPROM hast Du noch weniger als SRAM. Flash kannst Du allerdings nicht zur Laufzeit füllen. Man kann die Inhalte für den Flash Speicher aber sehr wohl zur Compilezeit berechnen und auch einfüllen. Ein Beispiel wie man sowas auf die Spitze treibt findest Du hier:

Hei,

ich lese die Adressen von 80-100 DS18B20 Temperatursensoren aus (je 8 Byte),
damit ich anschließend die Temperaturen per Adresse auslesen kann und nicht nach Index,
was extrem langsam wird, wenn man soviele Sensoren am Bus hat.

Die speichere ich nun beim Init im Eeprom, was hervorragend funktioniert. (maximal halt 125 Sensoren)
Da die Adressen ja nun gespeichert bleiben, bräuchte ich die nicht nochmal auslesen.
Das würde den Start extrem beschleunigen. Man kann ja dann per dig. Eingang das Abspeichern unterbinden bzw. auslösen...

Vielen Dank für die ganzen Anregungen!

Wenn jemand näheres Interesse an dem Projekt hat,
hier hab ich ne kleine Beschreibung dazu:

Grüße,

Tom

Fast wie digitale Flüssigkristallfolientermomenter.
Schönes Projekt.
Falls dann die 1kByte EEPROM für die Sensoradressen zuwenig werden: über dem I2C Bus kannst Du noch EEPROMs anschließen.

Grüße Uwe

Hei,

naja, 120 Sensoren sollten eigentlich genügen. Ein Schichtspeicher für den Hausgebrauch ist ja nicht so hoch.
Momentan habe ich 90 Sensoren am Bus und der µC braucht für eine komplette Temperaturwandlung 3,3 Sekunden.

Wenn endlich mal der bestellte Schrumpfschlauch da ist, werde ich die Sensorkette mal in einen See halten.
Da gibts bestimmt auch interessante Temperaturprofile.
Wem fällt noch eine interessante Anwendung ein?

Grüße,

Tom

PS: Da das Topic ja erledigt ist, dürfen wir ruhig off topic werden, oder ist ein neuer Thread mit "Projektvorstellung" sinnvoll?

Ein wirklich interessantes Projekt.

Hi, ich arbeite gerade an was ähnlichem wie Du mit den ganzen Sensoren.

Könntest Du mir eventuell zwei Fragen beantworten?

In welcher Form speicherst Du die DeviceAdressen der Sensoren im EEPROM?

Ich habe es mit verschiedenen Formaten versucht.

0x10,0x25,0x48,0xC0,0x01,0x08,0x00,0x95 
10,25,48,C0,01,08,00,95

Wie weißt Du diesen Wert anschließend der Variablen Adressen zu?
Ich habe es so versucht was aber nicht funktioniert.

eeprom_read_string(840, buffer, BUFSIZE); //Sensor1
  sscanf(buffer,"%2x,%2x,%2x,%2x,%2x,%2x,%2x,%2x",&Adressen[0],&Adressen[1],&Adressen[2],&Adressen[3],&Adressen[4],&Adressen[5],&Adressen[6],&Adressen[7]);

Es wäre echt super wenn Du mir da weiterhelfen könntest.

Vielen Dank

Ich würde an Deiner Stelle einfach eine Prüfsumme (CRC32 oder was ähnliches) mit abspeichern. Wenn die Prüfsumme passt, dann alles OK, ansonsten neu initialisieren. Wenn "alles OK", dann einfach schauen ob die Sensoren wie gewünscht antworten, wenn nein neu initialisieren. Da die Prüfsumme dann neu berechnet wird sollte nach dem ersten Start und nach Sensorwechsel alles viel schneller initialisiert sein.

Was das Lesen/Schreiben von EEProms angeht finde ich das hier sehr gut: Arduino Playground - EEPROMWriteAnything