Gast
#6024590
Es handelt sich um einen ATxmega256A3AU der mit dem internen 32MHz betrieben und unter Assembler programmiert wird und durch PDI mit dem Atmel Studio 6 verbunden ist. In das EEprom schreiben oder aus dem EEprom lesen funktioniert sehr gut. Jetzt wollte ich den EEprombereich durch die Software Erasen, also alle Speicherstellen im EEprom löschen bzw. auf 0xFF zurück setzen. Aber das funktioniert aus meiner Software heraus nicht! Wenn ich mit dem Programmiertool aus dem Atmel Studio und einem Programmer über PDI das Erase mache, dann funktioniert es. Stelle mal den verwendeten Code ein: eeprom_erase: nvm_eeprom_busy_check_1: lds r16, NVM_STATUS ;Prüfen, ob NVM noch Busy oder nicht sbrc r16, 7 rjmp nvm_eeprom_busy_check_1 ldi r16, NVM_CMD_ERASE_EEPROM_gc ;Erase EEprom Kommando laden (0x30) sts NVM_CMD, r16 ldi r16, 0b00000001 ;Bit0=CMDEX mit 1 vorladen ldi r17, 0xD8 ;Signatur zum Freischalten laden out CPU_CCP, r17 ;Schreibschutz für NVM_CTRLA aufheben. sts NVM_CTRLA, r16 ;CMDEX Bit0 jetzt auf 1 setzen und Befehl ausführen nvm_eeprom_busy_check_2: lds r16, NVM_STATUS ;wieder warten bis NVM fertig sbrc r16, 7 rjmp nvm_eeprom_busy_check_2 ldi r16, NVM_CMD_NO_OPERATION_gc ;KEIN Kommando in NVM_CMD laden sts NVM_CMD, r16 ret ;FERTIG! FUNZT ABER NICHT! Ich habe jetzt das Datenblatt schon mehrere male durchgesehen und auch die zusätzlichen Dokumente auf der Microchip Seite. Habe hier im Forum alles was mit ATxmega zu tun hat durchgeschaut. Ich kann keine andere Information finden, als den Ablauf, den ich auch Programmiert habe: 1. Warten bis NVM nicht mehr Busy ist. 2. Kommando für das Erase in das NVM_CMD Register schreiben 3. Den Schreibschutz für 4 Take für das Register NVM_CTRLA aufheben 4. NVM_CTRLA Register Bit0 mit 1 beschreiben und damit das Kommando ausführen. 5. Warten bis NVM fertig ist. Daran habe ich mich doch in meinem Programmcode gehalten. Aber nachdem diese Routine durchlaufen wird, ist der EEprom noch immer gefüllt mit den Werten die mal eingeschrieben wurden. Hier im Forum habe ich gelesen, das bei 32MHz Takt der Zugriff auf EEprom problematisch sein soll. Habe dann auf den internen 2MHz Takt "runter geschaltet", auch alle Interrupts abgeschaltet. Aber der EEprom wird enfach nicht erased! Da ich keine Idee mehr habe, wo der Fehler liegen könnte, bleibt mir nichts anderes mehr übrig, als hier mal um Rat zu bitten. Kennt eventuell jemand dieses Problem, oder könnte mir bitte dabei Helfen?