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);
}
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.