Forum: Mikrocontroller und Digitale Elektronik PIC16F18344 EEPROM Schreiben und Lesen funktioniert nicht


von Max (Gast)


Lesenswert?

Hallo,
ich versuche verzweifelt ein Byte in das EEPROM zu schreiben und 
anschließend wieder auszulesen.
Jedoch scheint das Schreiben einfach nicht zu funktionieren, denn ich 
lese immer nur 0xFF egal was ich zu vor hineinschreibe.
Auch, wenn ich im MPLAB IDE 3.60 das "EE Data Memory" Fenster öffne und 
alle EEPROM Werte auslese sind alle mit dem gleichen Wert 0xFF belegt.
Ich habe jetzt mehrmals sehr genau die Dokumentation dazu gelesen und 
kann beim besten willen meinen Fehler nicht finden.

Erkennt jemand was ich falsch mache?
Ich nutze MPLAB 3.6 und MPASM.
1
; CONFIG1
2
__CONFIG _CONFIG1, 
3
        _FEXTOSC_OFF & 
4
        _RSTOSC_HFINT32 & 
5
        _CLKOUTEN_OFF & 
6
        _CSWEN_ON & 
7
        _FCMEN_OFF
8
 
9
; CONFIG2
10
__CONFIG _CONFIG2, 
11
        _MCLRE_OFF & 
12
        _PWRTE_ON & 
13
        _WDTE_OFF & 
14
        _LPBOREN_OFF & 
15
        _BOREN_OFF & 
16
        _BORV_HIGH & 
17
        _PPS1WAY_OFF & 
18
        _STVREN_ON & 
19
        _DEBUG_OFF
20
 
21
; CONFIG3
22
__CONFIG _CONFIG3, 
23
        _WRT_OFF & 
24
        _LVP_OFF
25
 
26
; CONFIG4
27
__CONFIG _CONFIG4, 
28
        _CP_OFF & 
29
        _CPD_OFF
30
31
code 0x0
32
33
; Write
34
  banksel NVMCON1
35
  bsf    NVMCON1, NVMREGS
36
  bsf    NVMCON1, WREN
37
  
38
  banksel  NVMADRH
39
  movlw  H'70'
40
  movwf  NVMADRH
41
  
42
  banksel  NVMADRL
43
  movlw  H'00'
44
  movwf  NVMADRL
45
  
46
  banksel  NVMDATL
47
  movlw  H'44'
48
  movwf  NVMDATL
49
  
50
  banksel  NVMCON2
51
  
52
  movlw  H'55'
53
  movwf  NVMCON2
54
  
55
  movlw  H'AA'
56
  movwf  NVMCON2
57
  
58
  banksel  NVMCON1
59
  bsf    NVMCON1, WR
60
  
61
  nop ; Kann man eig. beim PIC16F18344 weglassen. 
62
  nop ;
63
  
64
  btfsc  NVMCON1, WR
65
  goto  $-2
66
  
67
; Read
68
  banksel  NVMCON1
69
  bsf    NVMCON1, NVMREGS
70
  bcf    NVMCON1, WREN
71
  
72
  banksel  NVMADRL
73
  movlw  H'00'
74
  movwf  NVMADRL
75
  
76
  banksel  NVMADRH
77
  movlw  H'70'
78
  movwf  NVMADRH
79
  
80
  banksel  NVMCON1
81
  bsf    NVMCON1, RD
82
  btfsc  NVMCON1, RD
83
  goto  $-2
84
  
85
  banksel  NVMDATL
86
  movf  NVMDATL, W
87
  
88
  goto  $

von Volker S. (vloki)


Lesenswert?

Sicher, dass das mit der x7000 Adresse stimmt?
Das gilt vielleicht nur bei indirektem Zugriff über die Tablepointer.
Normal beginnt das EEPROM soweit ich mich erinnern kann bei 0x0000.

von Thomas E. (picalic)


Lesenswert?

Servus,

Du solltest Dich an's Datenblatt halten, wo folgende Sequenz als 
Beispiel angegeben ist:
1
    BANKSEL NVMCON1
2
    BSF NVMCON1,WREN     ; Enable write/erase
3
    MOVLW 55h            ; Load 55h
4
    BCF INTCON,GIE       ; Recommended so sequence is not interrupted
5
    MOVWF NVMCON2        ; Step 1: Load 55h into NVMCON2
6
    MOVLW AAh            ; Step 2: Load W with AAh
7
    MOVWF NVMCON2        ; Step 3: Load AAh into NVMCON2
8
    BSF NVMCON1,WR       ; Step 4: Set WR bit to begin write/erase
9
    BSF INTCON,GIE       ; Re-enable interrupts

Mit der Bemerkung:
>Note 1: Sequence begins when NVMCON2 is written; steps 1-4 must occur in the 
>cycle-accurate order shown.

von Max (Gast)


Lesenswert?

Oh danke.
Die Adresse 7000h ist schon richtig.
Aber mir ist nicht aufgefallen, dass ich mit dem BANKSEL NVMCON1 
natürlich die Unlock Sequence unterbreche.
Hier nochmal ein Beispiel das bei mir jetzt perfekt funktioniert.
1
  ; Bank 17 - NVM registers.
2
  movlb  D'17'
3
  
4
  bsf    NVMCON1, NVMREGS
5
  bsf    NVMCON1, WREN
6
  
7
  movlw  H'70'
8
  movwf  NVMADRH
9
  
10
  movlw  H'00'
11
  movwf  NVMADRL
12
  
13
  movlw  H'97'
14
  movwf  NVMDAT
15
  
16
  movlw  H'55'
17
  movwf  NVMCON2
18
  
19
  movlw  H'AA'
20
  movwf  NVMCON2
21
    
22
  bsf    NVMCON1, WR
23
24
  btfsc  NVMCON1, WR
25
  goto  $-2
26
  
27
  goto  $

von Thomas E. (picalic)


Lesenswert?

Gut :)
Aber warum hast Du den "banksel  NVMCON1"-Befehl jetzt durch
1
  ; Bank 17 - NVM registers.
2
  movlb  D'17'
ersetzt? Mit "banksel" ist es doch viel bequemer, lesbarer und weniger 
fehleranfällig!

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.