Forum: Mikrocontroller und Digitale Elektronik externer serieller EEPROM/C


von crazy horse (Gast)


Lesenswert?

wie könnte man den Speicherbereich (konkret 24C04) unter C zugänglich
machen? Lesen und Schreiben ist ja an sich kein Problem. Ich hätte aber
gern Variablen (verschiedene Typen, zur Not würde ich sie aber auch für
alle unsigned long benutzen) dort abgelegt und unter ihrem Namen
angesprochen (Lesen und Schreiben).

Irgendwelche Ideen?

von Rufus T. Firefly (Gast)


Lesenswert?

Das wird so ohne weiteres nicht gehen. Dazu müsste der C-Compiler dazu
gebracht werden, beim Zugriff auf Variablen im EEPROM völlig anderen
Code zu produzieren als beim Zugriff auf Variablen im RAM.

Ohne daß Du einen Compiler dafür selber (um)baust, wird das Ziel nicht
zu erreichen sein.

von OldBug (Gast)


Lesenswert?

Das geht möglicherweise mit einer Struktur, ich habe nur leider gerade
nicht die nötige Zeit, mir da etwas auszudenken.

In etwa so:

typedef struct
memEEPROM_s
{
    int val;
    char c;
    /* ... */
} memEEPROM_t;

Das kostet allerdings bei jedem Zugriff auch wieder RAM.
Wenn ich nachher etwas Zeit habe, könnte ich bei dem Ansatz
weiterhelfen, falls erwünscht.

von Rufus T. Firefly (Gast)


Lesenswert?

Wie soll da eine Struktur helfen? Auch die Elemente einer Struktur
liegen einfach so im RAM 'rum, und der Zugriff auf die Elemente
erfolgt auf exakt die gleiche Art und Weise wie der Zugriff auf andere
Variablen auch.

Eine eher theoretische Möglichkeit wäre die Implementierung einer
Klasse in C++, die benötigte Zugriffsfunktionen (Operator=, Operator&
etc.) auf EEPROM-Zugriffe umbiegt - eine Instanz dieser Klasse belegt
aber immer noch Speicher im normalen RAM - irgendwo muss ja die
Speicheradresse gespeichert werden, unter der die Nutzdaten im EEPROM
abgelegt sind.

So etwas ist aber nur mit C++ realisierbar; C selbst kennt keine
Möglichkeit, Zugriffsoperatoren zu überladen.

von tex (Gast)


Lesenswert?

Ich hab keine Ahnung ob es hilft, aber ich hatte mal ein ähnliches
Problem mit Speicher und Variablen, weil das Array, dass den Wert einer
reinkommenden Variablen speichern sollte den RAM zum überlaufen brachte.
Ich habe dann einfach die 8 Bit pro Speicheradresse direkt in einer
Variablen addiert. Man brauchte damit zwar immer noch eine Variable im
RAM und eine um die Speicherbereiche anzusprechen, aber eben nur eine
double statt 20. Man musste eben nur ein bisschen aufpassen, was zu
welchem Zeitpunkt wo drinsteht.
Vieleicht hilfts Dir.

von OldBug (Gast)


Lesenswert?

Was natürlich nicht geht (so wie ich das beim zweiten mal lesen jetzt
verstehe):

eeIntVar = 123;
eeChrVar = 'A';

IntVar = eeIntVar;
ChrVar = eeChrVar;

Das ist natürlich nicht möglich...
Ich dachte eher an eine das EEPROM Katalogisierende Struktur.

von crazy horse (Gast)


Lesenswert?

Hm, sieht ja noch nicht so gut aus....
Ich werde mir erst mal insofern weiterhelfen, dass ich den
Speicherbereich für den internen EEPROM benutze und die Routinen für
diese Zugriffe umschreibe, das sollte gehen.
Sinn der Sache: es wird ein FM24C04 angeschlossen, da weder der interne
EEPROM noch ein "normaler" I2C-EEPROM die geforderte
Schreibzyklenzahl/Schreibzeitanforderungen erfüllen. Sicher noch nicht
die ultimative Lösung, aber ich habe nicht mehr allzuviel Zeit, nächste
Woche ist Termin....

von OldBug (Gast)


Lesenswert?

Hmm...
Hast Du denn vielleicht noch so viel Platz im RAM, daß Du den Inhalt
dort spiegeln kannst?
Bei Modifikation im RAM dann halt nach einer bestimmten Zeit das EEPROM
updaten.
Dadurch reduzierst Du die Zugriffe aufs EEPROM und hast das Problem des
Schreib-/Lesezugriffs weitestgehend gelöst.

von Michael Wilhelm (Gast)


Lesenswert?

Das 2404 hat doch nur 512 Byte, richtig? Ich benutze zur Zeit ein EEPROM
mit 10.000.000 Schreib- Löschzyklen. Wenn du so ein Teil nimmst, die
Zugriffe mitprotokollierst, müstest du fertig sein. Der Typ heißt
24LC65 von Mikrochip. Wenn du das Datenblatt nicht findest, schicke ich
es dir zu. Die 10.000.000 beziehen sich aber nicht auf den gesamten
Speicherbereich, sondern nur auf einen Block. Dieser High
Endurance-Block ist genau so groß wie dein jetziges EEPROM. Sollte also
funktionieren.
MW

von crazy horse (Gast)


Lesenswert?

Geht nicht,Daten müssen spätestens jede Sekunde gesichert werden, pro
Sekunde trudeln auf 12 Kanälen je max. 20 Impulse (Verbrauchsmessungen)
ein, alle von mir vorgeschlagenen Lösungen (Backup-Batterie wegen
Wartungsbedarf verworfen, Netzausfall-Früherkennung mit Sicherungs ins
EEPROM bei Bedarf nur als letztmögliche Lösung akzeptiert). Naja, und
wenn man jede Sekunde schreibt, sind normale EEPROMs schnell am Ende.
Die FRAMS sind schon die optimale Lösung. Die restlichen
(Parametrierungs-)Daten könnten schon ins interne EEPROM, aber wenn
schon, dennschon, dann lege ich alles ins externe FRAM.

von OldBug (Gast)


Lesenswert?

Wie hoch ist denn das Datenaufkommen pro Sekunde? 20bit?
"Viel" kann da ja gar nicht gespeichert werden...

von crazy horse (Gast)


Lesenswert?

10 Mio s sind auch nur 115 Tage, das reicht nicht.
Wie gesagt, das Speichermedium steht fest, jetzt will ich es nur noch
komfortabel verwalten...

von Michael Wilhelm (Gast)


Lesenswert?

@ crazy horse,
überschlagen hast du doch 12 Produktionslinien, die du überwachen
willst. Also, angenommen 12 x unsigned long, entspricht 48 Byte. Nach
100 Tagen wechselst du auf den nächsten 48'er Block. So bekommst du in
den High-Endurance Block 10 x 48 Byte, also 10 x 115 Tage. Danach stehen
dir noch 7,5KByte mit 1.000.000 Schreib- Löschzyklen zur Verfügung. Das
sind etwas über 150 48'er Blöcke. Das sind 150 x 10 Tage. Über 2500
Tage. So, und jetzt ballerst du 8 Stück in die Schaltung. Soviele
kannst du adressieren. 20.000 Tage. Danach erfolgt ein Hardware-Update
(in ca 55 Jahren). Muster hätte ich da.
MW

von Marcus Maul (Gast)


Lesenswert?

Hallo Crazy horse,

was spricht eigentlich gegen eine MMC / SD Karte?
Ziwschen Eprom und SD ist in der Ansteuerung doch nicht der große
Unterschied und zwischenspeichern mußt Du das eh, da wie bereist oben
beschrieben die Lösung mit den Variablen umbiegen nicht in C
existiert.

Gruß Marcus

von crazy horse (Gast)


Lesenswert?

Effektiv gehts wirklich nur um 12 long-Zahlen, aber die müssen sicher
gespeichert sein. Und das kann ich mit einem FRAM perfekt erledigen,
wird sogar 3fach abgelegt. Dafür baue ich keine  8 Stk andere
I2C-EEPROMs oder gar eine SD-Karte ein, da hätte ich ohne weiteren
Nutzen nur mehr Aufwand (Verschiebung der jeweils aktiven Bereiche) und
zusätzliche Fehlerquellen, Layout ist ja auch schon fertig. Ich möchte
nur den I2C-Speicherbereich genauso nutzen können, wie andere auch.
Werde noch drüber nachdenken, vielleicht fällt mir noch was ein, könnte
auch für andere Anwendungen interessant sein. Ich wollte nur
sichergehen, dass ich nicht was offensichtlich einfaches übersehen
habe.
Danke für die rege Beteiligung.

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.