avr eeprom mehrere Einträge hintereinander

#7050939
Lesenswert?

Hallo zusammen,
ich habe für meine atmega328p eine Funktion, die beim ersten Aufruf in 
die Zelle 0 des eeproms einträgt und beim zweiten aufrufen in die Zelle 
1.
Falls die Funktion nur einmal aufgerufen wird, wird der Float korrekt in 
Zelle 0 eingetragen. Rufe ich aber ein zweites mal die Funktion auf um 
auch in Zelle 1 was einzutragen, dann ist der Inhalt in Zelle 1 nicht 
mehr korrekt.
Weiß einer wie ich dieses Problem lösen kann?

Hier die Funktion:
1
void calibrate(int emg){
2
  _delay_ms(2000);                 
3
  emg_adc(emg);
4

5
  if(emg == 0){             
6
    switch(calibrate_counter1){
7
      case 0:                         
8
        emg1_offset = emg1;
9
        calibrate_counter1 ++;
10
        succes_LED();
11
         eeprom_write_float(0, 11.22);
12
        break;
13
      case 1:                        
14
        _delay_ms(2000);           
15
        emg_adc(emg);
16
        amp_emg1 = emg1;             
17
        calibrate_counter1 = 0;       
18
        succes_LED();
19
        eeprom_write_float(1, 22.22);
20
        break;
21
    }
22
  }
23
}
Gast #7050966
Lesenswert?

Kurt schrieb:
> Das ist ja eine dämliche write_float-Funktion, wenn die bei
> Adresse N nicht auf N * (Länge der float-Variable) zugreift.

Dämlich ist eher Deine Annahme, dass man ausschliesslich Floats ins 
EEPROM schreibt und die Adressen dementsprechend immer Vielfache davon 
wären.

Kurt schrieb:
> Darum bleib ich bei asm...

Die Trolle waren auch schonmal besser.
Gast #7051191
Lesenswert?

EAF schrieb:
> Clara E. schrieb:
>> So simpel...
>
> Adressberechnungen muss man nicht selber machen!
> Das kann man dem Compiler überlassen.
> float name EEMEM = 42.42; // Default
> // spaeter dann
>  eeprom_write_float(&name, 11.22); // evtl fehlt da noch ein cast
>  eeprom_write_float((unsigned)&name, 11.22);

Ist das nicht kompletter Blödsinn?
Warum ist die Zieladresse jetzt auch ein Float?
Gast #7051276
Lesenswert?

erklehr behr schrieb:
> Kann man in einem beliebigen <eeprom.h> eines AVR Controllers
> nachschauen.

Das habe ich natürlich getan.... schon vor langer Zeit.
Daher kenne ich diese Adressen Verwaltung, ja.....
Bin eher C++, und in C laufen die automatischen Konvertierungen etwas 
anders ab, nicht so streng/typesicher.

Bin aber nicht sicher ob wirklich diese Funktion verwendet wird. Aus dem 
Quelltext Fragment geht das nicht hervor.
Gast #7051290
Lesenswert?

erklehr behr schrieb:
> Aber im um Kopf und Kragen reden bist ja ganz gut.

Sorry dass ich hier eine "Alternative Adressierung" für EEPROM Variablen 
gezeigt habe.
Es ist schon OK, dass dir das nicht schmeckt.
Mag ja auch nicht jeder Himbeereis.

Aber ich kann es auch drastischer formulieren:
Wer händisch Adressen/Pointer festlegt, obwohl es auch automatisch geht, 
weiß etwas ganz wichtiges noch nicht.
Wer es dennoch tut, obwohl er/sie/es weiß, ist dämlich genug sich selber 
Stöcke zwischen die Beine zu werfen.

PittyJ schrieb:
> Ist das nicht kompletter Blödsinn?
> Warum ist die Zieladresse jetzt auch ein Float?
Hier ist jemand so ahnungslos.

Kurt schrieb:
> Darum bleib ich bei asm...
Hier auch.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren