mikrocontroller.net

Forum: Compiler & IDEs int Variable ins EEPROM speichern?


Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Oliver Döring (odbs)
Datum:

Bewertung
0 lesenswert
nicht 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));

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Oliver Döring (odbs)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: unbeschreiblicher Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau!

Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke, werd es morgen gleich mal testen!

Autor: winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht 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));

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.