mikrocontroller.net

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


Autor: eule (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Stefan Weßels (swessels)
Datum:

Bewertung
0 lesenswert
nicht 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:
  for(k=0;k<=200;k++)
  {
    eeprom_write_word(&daten[k],0xffff);    //EEPROM löschen
  }

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

Gruß,
Stefan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.