Forum: Compiler & IDEs Array mit vorzeichen im eeprom Speichern


von neuling (Gast)


Lesenswert?

ich versuche grade mein array im eeprom des atmega128 zu speichern,beim 
lesen aus dem eeprom erhalte ich komische werte auch das vorzeichen wird 
nich richtig gelesen.
die Routinen sind hier aus dem Tutorial.


1
int i;
2
signed int Wert[19]; 
3
Wert[1] = -20; 
4
5
        for(i=0; i<19; i++)
6
         {
7
          EEPWriteByte( 10+i,Wert[i]);
8
          
9
         }
10
11
        for(i=0; i<19; i++)
12
         {
13
          Wert[i]=EEPReadByte(10+i);
14
          
15
         }

von holger (Gast)


Lesenswert?

Dein signed int hat zwei Byte. Du speicherst
und liest nur ein Byte.

von neuling (Gast)


Lesenswert?

Muss ich denn anstatt EEWritebyte  denn EEWriteWort benutzen
bitte um Nachsicht.
int i;
 signed int Wert[19];
 Wert[1] = -20;

         for(i=0; i<19; i++)
         {
           EEPWriteWort( 10+i,Wert[i]);

          }

         for(i=0; i<19; i++)
          {
           Wert[i]=EEPReadWort(10+i);

          }

von neuling (Gast)


Lesenswert?

hallo,
kann mir von ihnen keiner weiterhelfen wie ich die werte speichern kan
mfg

von Tristan L (Gast)


Lesenswert?

Ich würde sagen bleib bei dem byte. aber mach Typecasts
1
 uint8_t Wert[19];
2
int Wert2[19]; //Nur zum vergleichen
3
 Wert[1] = (uint8_t)-20;
4
5
         for(i=0; i<19; i++)
6
         {
7
           EEPWriteByte( 10+i,Wert[i]);
8
9
          }
10
11
         for(i=0; i<19; i++)
12
          {
13
           Wert2[i]=(int)EEPReadByte(10+i);
14
15
          }

Wichtig: nur Werte von -128 bis 127 sind möglich

von neuling (Gast)


Lesenswert?

Leider Funktioniert das auch nicht,
Die -20 können zb. in Wert[2],Wert[10]
drin stehen.
mfg

von Johann L. (gjlayde) Benutzerseite


Lesenswert?


von neuling (Gast)


Lesenswert?

ich hab das jetzt so aber so gehts auch nicht.
Denn beim Compilieren kommen 2 Warnings bei eeprom_write_word und 
eeprom_read_word.
vielleicht kann von ihnen noch einer weiterhelfen
mfg
1
int i;
2
signed int Wert[19]; 
3
Wert[1] = -20; 
4
Wert[8] = -18; 
5
6
        for(i=0; i<19; i++)
7
         {
8
          
9
          eeprom_write_word(&10+i,Wert[i]);
10
         }
11
12
        for(i=0; i<19; i++)
13
         {
14
          Wert[i]=eeprom_read_word(&10+i);
15
          
16
         }

von Vlad T. (vlad_tepesch)


Lesenswert?

warum überhaupt so kompliziert?
1
#include <avr/eeprom.h>
2
3
4
#define SOMELARGEDATA_LENGTH 19
5
struct MyEepromData{
6
  int someData;
7
  int someOtherData;
8
  int someLargeData[SOMELARGEDATA_LENGTH];
9
};
10
11
12
// eeprom daten dem Compiler auch bekannt machen
13
// dann entfällt das merken und von Hand rumrechnen der eeprom adressen
14
// außerdem könnte man die Daten auch so gleich intialisieren
15
// (das gibt dann nach dem kompilieren einn .eep-File
16
struct MyEepromData EEMEM g_eepromData = // this reserves place in eeprom
17
{
18
  5, 7, {7,8,9,/* .. */},
19
}
20
21
// ...
22
23
void someFunction()
24
{
25
  struct MyEepromData workingCopy;
26
  // das ist alles was du brachst um Daten zu lesen:
27
  eeprom_read_block(&workingCopy, &g_eepromData, sizeof(g_eepromData));
28
29
  // oder wenn man dann wirklich nur das array braucht
30
  int array[SOMELARGEDATA_LENGTH];
31
  eeprom_read_block(&array, &(g_eepromData.someLargeData), sizeof(g_eepromData.someLargeData));
32
33
  //Analog dazu das schreiben:
34
  eeprom_write_block(&workingCopy, &g_eepromData, sizeof(g_eepromData));
35
  
36
  // bzw:
37
  eeprom_write_block(&array, &(g_eepromData.someLargeData), sizeof(g_eepromData.someLargeData));
38
39
}

von neuling (Gast)


Lesenswert?

Erstmal vielen Dank für ihre Hilfe,
Die daten im array werden ja während das Programm im Atmega läuft
ja auch verändert ,mein Problem ist ja wie ich das vorzeichen zb.-20
im eeprom speichern und lesen kann.
mfg

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Verwende den richtigen Typ und fertig.

Ums Vorzeichen brauchst dich dann ebensowenig zu kümmern wie darum, ob 
die Zahl gerade ist oder ungerade oder ne Primzahl.

Was verstehst du am oben verlinkten Tutorial nicht?

von neuling (Gast)


Lesenswert?

Wenn ich mein array als int wert[19] Deklariere und mit den Funktionen 
aus dem Tutorial
eepreadbyte und eepwritebyte kann ich das array an die gewünschte 
adresse speichern und lesen aber ohne Vorzeichen und so wie ichs jetzt 
habe gehts nicht das ist zurzeit mein problem.

wie muss ich den richtigen Type verwenden?
mfg

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Funktionen zum Lesen eines Bytes passen nicht gut, wenn man zwei davon 
lesen will.

Was spricht gegen sowas?
1
#include <avr/eeprom.h>
2
3
int a_ram[19];
4
int a_ee[19] EEMEM;
5
6
void read (void)
7
{
8
    eeprom_read_block (a_ram, a_ee, sizeof (a_ee));
9
}

von Karl H. (kbuchegg)


Lesenswert?

neuling schrieb:
> Wenn ich mein array als int wert[19] Deklariere und mit den Funktionen
> aus dem Tutorial
> eepreadbyte und eepwritebyte

vergiss ee_read_byte bzw. ee_write_byte
Du hast nun mal keine einzelnen Bytes!

Du kannst dein Array im weitesten Sinne als einen Block von Bytes 
auffassen und damit ee_read_block bzw. ee_write_block benutzen, so wie 
Vlad das da oben gezeigt hat.

Klar bricht sich diese Funktion das dann auch wieder in Bytes runter. 
Aber danmn macht es die Funktion und du brauchst es nicht machen.

Ist doch ganz einfach.

von Karl H. (kbuchegg)


Lesenswert?

neuling schrieb:
> Wenn ich mein array als int wert[19] Deklariere und mit den Funktionen
> aus dem Tutorial
> eepreadbyte und eepwritebyte kann ich das array an die gewünschte
> adresse speichern und lesen aber ohne Vorzeichen

Dein Problem war nicht das Vorzeichen an sich, sondern dass du ganz am 
Anfang nur die Hälfte gespeichert bzw. gelesen hast.

Du musst zwischen 'Problem' und 'Symptom' unterscheiden lernen. Was du 
gesehen hast war das Symptom. Dein Problem war aber ein ganz anderes.

von neuling (Gast)


Lesenswert?

hallo,
Mit Stucts habe ich bisher noch nicht gearbeitet,
ich hab 2 Drehencoder einen für die array-nummer 1-19 ist gleichzeitig 
auch die eep-adresse, der andere stellt den wert ein im array.
Die eep-werte weiss ich vorher nicht wird über den Drehencoder 
eingestellt daher weiss ich auch nicht wie ich die eep-adresse mit dem 
struct einstellen kann.

ich habs jetzt so meine werte werden auch gespeichert, nun kommen 
allerdings 2 warnings:
passing argument 2 of 'eeprom_write_block' makes pointer from integer
without a cast
passing argument 2 of 'eeprom_read_word' makes pointer from integer 
without a cast


mfg
1
signed int Wert[19]; 
2
int b = 0x20;           //eep-adresse
3
Wert[1] = -20; 
4
Wert[8] = -18; 
5
6
        
7
          
8
          eeprom_write_word(Wert, b, sizeof(Wert));
9
         
10
11
12
          Wert[i]=eeprom_read_word(Wert, b, sizeof(Wert));

von Karl H. (kbuchegg)


Lesenswert?

neuling schrieb:
> hallo,
> Mit Stucts habe ich bisher noch nicht gearbeitet,

dann lass sie weg.


> ich habs jetzt so meine werte werden auch gespeichert, nun kommen
> allerdings 2 warnings:
> passing argument 2 of 'eeprom_write_block' makes pointer from integer
> without a cast
> passing argument 2 of 'eeprom_read_word' makes pointer from integer
> without a cast
>
>
> mfg
>
>
1
> signed int Wert[19];
2
> int b = 0x20;           //eep-adresse
3
> Wert[1] = -20;
4
> Wert[8] = -18;
5
> 
6
> 
7
> 
8
>           eeprom_write_word(Wert, b, sizeof(Wert));
9
> 
10
> 
11
> 
12
>           Wert[i]=eeprom_read_word(Wert, b, sizeof(Wert));
13
> 
14
> 
15
>

wie passt diese 'Code' zu einer Fehlermeldung die über eine Funktion 
eeprom_write_block spricht? Richtig. Gar nicht.

* Möglichkeit 1
1
int Wert[0];
2
int Wert_Eeprom[19] EEMEM;
3
4
// nur einen einzelnen Wert aus dem Array im EEPROM transferieren
5
int readWert(uint8_t index)
6
{
7
  return (int)eeprom_read_word((uint16_t*)&Wert_Eeprom[index]);
8
}
9
10
void writeWert( uint8_t index, int Wert )
11
{
12
  eeprom_write_word( (uint16_t*)&Wert_Eeprom[index], (uint16_t)Wert );
13
}
14
15
int main()
16
{
17
  ....
18
19
  Wert[0] = readWert( 0 );
20
  Wert[1] = readWert( 1 );
21
22
  ...
23
24
  for( i = 5; i < 15; i++ )
25
    Wert[i] = readWert( i );
26
27
  ...
28
29
  writeWert( 0, Wert[0] );
30
  writeWert( 1, Wert[1] );
31
32
  ...
33
34
  for( i = 8; i < 19; i++ )
35
    writeWert( i, Wert[i] );
36
37
  ...
38
}

* Möglichkeit 2
1
int Werte[19];
2
int Wert_Eeprom[19] EEMEM;
3
4
// alle Werte auf einmal von SRAM ins EEPROM und umgekehrt
5
6
void transferWerteToSRAM()
7
{
8
  eeprom_read_block( Werte,  Wert_Eeprom, sizeof(Werte) );
9
}
10
11
void transferWerteToEEprom()
12
{
13
  eeprom_write_block( Werte,  Wert_Eeprom, sizeof(Werte) );
14
}
15
16
int main()
17
{
18
  ...
19
  transferWerteToSRAM();
20
21
  ...
22
23
  Wert[0] = 876;
24
  Wert[12] = -67;
25
26
  ...
27
28
  transferWerteToEEprom();
29
30
  ...
31
}

* Möglichkeit 3
  Mischen von Mögl. 2 und Mögl. 1
  Am Anfang des Programm werden alle Werte auf einmal ins SRAM
  übertragen. Wird ein Wert verändert, dann wird dieser eine Wert
  und nur dieser eine Wert wieder ins EEprom zurückgeschrieben

von Vlad T. (vlad_tepesch)


Lesenswert?

neuling schrieb:
> ich habs jetzt so meine werte werden auch gespeichert, nun kommen
> allerdings 2 warnings:
> passing argument 2 of 'eeprom_write_block' makes pointer from integer
> without a cast
> passing argument 2 of 'eeprom_read_word' makes pointer from integer
> without a cast

das wird auch nicht funktionieren
du hast ein array mit intwerten (2 byte breit)
und du indizierst einen Byte-Addressierten Speicher mit den in deimem 
Wert enthaltenen fortlaufenden Adressen
das eeprom-Layout sieht also folgender maßen aus:
1
Byte   1 2 3 4 5 6 7 8 9 ...
2
Daten  [ 0][ 1][ 2][ 3]  ...
3
4
Du beschreibst aber so:
5
Byte   1 2 3 4 5 6 7 8 9 ...
6
Daten  [ 0]
7
         [ 1]
8
           [ 2]
9
             [ 3]  ...
Deine geschriebene Werte überlappen sich.

MAch es vernünftig.
Leg eine eeprom-Variable ab und beschreib diese, so wie ich es oben 
geschrieben habe.
1
int EEMEM g_eepromWert[19]; // this reserves place in eeprom
2
int       g_Wert[19]; // this holds the working copy 
3
4
5
// am Prgrammbegin einlesen:
6
eeprom_read_block (g_Wert, g_eepromWert, sizeof (g_eepromWert));
7
8
9
// arbeiten ganz normal auf dem ram array (g_Wert)
10
11
12
13
// und irgendwann zurückschreiben
14
eeprom_write_block (g_Wert, g_eepromWert, sizeof (g_eepromWert));
15
16
17
sollen wirklich einzelne WErte geschrieben werden, kann man das genauso machen
18
int indxex;
19
int wert;
20
eeprom_read_block ( &wert, &(g_eepromWert[index]), sizeof (wert));
21
eeprom_write_block ( &wert, &(g_eepromWert[index]), sizeof (wert));

von neuling (Gast)


Lesenswert?

erstmal vielen Dank an ihnen,
ich habe jetzt noch eine Frage,ich möchte gerne die eeprom schreib und 
lese routine in eine Funktion legen, doch leider kommt ein error und 2 
warnings beim block lesen und schreiben.
vielleicht kann mir von ihnen noch ein tipp geben.
mfg
1
// Block aus dem EEPROM lesen
2
int EEPReadBlock(uint16_t adress,int array)
3
{
4
  return (int)eeprom_read_block(array,(uint16_t *)&adress, array);
5
}
6
7
// Block in das EEPROM schreiben
8
void EEPWriteBlock(uint16_t adress, int array)
9
{
10
  eeprom_write_block(array,(uint16_t *)&adress, sizeof (array));
11
}
12
13
Aufruf zum lesen
14
EEPReadBlock(0x20,int Wert);
15
16
Aufruf zum schreiben
17
EEPWriteBlock(0x20,int Wert);

von Patrick (Gast)


Lesenswert?

neuling schrieb:
> Aufruf zum lesen
> EEPReadBlock(0x20,int Wert);

Naja, DAS kann ja nicht gehen... Mehr verrat' ich nicht, da Du uns ja 
auch nicht die Fehlermeldungen verraten willst :-P

von neuling (Gast)


Lesenswert?

die Fehlermeldung lautet:

EEPReadBlock:
passing argument 2 of 'eeprom_write_block' makes pointer from integer
without a cast
invalid use of void expression

EEPWriteBlock:
passing argument 2 of 'eeprom_write_block' makes pointer from integer
without a cast

mfg

von Karl H. (kbuchegg)


Lesenswert?

neuling schrieb:

> vielleicht kann mir von ihnen noch ein tipp geben.

Ja.
Warum versuchst du schon wieder dein eigenes Süppchen zu kochen, wenn du 
nichts davon verstehst?
Kauf dir ein C-Buch und arbeite es durch. Irgendwann wird dir der 
Unterschied zwischen Adressen und 'Wert an einer Adresse' unterkommen 
und dann arbeitest du die im Buch angegebenen Übungen besonders 
sorgfältig durch. So jedenfalls macht das momentan überhaupt keinen 
Sinn. Du schreibst einfach irgendwas hin und hoffst, das das richtige 
schon dabei sein wird.

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.