vohopri
08.11.2013, 14:46
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.
// 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.
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.
// 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.