mikrocontroller.net

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


Autor: Martin Geissmann (hb9tzw)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.