Autor Thema: PIC16F88 schreiben ins EEPROM  (Gelesen 2336 mal)

Offline Nicl

  • Newbie
  • *
  • Beiträge: 14
    • Profil anzeigen
PIC16F88 schreiben ins EEPROM
« am: Februar 20, 2014, 20:08:42 Nachmittag »
Hallo zusammen,
ich hätte ein Problem beim beschreiben des EEPROM. Ich muss insgesamt 24 Werte ins EEPROM schreiben, jeweils 8 auf einmal. Zum testen habe ich auch erstmal nur 8 Werte speichern wollen, wenn das dann funktioniert ist das für die anderen Werte kein Problem mehr.
Da der Controller schon ziemlich voll ist, wollte ich die ganzen Schreibzyklen in eine Schleife packen, die dann 8 mal durchlaufen wird. Die Adressen, auf die im EEPROM geschrieben werden sollen werden dabei einfach bei jedem Durchlauf um 1 erhöht. Die Adressen der Daten beginnen im RAM Speicher ab Adresse 0x20. Für 8 Werte endet das ganze (vorerst) bei Adresse 0x27. Auf diese Adressen zeigt ein Pointer "*werte", der ebenfalls bei jedem Schleifendurchlauf seine gespeicherte Adresse um 1 erhöht.
Das Problem ist jetzt folgendes: Soweit werden auch alle Daten gespeichert mit Ausnahme des ersten Wertes. Hier zeigt mir das LCD nur eine leere Stelle an. Auch beim abschalten und wieder zuschalten der Betriebsspannung fehlt die erste Stelle. Ändere ich die Adresse für die Werte beispielsweise auf den Bereich 0x40 - 0x47 steht nur noch Quatsch im EEPROM (nach Abschalten und wieder einschalten der Betriebspannung).

Hier  die Variablen (global im Headerfile)
int ein1_zehner_stunden = 48;
#locate ein1_zehner_stunden = 0x20
int ein1_einer_stunden = 48;
#locate ein1_einer_stunden = 0x21
int ein1_zehner_minuten = 48;
#locate ein1_zehner_minuten = 0x22
int ein1_einer_minuten = 48;
#locate ein1_einer_minuten = 0x23
int aus1_zehner_stunden = 48;
#locate aus1_zehner_stunden = 0x24
int aus1_einer_stunden = 48;
#locate aus1_einer_stunden = 0x25
int aus1_zehner_minuten = 48;
#locate aus1_zehner_minuten = 0x26
int aus1_einer_minuten = 48;
#locate aus1_einer_minuten = 0x27

Die Deklaration des Pointers auf die Variablen ist nicht global und steht zu Beginn der aufgerufenen Funktion:

int *werte = 0x20;      //Pointer werte zeigt auf die erste Zeit

Hier der Code der ins EEPROM schreiben soll:
      i = 0;
      adressen = 0x00;   //adressen zeigt auf die Adresse 0x00 vom EEPROM
      *werte = &ein1_zehner_stunden;      //Pointer werte zeigt auf die erste Zeit
      for(i = 0; i < 8; i++)
      {
         write_eeprom(adressen,*werte);
         adressen += 1;
         werte += 1;
      }

Dies soll folgenden Code ersetzen der vorher funktioniert hat (aber aufgrund von zuviel benötigen Speicherplatzes entfallen soll):
      write_eeprom(0x00,ein1_zehner_stunden);
      write_eeprom(0x01,ein1_einer_stunden);
      write_eeprom(0x02,ein1_zehner_minuten);
      write_eeprom(0x03,ein1_einer_minuten);
      write_eeprom(0x04,aus1_zehner_stunden);
      write_eeprom(0x05,aus1_einer_stunden);
      write_eeprom(0x06,aus1_zehner_minuten);
      write_eeprom(0x07,aus1_einer_minuten);
Vielen Dank für eure Hilfe!

 


* Recent Topics