Forum: Mikrocontroller und Digitale Elektronik Atmega32 speicher


von Hans (Gast)


Lesenswert?

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.

von Rudi, der Dampfnilp (Gast)


Lesenswert?

Dafuer hat er EEPROM

von H.Joachim S. (crazyhorse)


Lesenswert?

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.

von Tlol (Gast)


Lesenswert?

In einen ROM (read-only memory) kann man nichts speichern, nur lesen.

von Moritz M. (avrprogger)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

danke Moritz :)

von Hans (Gast)


Lesenswert?

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
von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von Hans (Gast)


Lesenswert?

Ich ruf den Befehl jetzt nurnoch bei jeder änderung auf und es 
funktioniert, danke!

von Uwe (de0508)


Lesenswert?

Hans,

wir die Versorgungsspannung Vcc vor dem Beschreiben des EEprom überwacht 
?

von Hans (Gast)


Lesenswert?

Ne die ist Konstante 5V wiso?

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.