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.
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.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 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.
Lesezeichen