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?
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?
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?
Schreibe doch die eingestellten Werte direkt nach dem Eingeben. Wenn du das 100000-mal gemacht hast, brauchst du sowieso neue Tasten.
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.
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.
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.
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 :-)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.