www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schreiben und lesen des EEPROMs


Autor: patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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' .

Autor: patrick (Gast)
Datum:

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

Autor: patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  for ( i = 0; i < 2; i++) 
  { 
    FEEADR = addr + 2 * i; 
    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.

Autor: patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
union convert
{
  unsigned long value;
  unsigned int  words[2];
};

....

  convert Converter;

  Converter.value = value;
  // schreibe Converter.words[0]
  // schreibe Converter.words[1]


eine andere ist
.....

   // schreibe das High-Word von value

   .... = value >> 16;

   // schreibe das Low-Word von value

   .... = value & 0xFFFF;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.