Hallo,
Viellecht kann mir jemand helfen, warum ich nicht ins interne EEPROM von
meinem PIC 18F6620 schreiben kann. Ich hab zum schreiben und auslesen
jeweils eine Routine geschrieben, wie im Datenblatt beschrieben.
Die Lese-Routine funktioniert, die Schreib-Routine leider nicht.
An was kann das liegen?
unsigned char LeseEEData(unsigned char Adresse)
{
unsigned char ReadData;
EEADRH=0;
EEADR=Adresse;
EEPGD=0; //Lesen von EEPRom-Data und nicht Flash-Speicher
CFGS=0;
RD=1; // Das Lesen der EEProm-Zelle triggern
ReadData=EEDATA; //Übernahme der gelesenen Speicherzelle
return ReadData;
}
void SchreibeEEData(unsigned char Adresse, unsigned char WriteData)
{
EEADRH=0;
EEADR=Adresse; // Die Zieladresse eintragen
EEDATA=WriteData; //Byte eintragen
EEPGD=0; //Schreiben auf EEPRom-Data und nicht Flash-Speicher
CFGS=0;
WREN=1; //Schreiben der EEProm-Zelle erlauben GIE=0;
EECON2=0x55;
EECON2=0xAA;
WR=1; // Das Schreiben starten
while (WR) //warten bis der Schreibvorgang
{
}
GIE=1;
WREN=0; // Schreiben verbieten
}
Sieht eigentlich gut aus.
> WREN=1; //Schreiben der EEProm-Zelle erlauben GIE=0;
Dein GIE=0 sollte vermutlich in die nächste Zeile?
WREN=1; //Schreiben der EEProm-Zelle erlauben
GIE=0;
> EECON2=0x55;> EECON2=0xAA;
Die Stelle mit EECON2 ist sehr kritisch.
Schau doch mal was dein Compiler im Assemblerlisting daraus macht.
Ich nehm da lieber Inline Assembler.
Für C18 von Microchip:
_asm
MOVLW 0x55
MOVWF EECON2,0
MOVLW 0xAA
MOVWF EECON2,0
BSF EECON1, WR
_endasm
Da sieht man doch sehr schön, wie dir der Compiler
die eigentlich notwendige kurze Sequenz durch
Banking Befehle versaut. Da wirst du um Inline Assembler
wohl nicht herumkommen.
Wenn ich folgenden ASM-code einfüge, bekomme ich vier Errormeldungen.
Kenn mich mit asm nicht so gut aus.
Was mache ich falsch?
158 #asm
159 MOVLW 0x55
160 MOVWF EECON2, 0
161 MOVLW 0xAA
162 MOVWF EECON2, 0
163 BSF EECON1, WR
164 #endasm
Error [876] 161. Syntaxfehler
Error [876] 163. Syntaxfehler
Error [800] 7588. undefiniertes Symbol "EECON1"
Error [800] 7588. undefiniertes Symbol "WR"
>Kenn mich mit asm nicht so gut aus.
Ich auch nicht ;)
>Was mache ich falsch?
Keine Ahnung. Welcher Compiler ist das überhaupt?
Vieleicht hat der ja schon fertige EEPROM Routinen
in seiner LIB.
>Ich habe jetzt festgestellt, dass auch das Interruptbit nach dem>"Schreibversuch" gar nicht gesetzt wird.
while (!PIR2bits.EEIF) // WRITE step #11
{}
PIR2bits.EEIF = 0; // WRITE step #12
>An was kann das liegen, evtl. ein Hardware Problem?>(ich benutze PIC18F6620 mit MPLAB ICD 2)
Das liegt daran das die Befehle aus dem Datenblatt
nicht in GENAU der Reihenfolge durchgeführt werden
wie sie müssten:
MOVLW 0x55
MOVWF EECON2,0
MOVLW 0xAA
MOVWF EECON2,0
BSF EECON1, WR
Da darf NICHTS dazwischen kommen. Auch keine
Breakpoints vom Debugger oder sowas.