在PIC上写入EEPROM

3
这里有没有任何PIC微控制器程序员?
我正在使用pickit2和附带的16F690芯片学习一些PIC微控制器编程。目前正在尝试使用各种设施。如果我在MPLAB中设置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个回答

3
16F690数据手册的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始终设置,那么您将尝试写入程序存储器(也称覆盖闪存程序存储器),除非您特别启用了该功能,否则这应该总是失败的。
除此之外,根据我从阅读您的代码中所能看到的,其他所有内容都看起来很好。轮询EECON1.WR而不是设置中断是可以的。这会比让设备进入睡眠模式消耗更多的电力,但当然您应该一次只关注一件事情。

我在之前的代码中清除了EEPROM,成功地从EEPROM中读取数据,但是在这里忘记了再次清除,但它应该仍然被设置为0。以防万一,我添加了这个操作,但仍然无法正常工作。我是否需要设置控制标志或其他可能被忽略的内容来允许写入? - jcoder
是的,我仍在学习,还没有学习中断,这和定时器是我接下来要学习的。 - jcoder
接受了这个答案,因为它是正确的,并指出了我的代码中的一个小错误。我通过删除不必要的后向选择语句使其工作。似乎在编程序列的中间这样做实际上会停止它的工作。 - jcoder
数据表的第10.1.3节还说:“在此代码段期间应禁用中断”,这是指代码示例中的“必需序列”。你试过了吗? - Niall C.
我无法编辑我上面的评论。我的意思是“bank”选择,而不是“back”选择。我的程序中没有启用中断,因此不需要禁用它们。无论如何,我现在已经让它工作了,但还是感谢您的建议。 - jcoder

1
如果您使用高科技编译器,写入EEPROM就像这样简单:
#include <pic.h>
然后在主函数中,
EEPROM_WRITE(0, 0x00); 或者更简单的方式;

EEPROM_WRITE(location to write to, value to write to it);

我其实还没有勇气用汇编语言编写我的PIC。


0

xc8编译器的方法:

#include <xc.h>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接