Forum: Mikrocontroller und Digitale Elektronik Schreiben und lesen des EEPROMs


von patrick (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
ich habe bis jetzt das gewünschte Ergebnis noch nicht erzielen können
obwohl es einfach scheint.
Ich habe zuerst ein Problem mit einem Interuppt (external interuppt). Er
wird durch eine Taste eingelöst und ich möchte es anwenden um das
Speichern der Werte im EEPROM zu bewirken.

Das Speichern der Werte klappt auch nur halbs Weg
wenn ich etwas speichere, bekomme ich beim Lesen nur die 4 letzten
Charater.

kann jemand mir sagen wie ich es besser hinbekommen kann.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Wie wär´s denn, wenn Du uns erstmal verrätst, um welchen Controller es 
sich handelt. Weiterhin tausche doch bitte in der englischen 
Unterbrechung ein 'p' gegen ein 'r' und rücke dieses vor das 'u' .

von patrick (Gast)


Lesenswert?

Es handelt sich hier um einen Mikrocontroller von Analog Devices 
ADuC7060.
ich dachte, ich hätte es vorher erwähnt. Sorry

von patrick (Gast)


Lesenswert?

Ich habe versucht einen externen Interrupt zu benutzen um das Speichern 
von einem Wert auszulösen aber der Interrupt scheint nicht so zu wirken 
wie ich es mir gewünscht habe.
Ich habe den Quellcode oben angehangt.

danke...

von Karl H. (kbuchegg)


Lesenswert?

Selbst wenn du jemanden hier im Forum findest, der sich mit diesem 
Controller auskennt, glaube ich nicht, dass er sich deinen Kraut und 
Rüben Source Code antun wird.

von Karl H. (kbuchegg)


Lesenswert?

Und poste dein ganzes Programm.
Nimm das C File so wie es ist und hänge es als Attachment an. Die 
Forensoftware weiß schon, was man mit *.c Files macht. Es gibt keinen 
Grund da ein *.txt draus zu machen.

Wie gesagt: konmplettes Programm, damit man auch die Teile sieht, die du 
nicht zeigst. Wie zb: volatile definierte Variablen.
Schwachsinn: Eine Variable namens i, die als Schleifenzähler benutzt 
wird, macht man nicht global. Die Gefahr ist viel zu groß, dass man sich 
damit selbst ins Knie schiesst, wenn Funktionen andere Funktionen in 
einer Schleife aufrufen die dann auch wieder dasselbe i verwenden.

von Karl H. (kbuchegg)


Lesenswert?

1
  for ( i = 0; i < 2; i++) 
2
  { 
3
    FEEADR = addr + 2 * i; 
4
    FEEDAT = value; //*((unsigned long*)0xFFFF051C);


Dir ist schon bewusst, dass du hier dieselben Daten 2 mal hintereinander 
um 2 Bytes versetzt ins EEPROM knüdelst (Vorausgesetzt in FEEADR 
schreibt man eine Byteadresse rein). Da ein unsigned long auf deinem 
System höchst wahrscheinlich nicht 2 Bytes lang ist, überschreibst du 
dir mit dem 2. Schreibvorgang Teile des vorher geschriebenen Wertes.

von patrick (Gast)


Lesenswert?

Sorry solche Durcheinander verursacht zu haben. Eigentlich möchte ich 
einen Wert aus dem ADC-Register (ADC0DAT) ins EEPROM schreiben und das 
Problem ist der Wert ist 24bit codiert und der Flash/EEPROM Register nur 
16bit aufnehmen kann. Ich habe die Adresse hochzählen wollen ( FEEADR = 
addr++) aber es hat nicht so geklappt deswegen habe ich dann so versucht 
wie du jetzt im Quellcode siehst.
Wie kann ich den Wert in zwei aufteilen MSB und LSB damit ich es ins 
EEPROM rein bringen kann?

Danke...

mfg

von Karl H. (kbuchegg)


Lesenswert?

patrick schrieb:

> 16bit aufnehmen kann. Ich habe die Adresse hochzählen wollen ( FEEADR =
> addr++) aber es hat nicht so geklappt deswegen habe ich dann so versucht
> wie du jetzt im Quellcode siehst.

Die Adresse hochzählen ist schon ok.
Aber du musst dir aus dem unsigned long auch die jeweiligen 16 Bit 
herausholen, die du brauchst.
Du musst den unsigned long in 2 unsigned int zerlegen, die dann 
nacheinander geschrieben werden

> Wie kann ich den Wert in zwei aufteilen MSB und LSB damit ich es ins
> EEPROM rein bringen kann?

Dazu gibts viele Möglichkeiten. Eine ist zb so
1
union convert
2
{
3
  unsigned long value;
4
  unsigned int  words[2];
5
};
6
7
....
8
9
  convert Converter;
10
11
  Converter.value = value;
12
  // schreibe Converter.words[0]
13
  // schreibe Converter.words[1]


eine andere ist
1
.....
2
3
   // schreibe das High-Word von value
4
5
   .... = value >> 16;
6
7
   // schreibe das Low-Word von value
8
9
   .... = value & 0xFFFF;

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.