Forum: Compiler & IDEs Wert in EEprom speichern


von Wolfgang (Gast)


Lesenswert?

Guten  Tag,
ich habe ein Problem beim Speichern im internen eepromm des atmega128.
und zwar möchte ich einen wert von der sd-card ins eeprom speichern 
leider haut das nicht hin.
Der Wert zb.016 schreibe ich mit dem Pc auf die sd-carte,dann kommt die 
sd-carte ins Mikrocontroller-Board wird auch erkannt,
aber im eeprom steht dann aber 128.
vielleicht kann mir wer weiterhelfen.
1
unsigned char write_romid( char *rom_id,char *rom) 
2
{
3
  unsigned char by,i,s;
4
  unsigned int readbytes;
5
  unsigned int idx;
6
  uint8_t d;
7
  char buffer[50];    
8
9
  
10
  if(Fopen(rom,F_READ)!=F_OK);
11
   {
12
  
13
    for(i=0; i<3; i++)               //3Byte 
14
    {
15
     readbytes=Fread(&by,1);         //Daten lesen
16
     buffer[i]=by;
17
    }
18
  
19
    buffer[i++] = '\0';             //String mit Null abschliessen    
20
    d = buffer[0]*100 + buffer[1] + buffer[2];
21
  
22
    EEPWriteByte( s, d);   
23
    
24
  
25
    Fclose();              //Datei Schliessen 
26
   } 
27
 
28
 
29
 
30
 
31
 
32
}

von Lutz B. (lutzbroszio)


Lesenswert?

Die Varaible "s" ist nicht initialisert.
Du schreibst in das Nirvana.

von Wolfgang (Gast)


Lesenswert?

So auf meiner karte steht der wert 016 den kann ich mir auch af meinen 
Display Ausgen 016

Aber im eeprom steht dann mit PonyProg ausgelesen
HEX     80
Dezimal 128


es sollte aber drin stehen
HEX     10
Dezimal 16


1
unsigned char write_romid( char *rom_id,char *rom) 
2
{
3
  unsigned char by,i,s;
4
  unsigned int readbytes;
5
  unsigned int idx;
6
  uint8_t d;
7
  char buffer[50];    
8
9
  
10
  s=0
11
  if(Fopen(rom,F_READ)!=F_OK);
12
   {
13
  
14
    for(i=0; i<3; i++)               //3Byte 
15
    {
16
     readbytes=Fread(&by,1);         //Daten lesen
17
     buffer[i]=by;
18
    }
19
  
20
    buffer[i++] = '\0';             //String mit Null abschliessen    
21
    d = buffer[0]*100 + buffer[1] + buffer[2];
22
  
23
    EEPWriteByte( s, d);   
24
    
25
  
26
    Fclose();              //Datei Schliessen 
27
   } 
28
 
29
 
30
 
31
 
32
 
33
}

von Wolfgang (Gast)


Lesenswert?

Scheinbar kann mir keiner Weiterhelfen
mfg

von Lutz B. (lutzbroszio)


Lesenswert?

Wie sieht denn deine Schreib- und Leseroutine fürs Abreiten mit dem 
EEPROM aus?

von Wolfgang (Gast)


Lesenswert?

Ich nutze die Routinen aus der Lib #include <avr/eeprom.h>

Wenn ich zb einen Wert an speicheradresse null schreibe geht das
EEPWriteByte( 0, 20);

Wiegesagt auf der speicherkarte steht der Wert 016 in Dezimal mit dem Pc 
erstellt.
Ich kann den Wert auch auf dem Display anzeigen
aber der Wert will einfach nich ins eeprom

1
unsigned char write_romid( char *rom_id,char *rom) 
2
{ unsigned char by,i,s; 
3
unsigned int readbytes;
4
 unsigned int idx; 
5
uint8_t d;
6
 char buffer[50]; 
7
s=0 
8
if(Fopen(rom,F_READ)!=F_OK); 
9
{
10
 for(i=0; i<3; i++) //3Byte 
11
{ 
12
 readbytes=Fread(&by,1); //Daten lesen 
13
 buffer[i]=by; 
14
} 
15
buffer[i++] = '\0'; //String mit Null abschliessen
16
 d = buffer[0]*100 + buffer[1] + buffer[2]; 
17
EEPWriteByte( s, d); 
18
Fclose(); //Datei Schliessen
19
 }
20
}

von amateur (Gast)


Lesenswert?

Bist Du Dir eigentlich sicher, dass Deine Sequenz überhaupt durchlaufen 
wird?
Ich habe keine Ahnung, was der Compiler mit if (...); (direkt gefolgt 
von einem Semikolon) macht.

Ich kenne ja Dein Fopen nicht, wenn sie aber von mir wäre, müsste der
Aufruf: "if(Fopen(rom,F_READ)==F_OK)" lauten.

Ein einfacher Test wäre: Alles ausklammern und nur:
EEPWriteByte(0, 16);
übrig lassen.

von Karl H. (kbuchegg)


Lesenswert?

Wolfgang schrieb:


>     d = buffer[0]*100 + buffer[1] + buffer[2];

prinzipiell erst mal:
   d = buffer[0]*100 + buffer[1]*10 + buffer[2];
                                ###


Aber!
stehen in buffer eigentlich ASCII Zeichen oder ist das schon binär?

Wenn ASCII dann

   d = ( buffer[0]-'0' ) * 100 +
       ( buffer[1]-'0' ) *  10 +
       ( buffer[2]-'0' );


aber warum so kompliziert und selber rechnen. Du hast dir ja vorher 
schon ein abschliessendes '\0' Zeichen reingemacht, um einen gültigen 
String zu erhalten. atoi ist mehr als glücklich, wenn du ihm diesen 
String vorwerfen würdest und es dir die zugehörige Zahl dazu nennen darf


    d = atoi( buffer );



Wenn du nicht verstehst was, wann und warum in deinem Programm vor sich 
geht, dann musst du dir eben Zwischenergebnisse irgendwo ausgeben 
lassen, damit du genau das siehst. Zb. wie sich Werte aus anderen Werten 
zusammensetzen. Es ist ein Trugschluss, dass man gerade als Anfänger 
ohne Ausgabemöglichkeit auskommt. Ein LCD oder ein Terminal an einer 
UART leistet unschätzbare Dienste und Hilfen beim Debuggen eines 
Programms.

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.