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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.