Einstellung im EEPROM speichern

Gast #2145452
Lesenswert?

Hallo,
ich habe ein kleines Gerät mit einem ATmega128 modifiziert.
Jetzt möchte ich die Eingestellten Werte irgendwie im EEPROM speichern, 
damit sie beim nächsten Einschalten wieder da sind und ich den ganzen 
Kram nicht wieder mit 4 Tasten eingeben muss.
Insgesamt sind das 8 Byte.
Wie kann man das in C schreiben?
Hat das so schon mal jemand hier gemacht?
Gast #2145467
Lesenswert?

Christian H. schrieb:
> Hier solltest du alles finden:
> http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Oh, danke!

Das Eeprom hält nur so 100000 Schreibzyklen.
Vieleicht sollte man nur schreiben, wenn die Versorgungsspannung gerade 
zusammenbricht?!
Oder ist die Idee blöd?
Merkt der µC wenn die Versorgungsspannung gerade zusammenbricht, oder 
braucht er da externe Hardware die beim zusammenbrechen der Versorgung 
einen Interrupt auslöst?
#2145479
Lesenswert?

Wenn die Versorgungsspannung zusammenbricht, dürfte der µC es erst 
merken, wenn es zu spät ist. Das mit der extra-Hardware dürfte gehen, 
aber ich würde mich nicht drauf verlassen, dass der dann alles immer 
korrekt noch ausführt, besonders, da die Spannung wohl schneller weg 
ist, als der µC.

Was macht denn dein Gerät, wie oft und wann müsste denn das EEPROM 
beschrieben werden?
#2145491
Lesenswert?

Christian H. schrieb:
> Wenn die Versorgungsspannung zusammenbricht, dürfte der µC es erst
> merken, wenn es zu spät ist.

Dafür gibt es Kondensatoren. Wichtig ist, sobald die Stromversorgung 
zusammenbricht, müssen alle Stromziehenden Module auf der Platine 
abgeschaltet werden, sonst muss je nach dem ein riesenelko her.

Mit adc oder Komperator auf Vcc > 4.5V prüfen, sollte als Erkennung 
reichen.
#2145538
Lesenswert?

Kater Sylvester schrieb:
> Insgesamt sind das 8 Byte.
> Wie kann man das in C schreiben?
> Hat das so schon mal jemand hier gemacht?

Du schreibst in dein EEPROM nur dann neue Werte, wenn die sich geändert 
haben. D.h. du liest erst das EEPROM und schreibst dann den ggf. neuen 
Wert rein. Und das machts du dann in einer Schleife, 1 Mal pro Sekunde 
und irgendwas anderes sinnvolles.

Die 100.000 Zyklen gelten nur für das Schreiben, genau genommen für das 
Löschen vor dem Schreiben. Lesen kannst den, bis du schwarz wirst.


mfg.
Gast #2146687
Lesenswert?

1
while(1)
2
{
3
  Tasten_alt = Tasten;
4
  Tasten = PINB & 0x3F;
5
  if(Tasten_alt == 0)
6
  {
7
    if(Tasten != 0)
8
    {
9
      Offset = 1;
10
      for(unsigned char n = 79 - Curpos;n;n--) Offset *= 10;
11
    }
12
    if(Tasten == Down_Taste)
13
    {
14
      Frequenz -= Offset;
15
      if(Frequenz > Max_Frequenz) Frequenz = 0;
16
      eeprom_write_block(&Frequenz,&ee_Frequenz,sizeof(Frequenz));
17
    }
18
    if(Tasten == Up_Taste)
19
    {
20
      Frequenz += Offset;
21
      if(Frequenz > Max_Frequenz) Frequenz -= Offset;
22
      else eeprom_write_block(&Frequenz,&ee_Frequenz,sizeof(Frequenz));
23
    }
24
    if(Tasten == Rechts_Taste)
25
    {
26
      Curpos++;
27
      if(Curpos > 79) Curpos = 68;
28
    }
29
    if(Tasten == Links_Taste) //Out
30
    {
31
      Curpos--;
32
      if(Curpos < 68) Curpos = 79;
33
    }
34
    if(Tasten != 0)
35
    {
36
      Set_DDS_Freq(Frequenz);
37
      LCD_Anzeige_Frequenz(pos2,Frequenz);
38
      LCD_Instruction(Curpos | 0x80);
39
    }
40
  }
41
}
Juhu  :-)
#2146856
Lesenswert?

die Methode würde ich nicht einsetzen, denn die speichert ja nicht nur 
die zuletzt gewählte Frequenz - was deine Absicht ist, sondern auch alle 
Zwischenschritte um diese beim Einstellen zu erreichen!

folgender Vorschlag ...
1
int savecnt=0;
2
while(1)
3
{
4
  Tasten_alt = Tasten;
5
  Tasten = PINB & 0x3F;
6
  if(Tasten_alt == 0)
7
  {
8
    if(Tasten != 0)
9
    {
10
      Offset = 1;
11
      for(unsigned char n = 79 - Curpos;n;n--) Offset *= 10;
12
    }
13
    if(Tasten == Down_Taste)
14
    {
15
      Frequenz -= Offset;
16
      if(Frequenz > Max_Frequenz) Frequenz = 0;
17
      savecnt=10000;
18
    }
19
    if(Tasten == Up_Taste)
20
    {
21
      Frequenz += Offset;
22
      if(Frequenz > Max_Frequenz) Frequenz -= Offset;
23
      else savecnt=10000
24
    }
25
    if(Tasten == Rechts_Taste)
26
    {
27
      Curpos++;
28
      if(Curpos > 79) Curpos = 68;
29
    }
30
    if(Tasten == Links_Taste) //Out
31
    {
32
      Curpos--;
33
      if(Curpos < 68) Curpos = 79;
34
    }
35
    if(Tasten != 0)
36
    {
37
      Set_DDS_Freq(Frequenz);
38
      LCD_Anzeige_Frequenz(pos2,Frequenz);
39
      LCD_Instruction(Curpos | 0x80);
40
      if (savecnt > 0) {
41
          savecnt--;
42
          if (savecnt = 0) {
43
              eeprom_write_block(&Frequenz,&ee_Frequenz,sizeof(Frequenz));
44
          }
45
      }
46
    }
47
  }
48
}

... speichert den letzten Wert immer zeitversetzt, die 10000 
entsprechend anpassen

Sascha

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren