Forum: Mikrocontroller und Digitale Elektronik EEPROM ATMega88p


von Fox82 (Gast)


Lesenswert?

Hallo Zusammen,

ihr könnt mir sicherlich weiterhelfen:

ich habe den Code unten, bei Knopfdruck PIND2 sollte den Wert 1023 in 
das eeprom Register EPR_Modus geschrieben werden. Wenn der Controller 
anschliessend wieder angeschaltet wird, dann sollte dieser Wert im 
eeprom in die Variable DIM_value übernommen werden. Also nicht mehr 200 
wie definiert sondern 1023.

Leider klappt es nicht, was mach ich falsch? Danke für die Hilfe.

Gruss Fox82
1
 
2
3
4
int EPR_Modus EEMEM;
5
int DIM_value = 200;
6
7
8
int main (void) {   
9
10
DIM_value = eeprom_read_byte(&EPR_Modus);
11
12
while(1){    
13
if ( !(PIND & (1<<PIND2)) ){
14
DIM_value = 1023;
15
      // Speichern des Wertes im eeprom
16
      eeprom_write_byte(&EPR_Modus, DIM_value);
17
_delay_ms(2000);
18
}
19
20
OCR1A = DIM_value;
21
22
}
23
}

von Sauger (Gast)


Lesenswert?

Mahlzeit,

>DIM_value = eeprom_read_byte(&EPR_Modus);
>eeprom_write_byte(&EPR_Modus, DIM_value);

wenn du mir verrätst wie man in einem Byte (8 Bit) 10 Bit (1023) 
Unterbringt, gibt es zur Belohnung eine Dose Thunfisch.

MfG

von Fox82 (Gast)


Lesenswert?

Ganze Zahlen?

von Helfer (Gast)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
4
uint16_t EPR_Modus EEMEM = 200;
5
uint16_t DIM_value;
6
7
int main (void) 
8
{   
9
  DIM_value = eeprom_read_word(&EPR_Modus);
10
11
  while(1) {    
12
    if( !(PIND & (1<<PIND2)) ) {
13
      if ( DIM_value != 1023 ) {
14
        DIM_value = 1023;
15
        // Speichern des Wertes im eeprom
16
        while ( !eeprom_is_ready() ) {}
17
        eeprom_read_word(&EPR_Modus, DIM_value);
18
      }
19
    }
20
    OCR1A = DIM_value;
21
  }
22
}

von Helfer (Gast)


Lesenswert?

Mit Copy & Paste :(

        while ( !eeprom_is_ready() ) {}
        eeprom_write_word(&EPR_Modus, DIM_value);
               ^^^^^

von Fox82 (Gast)


Lesenswert?

Klasse, es funktioniert! Vielen Dank.

von Fox82 (Gast)


Lesenswert?

Habe trotzdem noch eine Frage:
Es wird ja jetzt immer an der gleichen Stelle vom EEPROM geschrieben, 
daher es hält ja 100'000 Schreib / Lesezyklen aus. Kann man unendlich 
Lesen, oder bezieht sich das nur auf das Schreiben?

Könnte man den Speicherort Randomisieren?

von Helfer (Gast)


Lesenswert?

Die typ. Anzahl der Zugriffe im Datenblatt beziehen sich aufs Schreiben 
und Löschen, nicht aufs reine Lesen.

Klar kannst du durch geschickte Programmierung das EEPROM schonen. Z.B. 
wie oben, nur Schreiben, wenn das Ziel den Wert noch nicht enthält.

Oder du nutzt aus, dass das gelöschte EEPROM definierte Werte (0xFF) 
enthält und du andere Werte reinschreibst. Stößst du beim Durchsuchen 
des EEPROMs auf den ersten ungelöschten Wert, könnte das z.B. dein 
zuletzt geschriebener Wert sein.

Es gibt sicher noch mehr Verfahren. I.d.R. gibt es auch Appnotes dazu.

von spess53 (Gast)


Lesenswert?

Hi

>Es gibt sicher noch mehr Verfahren. I.d.R. gibt es auch Appnotes dazu.

http://www.atmel.com/dyn/resources/prod_documents/doc2526.pdf
http://www.atmel.com/dyn/resources/prod_documents/avr100.zip

MfG Spess

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.