Forum: Mikrocontroller und Digitale Elektronik avr eeprom mehrere Einträge hintereinander


von Clara E. (clara97)


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
}

: Bearbeitet durch User
von Helmut -. (dc3yc)


Lesenswert?

Ich kenne nun deine eeprom-funktion nicht, aber ein float hat doch 4 
byte und das EEPROM ist byteweise orientiert, sodass evtl da was 
überschrieben wird? Probiere doch statt eeprom_write_float(1, 22.22) 
einmal eeprom_write_float(3, 22.22). Vielleicht geht es dann?

von Clara E. (clara97)


Lesenswert?

So simpel...
vielen dank!

von Dieter R. (drei)


Lesenswert?

Oder eeprom_write_float(4, 56.78)?

von Kurt (Gast)


Lesenswert?

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

Darum bleib ich bei asm...

von EAF (Gast)


Lesenswert?

Clara E. schrieb:
> So simpel...

Adressberechnungen muss man nicht selber machen!
Das kann man dem Compiler überlassen.
1
float name EEMEM = 42.42; // Default 
2
3
// spaeter dann
4
 eeprom_write_float(&name, 11.22); // evtl fehlt da noch ein cast
5
 eeprom_write_float((unsigned)&name, 11.22);

von Hmmm (Gast)


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.

von PittyJ (Gast)


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?

von erklehr behr (Gast)


Lesenswert?

PittyJ schrieb:
> Warum ist die Zieladresse jetzt auch ein Float?

Die Variable <name> ist hier ein Float.

Die Adresse von <name> ist natürlich ein Integer. Anders
schafft das kein Mikroprozessor.

von EAF (Gast)


Lesenswert?

PittyJ schrieb:
> Warum ist die Zieladresse jetzt auch ein Float?

Die Variable liegt im EEPROM.
&name liefert einen Zeiger darauf

Der Zeiger wird zu einem unsigned gecastet
Wobei ich mich nicht sicher bin, ob das nötig ist, denn ich weiß nicht 
wie eeprom_write_float() definiert ist

von erklehr behr (Gast)


Lesenswert?

EAF schrieb:
> denn ich weiß nicht wie eeprom_write_float() definiert ist

Kann man in einem beliebigen <eeprom.h> eines AVR Controllers
nachschauen.

von EAF (Gast)


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.

von erklehr behr (Gast)


Lesenswert?

EAF schrieb:
> Bin aber nicht sicher ob wirklich diese Funktion verwendet wird.

Aber im um Kopf und Kragen reden bist ja ganz gut.

von Oliver S. (oliverso)


Lesenswert?

EAF schrieb:
> Bin eher C++, und in C laufen die automatischen Konvertierungen etwas
> anders ab, nicht so streng/typesicher.

Keine Sorge, für den Fall hier reichts auch in C.

Oliver

: Bearbeitet durch User
von EAF (Gast)


Lesenswert?

Nachtrag:
Der cast ist falsch, die AVR-Libc Funktion erwartet einen Pointer auf 
eine float Variable

von EAF (Gast)


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.

von Georg M. (g_m)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.