Freescale S12X EEPROM, Hilfe!

OP #3172727
Lesenswert?

Hallo zusammen,

ich bin schon lange passiver und eifriger Leser und habe hier schon 
viele gute Antworten, Beispiele und Anregungen gefunden. Weiter so ;) !

Nun stehe ich aber vor einem Problem das ich trotz intensiver Recherche 
und Langem rumprobieren noch nicht selbstständig gelöst bekommen habe.

Für ein Projekt innerhalb meines Studiums muss ich mit einem "Freescale 
MC9S12XD256" arbeiten und u.a. Werte mit dem ADC einlesen und auf dem 
internen EEPROM (und später auch evtl. FLASH) Speicher ablegen...
Aber die Geschichte mit dem EEPROM klappt momentan überhaupt nicht, ich 
kann zwar Werte aus dem EEPROM(innerhalb des Lokalen-Adressraums) 
auslesen aber Schreiben und Befehle (wie z.B. "Mass Erase") wollen 
nicht.

...wenn mir jemand helfen kann wäre ich echt dankbar!


gruß leo
#3173063
Lesenswert?

Na so schwer ist das doch nicht.
Das EEPROM-Modul initialisieren (ECLKDIV, max. Taktfrequenz beachten) 
und dann die Statemaschine aus dem Datenblatt eins zu eins nachbauen. 
Schon kannst du löschen und schreiben.
Ganz wichtig ist natürlich, dass du immer nur vier Byte am Stück 
schreiben bzw. löschen (Ausnahme Mass Erase) kannst. Ansonsten steht 
eigentlich alles im Dateblatt. Einfach mal die paar Seiten ausdrucken 
und in Ruhe lesen, dann wird die Materie schnell verständlich.


Gruß,
Christian
OP #3173499
Lesenswert?

Sorry!  Ich sollte vlt. doch noch etwas weiter ausholen:

Ich hab auf meinem µC gezwungenermaßen das Monitorprogramm "TwinPEAKs" 
am Laufen, mit dessen Hilfe ich (über eine RS232 Schnittstelle) meine 
Programme landen und starten kann.
Die Programmierung erfolgt in Assembler und ich verwende für den Anfang 
nur den Adressraum  der LocalMemoryMap(0x0000 - 0xFFFF), das mit den 
Pages hab ich noch nicht so ganz verstanden :/

Mithilfe von TwinPEAKs habe ich schon beliebige Werte in den EEPROM 
geschrieben und mit einem Selbstgeschriebenen Programm wieder 
ausgelesen. So weit, so gut.

Nachdem ich jetzt ein Paar Werte in  meinem EEPROM stehen hab, dachte 
ich mir ich versuch erst mal nen MassErase.
Natürlich habe ich schon das Datenblatt zu Rate gezogen und dabei kam 
folgendes raus:


  INCLUDE "s12x.inc"


  ORG $1000    ;Ram Start


  MOVB #$CA,ECLKDIV   ;ClockPrescaler einstellen für 16MHz Quarz
  MOVB #$00,ECNFG      ;EEPROM-Interrupts aus
  MOVB #$FF,EPROT    ;EEPROM-Protection aus



w1:  BRCLR  ESTAT,#$80,w1  ;Warte auf CBEIF = 1 -> EEPROM bereit


  MOVB #$30,ESTAT    ;ACCERR und PVIOL löschen(ACCERR=1,PVIOL=1)

  MOVB #$00,EDATAHI  ;EDARA = 0x0000
  MOVB #$00,EDATALO

  MOVB #$00,EADDRHI  ;EADDR = 0x0000
  MOVB #$00,EADDRLO

  MOVB #$41,ECMD    ;Befehl für MassErase

  MOVB #$80,ESTAT    ;CBEIF löschen (CBEIF=1) -> MassErase Starten



  JMP $F000    ;zurück zu TwinPEAKs


END


Das kleine Programm sollte einfach nur einen MassErase starten, tut aber 
nicht (Die Werte im EEPROM sind immer noch da).

Irgendwo mach ich was grundlegend Falsch!!!
OP #3173583
Lesenswert?

Hi, Jörg

danke du hast recht, EDATA und EADDR sind fürn Ar***, ich habs endlich 
jetzt hinbekommen!!!

  INCLUDE "s12x.inc"


  ORG $1000    ;Ram Start

  ;EEPROM Initialisieren
  MOVB #$CA,ECLKDIV   ;ClockPrescaler einstellen für 16MHz Quarz
  MOVB #$00,ECNFG      ;EEPROM-Interrupts aus
  MOVB #$FF,EPROT    ;EEPROM-Protection aus



w1:  BRCLR  ESTAT,#$80,w1  ;Warte auf CBEIF = 1 -> EEPROM bereit


  MOVB #$30,ESTAT    ;ACCERR und PVIOL löschen


  MOVW #$0000,$0800  ;Wort an eine Addresse des EEPROMs schreiben
  ;MOVB #$00,$0800   ;Move Byte geht nicht!!!


  MOVB #$41,ECMD    ;Befehl für MassErase (oder MOVB#$20,ECMD zum 
Schreiben)

  MOVB #$80,ESTAT    ;CBEIF löschen (CBEIF=1) -> Befehl ausführen


  JMP $F000    ;zurück zu TwinPEAKs


END

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren