这里有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
答案 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);