在PIC上写入EEPROM

时间:2010-04-18 10:04:27

标签: assembly microcontroller pic microchip

这里有PIC单片机程序员吗?

我正在学习一些PIC单片机编程,使用pickit2和随附的16F690芯片。我正在努力尝试各种设施。如果我在MPLAB中设置EEPROM vaklue,我可以在代码中成功读取 EEPROM中的一个字节,但我似乎无法使用PIC本身修改该值。简直没有任何反应,我不回读修改后的值,我总是得到原始的,这意味着写入不起作用?

这是我对该部分的代码,我错过了什么吗?我知道我做了很多不必要的银行转换,我添加了大部分银行转换以确保错误的银行不是问题。

        ; ------------------------------------------------------
        ; Now SET the EEPROM location ZERO to 0x08
        ; ------------------------------------------------------

        BANKSEL EEADR
        CLRF    EEADR           ; Set EE Address to zero

        BANKSEL EEDAT
        MOVLW   0x08            ; Store the value 0x08 in the EEPROM
        MOVWF   EEDAT

        BANKSEL EECON1
        BSF     EECON1, WREN    ; Enable writes to the EEPROM

        BANKSEL EECON2
        MOVLW   0x55            ; Do the thing we have to do so
        MOVWF   EECON2          ; that writes can work
        MOVLW   0xAA
        MOVWF   EECON2

        BANKSEL EECON1      
        BSF     EECON1, WR      ; And finally perform the write

WAIT
        BTFSC   EECON1, WR      ; Wait for write to finish
        GOTO    WAIT

        BANKSEL PORTC           ; Just to make sure we are on the right bank

3 个答案:

答案 0 :(得分:3)

16F690 datasheet的第122页,它详细说明了写入EEPROM的正确方法:

BANKSEL EEADR                   ;
MOVF    DATA_EE_ADDR, W;
MOVWF   EEADR          ;Data Memory Address to write
MOVF    DATA_EE_DATA, W;
MOVWF   EEDAT                   ;Data Memory Value to write
BANKSEL EECON1                  ;
BCF     EECON1, EEPGD ;Point to DATA memory
BSF     EECON1, WREN   ;Enable writes
BCF     INTCON, GIE             ;Disable INTs.
BTFSC   INTCON, GIE             ;SEE AN576
GOTO    $-2
; BEGIN REQUIRED SEQUENCE
MOVLW   55h            ;       
MOVWF   EECON2         ;Write 55h
MOVLW   AAh                     ;
MOVWF   EECON2                  ;Write AAh
BSF     EECON1, WR              ;Set WR bit to begin write
BSF     INTCON, GIE             ;Enable INTs.
SLEEP                  ;Wait for interrupt to signal write complete
; END REQUIRED SEQUENCE
BCF     EECON1, WREN   ;Disable writes
BANKSEL 0x00           ;Bank 0

我注意到你特别想念这一行:

 BCF     EECON1, EEPGD ;Point to DATA memory

如果总是设置EEPGD,那么你将尝试写入程序存储器(也就是覆盖闪存程序存储器),它应该总是失败,除非你已经特意启用了它。< / p>

除此之外,据我所知,通过阅读你的代码,其他一切看起来都很好。您可以轮询EECON1.WR而不是设置中断。它会让你比让设备睡觉更省电,但当然你应该一次担心一件事。

答案 1 :(得分:1)

如果使用高科技编译器,写入EEPROM就像#include一样简单,然后写入main,EEPROM_WRITE(0,0x00);或者真的是EEPROM_WRITE(要写入的位置,要写入的值);

我实际上还没有勇气在集会中写下我的照片。祝你好运!!

答案 2 :(得分:0)

xc8编译器的方式:

#include <xc.h>

.....
value = eeprom_read(address);
eeprom_write(address, data);