Forum: Mikrocontroller und Digitale Elektronik 17f877a, DWord in Eeprom schreiben und lesen


von Martin G. (hb9tzw)


Lesenswert?

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

von tastendrücker (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.