Forum: Mikrocontroller und Digitale Elektronik Einstellung im EEPROM speichern


von Kater Sylvester (Gast)


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?

von Christian H. (christian_h)


Lesenswert?


von Kater Sylvester (Gast)


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?

von Christian H. (christian_h)


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?

von Tip (Gast)


Lesenswert?

Schreibe doch die eingestellten Werte direkt nach dem Eingeben. Wenn du 
das 100000-mal gemacht hast, brauchst du sowieso neue Tasten.

von Sam .. (sam1994)


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.

von Kater Sylvester (Gast)


Lesenswert?

Samuel K. schrieb:
> Mit adc oder Komperator auf Vcc > 4.5V prüfen, sollte als Erkennung
> reichen.

Der Komparator müsste dann einen Interrupt auslösen.

von Thomas E. (thomase)


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.

von Thomas E. (thomase)


Lesenswert?

Thomas Eckmann schrieb:
> und

nicht und sondern oder.

mfg.

von Kater Sylvester (Gast)


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  :-)

von Sascha W. (sascha-w)


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

von Uwe (Gast)


Lesenswert?

am besten vorm Spannungsregler mit nem spannungsteiler prüfen. So das 
noch nen paar Volt Hub da sind.. Dann kann man bei gegebenem 
Stromverbrauch ausrechnen wie Gr0ß der Kondensator sein muß.

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.