- Labornetzteil AliExpress         
Ergebnis 1 bis 7 von 7

Thema: Schreiben von Werten in EEPROM, uninitialisierte Variablen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.01.2004
    Ort
    Salzburg
    Beiträge
    46

    Schreiben von Werten in EEPROM, uninitialisierte Variablen

    Anzeige

    Praxistest und DIY Projekte
    Hallo!

    Ich habe ein kleines Problem.
    Mit meinem ATMEGA32 habe ich mir eine Temperatursteuerung programmiert, wobei ich die Sollwerte vom PC auf den µController und die Messwerte vom µC zum PC übertrage.
    Nun wollte ich die Sollwerte nicht im SRAM sondern im EEPROM speichern, damit sie bei einem Stromausfall nicht verloren gehen.
    Das Speichern und Auslesen der Werte an sich ist kein Problem.

    Nur habe ich das Problem, dass ich die Werte nicht initialisieren darf, da sonst bei einem Reset, warum auch immer, wieder diese Werte als Sollwerte verwendet werden.
    Sobald ich die Werte einmal vom PC zum Atmel übertragen habe, ist das Problem sowieso gelöst, da diese ja dann im EEPROM stehen.
    Aber davor habe ich eben diese nicht initialisierten Variablen, und deswegen funktioniert meine Steuerung nicht richtig.

    Gibt es hierfür irgendeine Lösung, oder denke ich nur mal wieder zu kompliziert?

    Chris

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Also in C geht ja bekanntlich alles

    Aber ich verstehe nicht, was du machen willst bzw. wo es hakt. Willst du die (Start-) Werte in deinem Quellcode schon hinschreiben?

    Nehmen wir mal an du hast ein Datum foo vom Typ foo_t definiert, der deine Werte beinhaltet und ins EEPROM lokatiert ist:

    Code:
    #define EEMEM __attribute__((section(".eeprom")))
    
    typedef {...} foo_t;
    
    const foo_t foo EEMEM = 
    {
       .wert1 = VAL1,
       .wert2 = VAL2
    };
    Dann wird beim Flashen die Struktur im EEPROM initialisiert. Ohne Initializer sind alle Werte auf 0.

    Wo hakt's denn dabei?
    Disclaimer: none. Sue me.

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Gibt welche, die machen das mit einer Prüfsumme (egal welche).
    Wenn die paßt, sind die Werte im EEPROM koscher und können verwendet werden, anderenfalls werden sie mit neuen Werten überschrieben (und die Prüfsumme korrigiert).
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    08.01.2004
    Ort
    Salzburg
    Beiträge
    46
    Wenn ich die Variable als const deklariere, kann ich Ihren Wert nicht mehr ändern.
    Es geht mir um das, dass die Variablen bei einem Reset des Controllers nicht mit einem fixen Wert initialisiert werden, sondern nur ein mal beim Flashen und danach nur per Übertragung via UART geändert werden können.
    Wie könnte ich das mit einer Prüfsumme realisieren?

    Chris

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Irgendein CRC8 reicht . da gibt's auch im C funktionen für.
    Oder einfach miteinander XOR-en, in einer Schleife
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von DarkFire
    Wenn ich die Variable als const deklariere, kann ich Ihren Wert nicht mehr ändern.
    Wer hat dir denn das erzählt...?

    Code:
    const int i = 0;
    
    ...
    {
       int * pi = (int*) &i;
    
       (*pi) = 2; 
       // und i ist danach 2
    }
    Aber das löst dein Problem nicht, denk ich.
    Disclaimer: none. Sue me.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Es geht mir um das, dass die Variablen bei einem Reset des Controllers nicht mit einem fixen Wert initialisiert werden, sondern nur ein mal beim Flashen und danach nur per Übertragung via UART geändert werden können.
    Und wo ist jetzt das Problem ?

    Code:
    uint8_t meine_eeprom_variable EEMEM = 123;
    lesen:
    Code:
    uint8_t irgendwas;
    irgendwas = eeprom_read_byte(&meine_eeprom_variable);
    oder
    Code:
    UDR = eeprom_read_byte(&meine_eeprom_variable);
    schreiben :
    Code:
    uint8_t irgendwas =150;
    eeprom_write_byte(&meine_eeprom_variable,irgendwas);
    Was willst Du jetzt da mit Prüfsummen ?
    Ich verstehe das Problem nicht...

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad