Forum: Compiler & IDEs int Variable ins EEPROM speichern?


von Bernd E. (edi)


Lesenswert?

Hallo,
ich versuche gerade herauszufinden, wie ich eine int Variable ins EEPROM 
meines ATTiny26 speichern und später wieder auslesen kann, habe mir das 
Tutorial angesehen, dort wird aber nur auf uint8 und uint16 und float 
eingegangen. Vielleicht kann mir ja jemand ein Codestück reinstellen, 
welches für int funktioniert!

von O. D. (odbs)


Lesenswert?

Ich speichere Konfigurationen mit gcc und avrlibc immer so:

#include <avr/eeprom.h>

struct tsetup
{
  uint16_t var_bla;
  uint8_t var_bla_array[16];
};

struct tsetup setup;

Das kannst Du beliebig erweitern... und auch einen "int" da 
reinschreiben

Zum Lesen aus dem EEPROM:

eeprom_busy_wait ();
eeprom_read_block(&setup, 0, sizeof(setup));

Zum Schreiben ins EEPROM:

eeprom_busy_wait ();
eeprom_write_block(&setup, 0, sizeof(setup));

von unbeschreiblicher Rahul (Gast)


Lesenswert?

Im EEPROM werden ja eh nur Bytes gespeichert.
Da sollte man durch etwas verschieben und casten aus signed integern 2 
Bytes machen können.
Den Rückweg dann auch so...
Wobei das mit dem Casten etwas schwieriger werden dürfte...

von O. D. (odbs)


Lesenswert?

Wir sind doch im GCC-Forum. Wie gesagt, mit den Blockroutinen gar kein 
Problem:

#include <avr/eeprom.h>

int test;

eeprom_busy_wait();
eeprom_write_block(&test, 0, sizeof(test));

So schreibt man die Variable test an die erste Speicherstelle im EEPROM.

von unbeschreiblicher Rahul (Gast)


Lesenswert?

Genau!

von Bernd E. (edi)


Lesenswert?

Ok danke, werd es morgen gleich mal testen!

von winne (Gast)


Lesenswert?


von Bernd E. (edi)


Lesenswert?

Hi,
habe das Problem mit dem EEPROM immer noch nicht ganz gelöst, wenn ich 
einen int Wert ins EEPROM schreibe, dann ist er zwar drinnen, aber wenn 
ich ihn wieder auslese und am LCD ausgebe, dann wird die Zahl genau 
verdreht ausgegenen. z.B. Speichern: 12345,  Laden + Ausgabe am LCD: 
54321

Ich habs jetzt mal so gemacht:

int cur_key;
.
.
.
/* Write new key to eeprom */
eeprom_busy_wait();
eeprom_write_block((void*) &cur_key, 0, sizeof(cur_key));


eeprom_read_block((void*) &cur_key, 0, sizeof(cur_key));

von Εrnst B. (ernst)


Lesenswert?

Bernd Edlinger wrote:
> habe das Problem mit dem EEPROM immer noch nicht ganz gelöst, wenn ich
> einen int Wert ins EEPROM schreibe, dann ist er zwar drinnen, aber wenn
> ich ihn wieder auslese und am LCD ausgebe, dann wird die Zahl genau
> verdreht ausgegenen. z.B. Speichern: 12345,  Laden + Ausgabe am LCD:
> 54321

Das kann ja nun garnicht sein. Das EEPROM Speichert byteweise, wie soll 
da bitteschön die Darstellung der Zahlen im Dezimalsystem umgedreht 
werden?

Da ist vermutlich eher deine LCD-Ausgaberoutine falsch, gib mal den Wert 
vor dem Speichern auch am LCD aus.

/Ernst

von Bernd E. (edi)


Lesenswert?

Hi,
dass ist jetzt ja echt komisch, irgendwie gibts da wirklich ein Problem 
mit der Ausgabe. Ist bis jetzt noch nie aufgetreten, aber irgendwie 
verdreht die Ausgabe von int den Wert, dabei mach ich da eigentlich nur 
itoa.

void lcd_putint(int value)
{
  char string[6];

  itoa(value, string, 10);
  lcd_puts(string);
}

Hat vielleicht jemand eine Idee?

von Klaus (Gast)


Lesenswert?

Genau dieses Problem habe ich auch !

Bei mir ist es ein "int counter"
welcher im Sekundentakt nach "counter++"
mit itoa() und lcd_puts() aus der lcd-lib
vom Peter Fleury am Lcd dann ausgegeben wird.

Dabei wird die Einerstelle immer am selben Digit
angezeigt und die Zehner-, Hunderter-, Tausender-
Stellen wandern nach rechts bis schliesslich
rechts auch noch der Überlauf ein Minus erzeugt.
Also alles gespiegelt !
Dann zählt die Anzeige wieder rückwärts und
wandert nach links zurück.
Dabei bleiben die Stellen rechts(auch das/die Minuszeichen),
welche z.B beim Übergang von den Tausender auf die
Hunderter-Stellen nicht mehr verändert werden, stehen.

Klaus

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.