Atmega32 speicher

#3693035
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
Gast #3693139
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
}
(Firma: Schweigstill IT) Persönliche Seite #3693174
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.
#3693520
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren