Hat der Atmega32 einen Rom speicher? Wenn ja wie kann man dort Werte von Variabeln drauf speicher. Ich hab ein Spiel gemacht und würde dort gerne den Rekord speicher, so dass er bei der Initaliesierung wieder aufgerufen werden kann.
In einem "ROM" kann man dem Namen nach nichts speichern :-) Es ist ein flash, bei manchen AVRs kann man da was schreiben, bei andern nicht. Die einfachste Variante: jeder AVR hat auch ein EEPROM. Nimm das, genau für solche Sachen gedacht.
Moin, die Atmega Controller haben einen EEPROM. Den kannst du benutzen um Variablen dauerhaft zu speichern. Z.B.
1 | #include <avr/eeprom.h> |
2 | |
3 | #define EEPROM __attribute__((section(".eeprom")))
|
4 | |
5 | int EEPROM x = 3; |
und dann gibt es noch spezielle FUnktionen um Variablen zu beschreiben und zu lesen. z.B.
1 | eeprom_read_byte(&Var); |
2 | eeprom_read_word(&Var); |
3 | eeprom_write_byte(&Var, Val); |
4 | eeprom_write_word(&Var, Val); |
Moritz
ich habs jetzt so. Es funktioniert so halb. Nach abschalten ist x entweder a oder 255. Sieht jemand mein fehler?
1 | uint8_t a EEMEM = 123; |
2 | unsigned char x; |
3 | unsigned char S1; |
4 | unsigned char S1_alt; |
5 | unsigned char S2; |
6 | unsigned char S2_alt; |
7 | |
8 | char Buffer[20]; |
9 | |
10 | int main(void) |
11 | {
|
12 | |
13 | DDRB = 0; //INPUT |
14 | DDRA = 255; //OUTPUT |
15 | // Initialisierung des LCD
|
16 | // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken
|
17 | // verschwunden sein
|
18 | lcd_init(); |
19 | |
20 | x = eeprom_read_byte(&a); //lesen |
21 | lcd_string("Hallo"); |
22 | |
23 | |
24 | while(1) |
25 | {
|
26 | |
27 | S1 = PINB&15; |
28 | S2 = PINB&240; |
29 | |
30 | if((S1 > 0) && (S1_alt == 0)) |
31 | {
|
32 | x += S1; |
33 | }
|
34 | |
35 | if((S2 > 0) && (S2_alt == 0)) |
36 | {
|
37 | x--; |
38 | }
|
39 | |
40 | S1_alt = S1; |
41 | S2_alt = S2; |
42 | PORTA = x; |
43 | |
44 | |
45 | lcd_setcursor( 0, 2 ); |
46 | lcd_string("Wert = "); |
47 | lcd_setcursor(7, 2 ); |
48 | itoa( x, Buffer, 10 ); |
49 | lcd_string(Buffer); |
50 | |
51 | eeprom_write_byte(&a, x); // schreiben |
52 | |
53 | }
|
54 | }
|
:
Bearbeitet durch User
Ein ganz gewaltiger Fehler besteht darin, eeprom_write_byte() mit voller Geschwindigkeit zyklisch aufzurufen. EEPROMs vertragen nämlich nur eine sehr begrenzte Zahl von Lösch-/Schreibzyklen. Bei den AVRs werden ca. 100.000 Zyklen garantiert, die Du mit Deinem obigen Programm innerhalb von Minuten oder wenigen Stunden erreichst. Seit einiger Zeit gibt es die Funktionen eeprom_update_byte() usw., bei denen ein Schreibzyklus nur dann erfolgt, wenn sich der Dateninhalt der betreffenden Speicherzelle(n) wirklich ändern würde. Bei Deiner Tastenabfrage fehlt auch die Entprellung. Vermutlich ist sie hier nur deswegen nicht allzu relevant, weil die LCD-Zugriffe länger dauern als die Prellzeit.
Ich ruf den Befehl jetzt nurnoch bei jeder änderung auf und es funktioniert, danke!
Hans, wir die Versorgungsspannung Vcc vor dem Beschreiben des EEprom überwacht ?
Hans schrieb: > Ne die ist Konstante 5V wiso? Wegen dem hier > .... Nach abschalten ..... D.h. du hast den µC den Saft abgedreht. Wenn die Versorgungsspannung einbricht, während der µC gerade den EEPROM beschreibt, dann ist nicht vorhersehbar was da passiert. Im Momment umgehst du das, weil du nur dann schreibst, wenn sich der Wert auch tatsächlich ändert. Die Wahrscheinlichkeit des zeitlichen Zusammentreffens eines Tastendrucks und des Einbrechens der Versprungsspannung ist in deinem jetzigen Programm praktisch 0. Daher funktioniert es. In der alltagstauglichen Programmierung (zb beim Speichern von Messwerten) muss man aber auch damit rechnen, das es diesen Fall gibt: das der Strom just in dem Moment ausfällt, in dem der µC den letzten Messwert im EEPROM speichern will. Dazu gibt es die Brown Out Fuse. UNbedingt auf den höchsten Spannungswert hochstellen! Dann stellt der µC die Arbeit ein, noch ehe die Spannung weit genug gefallen ist um Fehlfunktion auszulösen.
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.