Assembly 在PIC上写入EEPROM
这里有PIC微控制器程序员吗 我正在学习一些PIC微控制器编程,使用pickit2和16F690芯片。目前我正在尝试各种设施。如果我在MPLAB中设置EEPROM值,我可以成功地在代码中从EEPROM读取一个字节,但我似乎无法使用PIC本身修改该值。简单地说,什么都没发生,而且我没有读回修改后的值,我总是得到原始值,这对我来说意味着写操作不起作用 这是我那部分的代码,我遗漏了什么吗?我知道我做了很多不必要的银行转换,我添加了其中的大部分,以确保问题不在错误的银行Assembly 在PIC上写入EEPROM,assembly,microcontroller,pic,microchip,Assembly,Microcontroller,Pic,Microchip,这里有PIC微控制器程序员吗 我正在学习一些PIC微控制器编程,使用pickit2和16F690芯片。目前我正在尝试各种设施。如果我在MPLAB中设置EEPROM值,我可以成功地在代码中从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
第122页详细说明了写入EEPROM的正确方法:
我注意到您特别遗漏了这一行:
BCF EECON1, EEPGD ;Point to DATA memory
如果始终设置了EEPGD
,则您将尝试写入程序内存(也称为覆盖闪存程序内存),除非您特意启用该功能,否则该程序内存将始终失败
除此之外,从阅读您的代码可以看出,其他一切看起来都很好。您可以轮询
EECON1.WR
而不是设置中断。这将比让设备进入睡眠状态花费更多的电量,但当然你一次只需要担心一件事。如果你使用高科技编译器,写入EEPROM就像#包括
然后主要是,
EEPROM_写入(0,0x00)代码> 或者说真的
EEPROM_WRITE(location to write to, value to write to it);
实际上,我还没有足够的勇气在汇编中编写我的PIC。xc8编译器的方法:
#include <xc.h>
.....
value = eeprom_read(address);
eeprom_write(address, data);
#包括
.....
值=eeprom_读取(地址);
eeprom_写入(地址、数据);
在前面的代码中,我很清楚EEPGD成功地从EEPROM中读取了数据,但这里忘记了再次读取,但它仍应设置为0。以防万一我添加了,但它仍然不起作用。我是否需要在我的控制标志或类似的东西中设置我可能错过的东西来允许写入?是的,我仍在学习,我还没有学习到中断,这和计时器是我列表中的下一个。接受这个答案,因为它是正确的,并指出了我代码中的一个小错误。我通过删除不必要的返回select语句来实现这一点。似乎在编程序列的中间做这件事实际上停止了数据表的工作部分。你试过了吗?我无法编辑上面的评论。我的意思是“银行”选择,而不是“返回”选择。我没有在我的程序中启用中断,所以不需要禁用它们。不管怎样,我现在已经开始工作了,但是谢谢你的建议
#include <xc.h>
.....
value = eeprom_read(address);
eeprom_write(address, data);