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.