Forum: Compiler & IDEs eeprom_update_word() funktioniert nicht.


von rufus357 (Gast)


Lesenswert?

Hallo,
die Funktion eeprom_wriet_word() funktioniert nicht. Nach dem lesen der 
Flags wird in diesem Fall nur das Bit "Erststart" in der Struktur "bit" 
auf 0 gesetzt und anschließend ins EEPROM geschrieben. Im EEPROM steht 
nach dem zurückschreiben der geänderter Struktur (Wert vorher 0x005C 
nacher 0x0054) immer noch 0x005C. Selbst wenn ich im Single Step das 
Programm durchlaufe, so daß das EEPROM genügend Zeit hat um 
schreibbereit zu sein funktioniert die Funktion nicht.

Kann mir hierbei jemand weiterhelfen?
Vielen Dank schon mal.

Gruß
Rufus357
1
volatile struct uint16_t
2
{
3
  unsigned int bfrei_5:1;      
4
  unsigned int BetrArt:2;      
5
  unsigned int Erststart:1;    
6
  unsigned int SMS_by_Call:1;    
7
  unsigned int Rel_EA_Al:2;    
8
  unsigned int Relaisstatus:1;  
9
  unsigned int bfrei_1:1;      
10
  unsigned int bfrei_2:1;      
11
  unsigned int bfrei_3:1;      
12
  unsigned int bfrei_4:1;      
13
  unsigned int GSM_aktiv:1;    
14
  unsigned int NoCarrier:1;    
15
  unsigned int Ring:1;      
16
  unsigned int GSM_error:1;
17
}bit;
18
19
int main(void)
20
{
21
  StatCarrier = 0;
22
  init();   
23
  usart_init();            
24
  init_Int0();          
25
  GSM_OFF();              
26
27
  ptr_flags = &bit;          
28
  *ptr_flags = (eeprom_read_word(&eeFlags) & 0x00FF);  //Flags aus EEPROM lesen
29
30
  if (bit.Erststart ==1)    
31
  {              //unkontrolierte Kalibrierung nach Programierung verhinden.
32
    bit.Erststart = 0;
33
    _delay_ms(20);
34
    eeprom_write_word(&eeFlags, *ptr_flags); //Flags sichern;
35
    while(1){;}
36
  }
37
.
38
.
39
.

von xfr (Gast)


Lesenswert?

> volatile struct uint16_t

Zunächst mal ist der Name "struct uint16_t" ziemlich ungeschickt 
gewählt. Das ist vermutlich nicht, was Du wolltest. Mach daraus lieber 
"struct flags" oder sowas. Ob das volatile an der Stelle wirkt, wäre ich 
mir auch nicht so sicher.

> *ptr_flags = (eeprom_read_word(&eeFlags) & 0x00FF);

Warum maskierst Du hier die oberen 8 Bit aus? Das könnte zu Problemen 
führen, weil die Reihenfolge der Bits Sache des Compiler ist. Eventuell 
triffst Du genau die falschen.

von Oliver S. (oliverso)


Lesenswert?

Bitte poste den kompletten kompilierbaren Quelltext.

Oliver

von rufus357 (Gast)


Lesenswert?

Hallo,

>volatile struct uint16_t

ja das wollte ich nicht und habs bereits entfernt. Hat aber nicht das 
Problem gelöst. Ich vermute ich habe den Fehler gefunden. Ich hatte den 
Zeiger nicht "volatile" gemacht.
1
volatile uint16_t *ptr_flags;

So funktioniert es wie's aussieht zuverlässig.
Kann das wirklich die Ursache gewesen sein, oder ist das Zufall?

Entschuldigt, dass ich die Deklaration vergessen habe zu posten. Das 
hätte euch und somit auch mir sicher sehr geholfen.

Danke und Gruß
Rufus357

von Rolf Magnus (Gast)


Lesenswert?

rufus357 schrieb:
> Ich vermute ich habe den Fehler gefunden. Ich hatte den Zeiger nicht
> "volatile" gemacht.
> volatile uint16_t *ptr_flags;

So ist nicht der Zeiger volatile, sondern das, worauf er zeigt.

> So funktioniert es wie's aussieht zuverlässig.
> Kann das wirklich die Ursache gewesen sein, oder ist das Zufall?

Es gibt keinen Grund, warum der obige Code ein volatile benötigen würde. 
Da das aber offensichtlich nicht der komplette Code ist, ist es 
unmöglich, deine Frage zu beantworten.

von rufus357 (Gast)


Lesenswert?

Hallo Magnus,

Danke für den Hinweis. Mit der nachgeschobenen Zeiger Deklaration ist 
das der komplette Code was diesen Fall angeht. Das ist eigentlich eine 
relativ einfache Sache und funktionierte ohne dem volatile vor der 
Zeiger Deklaration auch über einige Entwicklungstage enwandfrei. Bis zum 
3.Dez.. Mit dieser Prozedur möchte ich nur verhindern, dass die 
Bestücker Firma beim programmieren des Prozessors nicht in die 
Kalibrierroutine reinkommt. Also lese ich aus dem EEPROM das 
Erststartbit, lösche dieses, schreibe es wieder ins EEPROM und verharre 
in der nachfolgenden Endlosschleife.

Und wie schon oben geschrieben, funktioniert das seit dem ich die 
Struktur (nicht wie ich angenommen habe den Zeiger) auf volatile gesetzt 
habe.

Danke und Gruß
rufus357

von Rolf Magnus (Gast)


Lesenswert?

Ok, es könnte noch Probleme geben, wenn die Variable zwar volatile ist, 
der Zeiger aber nicht als auf volatile zeigend definiert ist. Der 
Compiler müßte da eigentlich auch warnen.
Es sollte aber auch funktionieren, wenn du überall das volatile 
weglässt.

von Stefan E. (sternst)


Lesenswert?

Rolf Magnus schrieb:
> Es sollte aber auch funktionieren, wenn du überall das volatile
> weglässt.

Aber vermutlich nur mit "-fno-strict-aliasing".

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.