Forum: Mikrocontroller und Digitale Elektronik probleme mit auslesen des EEPROM bei Atmega 32


von eule (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin gerade mal wieder am verzweifeln.
Ich versuche das interen EEPROM des Atmega 32 zu beschreiben. Und zwar 
habe ich dazu ein Array auf dem EEPROM angelegt das Messwerte des AD 
Wandlers aufnehmen soll. Die Werte sollten ja auch nach Spannungsausfall 
erhalten bleiben, sodass ich die bei einem "Neustart" wieder einlesen 
kann.
Mein Programm soll den Wert beim Starten den ersten Wert aus dem EEPROM 
auslesen und auf dem Display ausgeben. Dann soll das komplette Array 
gelöscht werden und ein neuer Wert über den AD Wandler gewandelt werden 
und in das EEPROM gespielt werden.
2. Schritt klappt soweit. Ich wandle einen Wert, schreib den ins Array 
und geb ihn direkt im Anschluss wieder auf dem Display aus (aus dem 
Array gelesen). Mach ich aber jetzt einen "Neustart" bekomme ich nicht 
den zuvor gewandelten Wert sondern irgendwas X beliebiges, meist jedoch 
0xFFFF.
Hat einer von euch ne Ahnung woran das liegen könnte?

Hier das komplette Programm und im anhang die EEPROM datei:

#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <avr/signal.h>
#include "NokiaLCD.c"
#include "NokiaLCD.h"


char string[20];      //Für Zeichenwandlung Float -->Sring
unsigned int daten[200] EEMEM;


// ************ AD Wandlung **********************
// Einzelwandlung
//************************************************

unsigned int adw (char kanal)
{
  unsigned int erg =0;
  ADMUX=0b11000000 + kanal;    // Kanal 0 des AD
  ADCSRA|=(1<<ADEN);        // AD Wandler einstellen
  ADCSRA|=(1<<ADSC);        // Dummy Readout
  while (ADCSRA & (1<<ADSC));    //Ende der Wandlung abwarten
  erg = ADCW;            //Auslesen
  erg=0;

  for (unsigned char i=0; i<32;i++)    //Eigentliche Wandlung: 32 
Messwerte nehmen und Mittelwert Bilden
  {
    ADCSRA|=(1<<ADSC);
    while (ADCSRA & (1<<ADSC));
    erg += ADCW;        //Aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);
  return (erg/32);
}


main()
{
  unsigned char k=0;
  unsigned int Spannung;
  unsigned int Spannung1;

  LcdInit();


    Spannung = eeprom_read_word(&daten[0]);    //Werte nach anlegen der 
Spannung
    LcdGotoXY(1,1);                // aus EEPROM lesen und am Display 
ausgeben
    LcdStr( FONT_1X,dtostrf(Spannung,1,0,string) );
    LcdUpdate();


  for(k=0;k<=200;k++)
  {
    eeprom_write_word(&daten[k],0xffff);    //EEPROM löschen
  }


    Spannung = adw(0);              //eine Wanldung durchführen
    eeprom_write_word(&daten[0],Spannung);      //aktuellen Wert ins 
EEPROM schreiben
    LcdGotoXY(1,1);
    LcdStr( FONT_1X,dtostrf(Spannung,1,0,string) );//aktuelle Spannung 
an Display ausgeben

    LcdGotoXY(1,2);
    Spannung1=eeprom_read_word(&daten[0]);      //aktuellen Wert aus 
EEPROM holen
    LcdStr( FONT_1X,dtostrf(Spannung1,1,0,string) ); //und am Display 
ausgeben
    LcdUpdate();

  while(1);
}

von Stefan W. (swessels)


Lesenswert?

Moin,

>Mach ich aber jetzt einen "Neustart" bekomme ich nicht
>den zuvor gewandelten Wert sondern irgendwas X beliebiges, meist jedoch
>0xFFFF.

Vielleicht daran, dass Du beim initialisieren 0xFFFF ins EEPROM 
schreibst?
Siehe Dein Codeschnipsel:
1
  for(k=0;k<=200;k++)
2
  {
3
    eeprom_write_word(&daten[k],0xffff);    //EEPROM löschen
4
  }

Das löschen des EEPROM ist nicht nötig, das erledigt die Routine aus 
eeprom.h für Dich.

Gruß,
Stefan

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.