Forum: Mikrocontroller und Digitale Elektronik EEprom liefert beim einschalten falschen Wert (FF)


von Bernhard (Gast)


Lesenswert?

Hallo,

ich bin ein wenig ratlos bei diesem Phänomen. Im EEprom des ATmega128 
habe ich Stellwerte gespeichert und wenn ich die Schaltung einschalte, 
sprich 5V anlege, wird nicht der Wert 666 gelesen, sondern FFF. Ich habe 
das Flash nicht neu geschrieben und das Fusebit EESave ist gesetzt. 
Reset gibt dann den richtigen Wert zurück. Ich habe zuerst die 
Defninition eeprom_busy_wait() und dann meine ...mega128 probiert, in 
der Hoffnung, das hier nicht auf ready EEprom gewartet wird --

#define eeprom_busy_wait() do {} while (!eeprom_is_ready())
#define eeprom_busy_wait_mega128() do {} while (EECR & (1<<EEWE));
unsigned int        DAC_value_U_NT2_EE[1] EEMEM, DAC_value_U_NT1_EE[1] 
EEMEM, DAC_value_I_NT2_EE[1] EEMEM, DAC_NT2_U_Mult_EE[1] EEMEM;

 void EEprom_value_ini() //(unsigned int *) == Adresse Pointer set
{
  eeprom_busy_wait_mega128();
  DAC_value_U_NT2 = eeprom_read_word((unsigned int 
*)DAC_value_U_NT2_EE[1]);
  DAC_value_U_NT2 &= 0x0fff;    // 16(12) bit Wert aus EEprom lesen und 
oberes Nibble entfernen
  sprintf(buffer,"U%4x\t",DAC_value_U_NT2);
  UART_0_Text_Ram(buffer);

  eeprom_busy_wait_mega128();
  DAC_value_I_NT2 = eeprom_read_word((unsigned int 
*)DAC_value_I_NT2_EE[1]);
  DAC_value_I_NT2 &= 0x0fff;    // 16(12) bit Wert aus EEprom lesen und 
oberes Nibble entfernen. Wichtig da U und I addiert werden für Ausgabe 
24 bit DAC
  sprintf(buffer,"I%4x\t",DAC_value_I_NT2);
  UART_0_Text_Ram(buffer);
}

funktionieren leider beide gleich. Tool AVR Studio 5. Was mache ich 
falsch.

Danke schon mal für Eure Hilfe und Gruß Bernhard

von Helfer (Gast)


Lesenswert?

>  DAC_value_U_NT2 = eeprom_read_word((unsigned int *)DAC_value_U_NT2_EE[1]);

Dass du da den cast brauchst oder benutzt sollte dir zu denken geben.

unsigned int DAC_value_U_NT2_EE[1] EEMEM;

Ist ein Feld aus unsigned int mit einem ([1]) Element im EEPROM.

Ansprechen kannst du das erste (und einzige Element) mit:

DAC_value_U_NT2 = eeprom_read_word(&DAC_value_U_NT2_EE[0]);

oder

DAC_value_U_NT2 = eeprom_read_word(DAC_value_U_NT2_EE);

Aber nicht mit deiner Variante. Die liest irgendwas.

von Julian R. (tuefftler)


Lesenswert?

Hast du die fuse für den BrownOutDetector gesetzt?
Ich hab mal so ein ähnliches problem gehabt, bei dem nur das einschalten 
des BOD geholfen hat.

julian

von Bernhard (Gast)


Lesenswert?

Hallo Helfer und Julian,

danke für Eure Hilfe. Ich habe es mit & und mit BOD 2V7 getestet und 
Tata - es funktioniert. Nur jetzt habe ich diese Meldung erhalten.
 Target "PostBuildEvent" skipped, due to false condition; 
('$(PostBuildEvent)' != '') was evaluated as ('' != '').
Diese Meldung verschwindet, wenn (unsigned int*)... verwendet wird. So 
wurde es hier Forum beschrieben. Sorry, ich habe noch nicht alles 
verstanden, da ich erst seit kurzem in C programmiere.

Gruß Bernhard

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.