Hallo,

jetzt hab ich versucht, Parameter ins eeprom eines ATmega8zu schreiben und wieder aus zu lesen.

Nachdem die Werte nicht richtig zurückgelesen werden, hab ich mein Programm auf ein kleines Testprogramm zurückgestutzt, das immer noch diesen Fehler zeigt.

Ich teste 2x. Unmittelbar nach dem Schreiben im Programmteil nach receiveloop und nach dem reset des MC im Programmteil Testloop.

Irgend etwas habe ich da nicht oder falsch verstanden und bitte um Hinweise, wo da der Hund begraben ist.
Code:
// Test
#include <avr/io.h>
#include <avr/interrupt.h> 
#include <avr/eeprom.h>
#include <util/delay.h>  // Für Testzwecke
// Parametervariablen im EEPROM
uint8_t * eeWaitTimeSteps   EEMEM;
uint8_t * eeTrailerTimeSteps  EEMEM;
uint8_t * eeTrailerMode   EEMEM;
// Vorlauf
volatile uint8_t WaitTimeSteps = 0;
// Laufzeitbegrenzung
// Betriebsart
volatile uint8_t TrailerMode = 0;
#define TModeTime   0
#define TModeFactor 1
volatile uint8_t TrailerTimeSteps = 0;
volatile uint8_t FactorSelector = 0;
volatile uint16_t TrailerTable[8] = {0, 25, 50, 100, 150, 200, 250, 300 };    
// bei Jumper                        0   1   2    3    4    5    6    7    
void TestSignal(uint8_t x)
 {
  unsigned char i;
  //Test zählt immer 1 dazu, damit man die Null sieht:
  for (i=0;i<=x;i++)
  //for (i=0;i<=5;i++)
   {
   {PORTD |=  (1 << 5);} // setzt debug led
   _delay_ms(200);
   {PORTD &= ~(1 << 5);}// löscht debug led
   _delay_ms(300);
   }
  _delay_ms(500);
  }
void ReceiveParams()
 {
 unsigned char Ready;
 Ready=0;
 
 while((PIND & 0b0100)==0); //Warteschleife auf strobe high
 _delay_ms(1000);   // Entprellen
 while(!Ready)    // Receive Loop
  {
  // Übernahme getestet, OK
  WaitTimeSteps =  ((~(PINB >> 1)) & 0b00000111);
  TrailerTimeSteps =  ((~(PINB >> 4)) & 0b00000111);
  TrailerMode =   ((~(PINB >> 7)) & 0b00000001);
  //abspeichern
  if ((PIND & 0b0100)==0)
   {
   eeprom_busy_wait();
   eeprom_update_byte (eeWaitTimeSteps, WaitTimeSteps);
   eeprom_busy_wait();
   eeprom_update_byte (eeTrailerMode, TrailerMode);
   eeprom_busy_wait();
   eeprom_update_byte (eeTrailerTimeSteps, TrailerTimeSteps);   
   //*/
   Ready = 1; 
   }
  }   // Receive Loop
 while(1)// final loop
  {
  TestSignal(WaitTimeSteps);
  TestSignal(TrailerMode);
  TestSignal(TrailerTimeSteps); // bis hier OK
  _delay_ms(1000);
   eeprom_busy_wait();
  TestSignal(eeprom_read_byte (eeWaitTimeSteps));
   eeprom_busy_wait();
  TestSignal(eeprom_read_byte (eeTrailerMode));
   eeprom_busy_wait();
  TestSignal(eeprom_read_byte (eeTrailerTimeSteps));
  _delay_ms(5000);
  } // final loop
 }  // function receiveparams 
// Hauptprogramm =====================================================================
int main(void)
 { 
 // GPIO Einstellungen ------------------------------------------------------------
 DDRB  =  0b00000000; // Port B input für Jumper Einlesen und Licht
 PORTB |= 0b11111111; // Port B Pullup intern für Jumpers und OC Stufe Licht
 // debug2
 DDRD |= (0b00001000 << 2);  // Port D5 output für Test
    DDRD &= ~(0b00000111 << 2); // Port D2 D3 D4 input für Parametriermodus
 PORTD |= (0b00000111 << 2); // Port D2 D3 D4 Pullup intern
 // Abfrage Parametrierstecker
 if (!(PIND & (0b00000100 << 2)))  {ReceiveParams();} 
/* basic Test OK
for(;;)
   {
   if (!(PIND & (0b00000100 << 2)))
   {PORTD |=  (1 << 5);} // setzt debug led
   else 
   {PORTD &= ~(1 << 5);}// löscht debug led
   }
//*/
//*
 while(1) // Test loop
  {
  TestSignal(WaitTimeSteps);
  TestSignal(TrailerMode);
  TestSignal(TrailerTimeSteps);
  TestSignal(FactorSelector);// Bis hier OK
  _delay_ms(100);
   eeprom_busy_wait();
  TestSignal(eeprom_read_byte (eeWaitTimeSteps));
   eeprom_busy_wait();
  TestSignal(eeprom_read_byte (eeTrailerMode));
   eeprom_busy_wait();
  TestSignal(eeprom_read_byte (eeTrailerTimeSteps));
  _delay_ms(2000);
  }
 return 0;
 } // main
Wenn ich über das GPIO die Werte 0 0 0 einlese, dann werden die richtig erkannt, nach dem Abspeichern richtig zurück gelesen und nach dem reset richtig aus dem eeprom geholt.
Wenn ich 2 1 3 einlese, dann wird das richtig erkannt, nach dem Abspeichern aus dem eeprom falsch zurück gelesen (den genauen Wert kann ich mit dem Blinklämpchen nicht feststellen) und nach dem Reset bekomme ich die Werte 2 3 3 aus dem eeprom

Was mich noch verwundert, ist, dass der Compiler 6 byte im eeprom belegt meldet, wo ich nur 3 Stk verwende.