Forum: Mikrocontroller und Digitale Elektronik EEPROM Segmentierung & Speicherung


von Sopest (Gast)


Lesenswert?

Hallo!

Ich versuche seit Wochen Werte (welche ich über USB bekomme) in mein 
EEPROM(internes vom AtMega) zu speichern. Ich verwende einen ATMega128 
programmiere ihn über AVR Studio 4 (avr gcc).

Folgende deklaration für die Variablen wurde getroffen:
1
#include <avr/eeprom.h>
2
#include <avr/io.h>
3
4
#define EEMEM  __attribute__ ((section (".eeprom")))
5
6
#define EE_DUMMY      0x000
7
#define EE_WERT       ( 0x000 + sizeof( uint8_t ) )
8
#define EE_ANZAHL     ( EE_WERT + sizeof( uint8_t ) )
9
#define EE_NAME       ( EE_ANZAHL + sizeof( uint16_t ) )
10
#define EE_WERTIGKEIT ( EE_NAME + 10 * sizeof( uint8_t ) )
11
#define EE_LAST       ( EE_WERTIGKEIT + sizeof( uint8_t ) )

Nun habe ich mir das AVR-GCC-Tutorial des öfteren durchgelesen, und bin 
der Meinung, dass der obere Code die Variablen auf dem EEPROM definiert.

Wie kann ich auf diese Variablen zugreifen? Wie kann ich sie verändern? 
Sind sie so richtig definiert? in z.B EE_ANZAHL wie kann ich da eine 
Zahl (z.B 101) hinein schreiben.
1
uint8_t   temp1;
2
uint16_t  temp2;
3
 
4
temp1 = eeprom_read_byte(EE_WERT);
5
temp2 = eeprom_read_word(EE_NAME);

Kann ich so Die Variablen auslesen, es klappt nicht so ganz...
1
eeprom_write_block(myWordBuffer,eeFooWordArray1,sizeof(myWordBuffer));

Einmal hat das kompilieren geklappt aber beim übertragen war ein 
HEX-Wert out of range?

Könnte mich eventuell jemand informieren, wie ich das dann in den 
ATMega128 spiele? Muss ich da ein extra File rüberladen?

Im AVR-Studio befindet sich eine Option "Edit Current Configuration 
Options" dort auf "Memory Settings" muss/kann ich dort auch etwas 
eingeben?

Ich wäre sehr erfreut, und dankbar, wenn mir jemand ein kleines C-File 
schreiben könnte ich verzweifle schon 0,o. Eine Erklährung wäre 
natürlich auch spitze!

Ich freue mich über jede Hilfe, bin auf dem Gebiet noch relativ neu.

Danke

Sopest:)

von Karl H. (kbuchegg)


Lesenswert?

Sopest wrote:
> Folgende deklaration für die Variablen wurde getroffen:
>
>
1
#include <avr/eeprom.h>
2
> #include <avr/io.h>
3
> 
4
> #define EEMEM  __attribute__ ((section (".eeprom")))
5
> 
6
> #define EE_DUMMY      0x000
7
> #define EE_WERT       ( 0x000 + sizeof( uint8_t ) )
8
> #define EE_ANZAHL     ( EE_WERT + sizeof( uint8_t ) )
9
> #define EE_NAME       ( EE_ANZAHL + sizeof( uint16_t ) )
10
> #define EE_WERTIGKEIT ( EE_NAME + 10 * sizeof( uint8_t ) )
11
> #define EE_LAST       ( EE_WERTIGKEIT + sizeof( uint8_t ) )
>
> Nun habe ich mir das AVR-GCC-Tutorial des öfteren durchgelesen, und bin
> der Meinung, dass der obere Code die Variablen auf dem EEPROM definiert.

Das definiert überhaupt keine Variablen, sondern stellt lediglich
eine Reihe von Zahlen bereit. Im Grunde ist es dasselbe, wie wenn
du geschrieben hättest
1
#define EE_DUMMY        0
2
#define EE_WERT         1
3
#define EE_ANZAHL       2
4
#define EE_NAME         4
5
#define EE_WERTIGKEIT   14
6
#define EE_LAST         15

> Wie kann ich auf diese Variablen zugreifen?

Du kannst eeprom_read_byte / eeprom_read_word benutzen und
dort diese Zahlen als Adresse angeben, von wo im EEPROM gelesen
bzw. geschrieben werden soll.
Nochmal: Du hast hier keine Variablen, du hast lediglich Zahlen
die du als Adresse im EEPROM Speicher benutzen kannst um
von dort zu lesen bzw. zu schreiben.

> Sind sie so richtig definiert? in z.B EE_ANZAHL wie kann ich da eine
> Zahl (z.B 101) hinein schreiben.
>
>
1
uint8_t   temp1;
2
> uint16_t  temp2;
3
> 
4
> temp1 = eeprom_read_byte(EE_WERT);
5
> temp2 = eeprom_read_word(EE_NAME);
6
>

Aufpassen. EE_NAME hat den Wert 4. Die nächste Adresse die du
berechnet hast, EE_WERTIGKEIT, hat den Wert 14, dazwischen liegt
also eine Differnz von 10. 10 Bytes sind aber kein Word.

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.