Hallo zusammen
Das schreiben ins und lesen vom Eeprom funktioniert mittlerweile
grundsätzlich, jedoch beim schreiben oder lesen von DWord-Variablen gibt
es Probleme. Diese bestehen darin, dass ich nicht die Werte wieder
auslese, die ich dachte vorher geschrieben zu haben.
Ich schreibe diese so Byte für Byte ins EEprom
asm
; write byte0
bsf status,RP1
bsf status,RP0 ; Bank3
btfsc eecon1,WR ; Wait for write
goto $-1 ; to complete
bcf status,RP0 ; gehe auf Bank2
movlw 0x00 ;
movwf eeadr ; schreibe Adresse in EEADR
movlw freq2 ;
movwf eedata ; schreibe Daten in EEDATA
bsf status,RP0 ; gehe auf Bank3
bcf eecon1,EEPGD ; Point to DATA memory
bsf eecon1,WREN ; setze dort Bit WREN enable write
bcf intcon,GIE ; Disable INTs
movlw 055h ;
movwf eecon2 ; schreibe 55h in eecon2
movlw 0AAh ;
movwf eecon2 ; schreibe AAh in eecon2
bsf eecon1,WR ; Bank3
bcf status,RP1 ; gehe wieder auf Bank1
bsf intcon,GIE ; setze dort GIE wieder
bcf eecon1,WREN ; setze dort Bit WREN disable write
; write byte1
bsf status,RP1
bsf status,RP0 ; Bank3
btfsc eecon1,WR ; Wait for write
goto $-1 ; to complete
bcf status,RP0 ; gehe auf Bank2
movlw 0x01 ;
movwf eeadr ; schreibe Adresse in EEADR
movlw freq2h ;
movwf eedata ; schreibe Daten in EEDATA
bsf status,RP0 ; gehe auf Bank3
bcf eecon1,EEPGD ; Point to DATA memory
bsf eecon1,WREN ; setze dort Bit WREN enable write
bcf intcon,GIE ; Disable INTs
movlw 055h ;
movwf eecon2 ; schreibe 55h in eecon2
movlw 0AAh ;
movwf eecon2 ; schreibe AAh in eecon2
bsf eecon1,WR ; Bank3
bcf status,RP1 ; gehe wieder auf Bank1
bsf intcon,GIE ; setze dort GIE wieder
bcf eecon1,WREN ; setze dort Bit WREN disable write
; write byte2
bsf status,RP1
bsf status,RP0 ; Bank3
btfsc eecon1,WR ; Wait for write
goto $-1 ; to complete
bcf status,RP0 ; gehe auf Bank2
movlw 0x02 ;
movwf eeadr ; schreibe Adresse in EEADR
movlw freq2hh ;
movwf eedata ; schreibe Daten in EEDATA
bsf status,RP0 ; gehe auf Bank3
bcf eecon1,EEPGD ; Point to DATA memory
bsf eecon1,WREN ; setze dort Bit WREN enable write
bcf intcon,GIE ; Disable INTs
movlw 055h ;
movwf eecon2 ; schreibe 55h in eecon2
movlw 0AAh ;
movwf eecon2 ; schreibe AAh in eecon2
bsf eecon1,WR ; Bank3
bcf status,RP1 ; gehe wieder auf Bank1
bsf intcon,GIE ; setze dort GIE wieder
bcf eecon1,WREN ; setze dort Bit WREN disable write
; write byte3
bsf status,RP1
bsf status,RP0 ; Bank3
btfsc eecon1,WR ; Wait for write
goto $-1 ; to complete
bcf status,RP0 ; gehe auf Bank2
movlw 0x03 ;
movwf eeadr ; schreibe Adresse in EEADR
movlw freq2hhh ;
movwf eedata ; schreibe Daten in EEDATA
bsf status,RP0 ; gehe auf Bank3
bcf eecon1,EEPGD ; Point to DATA memory
bsf eecon1,WREN ; setze dort Bit WREN enable write
bcf intcon,GIE ; Disable INTs
movlw 055h ;
movwf eecon2 ; schreibe 55h in eecon2
movlw 0AAh ;
movwf eecon2 ; schreibe AAh in eecon2
bsf eecon1,WR ; Bank3
bcf status,RP1 ; gehe wieder auf Bank1
bsf intcon,GIE ; setze dort GIE wieder
bcf eecon1,WREN ; setze dort Bit WREN disable write
endasm
Und lese diese so wieder aus:
asm
bsf status,RP1
bcf status,RP0 ; Bank2
movlw 0x00 ; Read address 0 in EEPROM space
Movwf eeadr ; Address to read
bsf status,RP0 ; Bank3
bcf eecon1,EEPGD ; Point to data memory
bsf eecon1,RD ; EE Read
bcf status,RP0 ; Bank2
movf eedata,FREQ2 ; freq2 = EEDATA
movlw 0x01 ; Read address 1 in EEPROM space
Movwf eeadr ; Address to read
bsf status,RP0 ; Bank3
bcf eecon1,EEPGD ; Point to data memory
bsf eecon1,RD ; EE Read
bcf status,RP0 ; Bank2
movf eedata,FREQ2H ; freq2h = EEDATA
movlw 0x02 ; Read address 2 in EEPROM space
Movwf eeadr ; Address to read
bsf status,RP0 ; Bank3
bcf eecon1,EEPGD ; Point to data memory
bsf eecon1,RD ; EE Read
bcf status,RP0 ; Bank2
movf eedata,FREQ2HH ; freq2hh = EEDATA
movlw 0x03 ; Read address 3 in EEPROM space
Movwf eeadr ; Address to read
bsf status,RP0 ; Bank3
bcf eecon1,EEPGD ; Point to data memory
bsf eecon1,RD ; EE Read
bcf status,RP0 ; Bank2
movf eedata,FREQ2HHH; freq2hhh = EEDATA
endasm
Kann mir jemand, der sich mit Assembler besser auskennt als ich, sagen,
ob dieser Code so funktionieren sollte und der Fehler evtl. doch sonstwo
zu suchen ist?
Danke und Gruss
Martin
Ohne deinen Code genauer analysiert zu haben (ich habe die
Register-Bänke beim 17f877 nicht im Kopf):
1) Ich würde die INT's nur einmal am Anfang disablen, und ganz am Ende
wieder enablen, nicht vor/nach jedem Byte.
2) Das
btfsc eecon1,WR ; Wait for write
goto $-1 ; to complete
gehört nach dem Schreiben eines Bytes, nicht vor den Anfang des nächsten
Bytes.
In deiner Version kann es passieren, dass ein Byte noch nicht
geschrieben ist, du aber die INT's schon wieder enablest. So könnte ein
Interrupt dazwischenfunken.
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.