Hallo! Ich möchte Messdaten im EEPROM des ATMEGA8 ablegen. Wenn ich diese allerdings nach dem Schreibvorgang zurücklese und vergleiche stimmen, dann stimmen die Werte nicht überein. Wenn ich den EEPROM über PonyProg zurücklese ist er jungfreulich (0xFF). Die verwendeten Routinen habe ich direkt aus dem Datenblatt entnommen und lediglich durch die Abschaltung der Interrupts erweitert: ;+---------------------------------------------+ ;| EEPROM_read | ;+---------------------------------------------+ ; Input: XH, XL (AdrH, AdrL) ; Output: Tmp1 (data) EEPROM_read: sbic EECR,EEWE ; Wait for completion of prev. write rjmp EEPROM_read out EEARH, XH ; Set address out EEARL, XL sbi EECR, EERE ; Start eeprom read in Tmp1, EEDR ; Read data from data register ret ;+---------------------------------------------+ ;| EEPROM_write | ;+---------------------------------------------+ ; Input: XH, XL (AdrH, AdrL), Tmp1 (data) ; Output: none EEPROM_write: sbic EECR,EEWE ; Wait for completion of prev. write rjmp EEPROM_write out EEARH, XH ; Set address out EEARL, XL out EEDR, Tmp1 ; Write data (Tmp1) to data register cli ; disable IR sbi EECR,EEMWE ; enable eeprom read sbi EECR, EEWE ; Start eeprom read sei ret Bei der Simulation im AVR-Studio (V4.13) läuft alles wunderbar. Bei der Initialisierung wird der erste freie Platz im EEPROM (0xFF) gefunden und ab dieser Adresse das EEPROM Byte für Byte gefüllt! Nur auf dem realen Käfer scheint der EEPROM absolut unberührt zu bleiben. Habe auch bereits alle Foren hier, welche irgendetwas mit EEPROM zu tun haben, durchfortet, aber nichts gefunden was mir weiterhilft: - Stack Pointer ist korrekt initialisiert - BODEN fuse habe ich ausprobiert (obwohl Versorgung stabil) - EESAVE fuse habe ich ausprobiert Zuletzt habe ich noch eine zweite Warteschleife bzgl. SPMEN in SPMCR eingefügt, da dies im Datenblatt erwähnt wird. Auch wenn dies nur notwendig ist wenn Self-Programing verwendet wird, was bei meiner Anwendung onehin nicht der Fall ist: ;+---------------------------------------------+ ;| EEPROM_write | ;+---------------------------------------------+ ; Input: XH, XL (AdrH, AdrL), Tmp1 (data) ; Output: none EEPROM_write: sbic EECR,EEWE ; Wait for completion of prev. write rjmp EEPROM_write EEPROM_write2: in Tmp3, SPMCR sbrc Tmp3, SPMEN rjmp EEPROM_write2 out EEARH, XH ; Set address out EEARL, XL out EEDR, Tmp1 ; Write data (Tmp1) to data register cli ; disable IR sbi EECR,EEMWE ; enable eeprom read sbi EECR, EEWE ; Start eeprom read sei ret Nun weiß ich mir keinen Rat mehr. Hat sonst noch irgend jemand eine Idee an was es liegen könnte?
Also, es hat sich erst mal erledigt: Habe gerade festgestellt, dass die EEPROM-Daten im PonyProg-Dump erst weiter unten aufgelistet sind (Flash in grün, EEPROM blau). Im blauen Bereich habe ich die Daten gefunden. Stimmt nur noch etwas mit meinem Write/Read-Vergleich nicht. Aber das bekomme ich schon hin!
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.