《PIC片内EEPROM读写的注意事项及代码》由会员分享,可在线阅读,更多相关《PIC片内EEPROM读写的注意事项及代码(12页珍藏版)》请在金锄头文库上搜索。
1、写片内 eeprom 出现问题 下面式写EEPROM 的子程序 。在只写一个字节的时候,没有问题。连续写两个字节的时候就死机。(用编程器可以看到,第一个字节已改写。)在写两个字节之间插入延时才能行。WRI TE_EEPROM 子程序中有对WR 位的检测,应该不需要延时也能行才对。WRITE_EEPROMBSFSTATUS,RP1BSFSTATUS,RP0BTFSCEECON1,WRGOTO$-1BCFSTATUS,RP0MOVFADDR,W;地址在addr 中,数据在 value 中MOVWFEEADRMOVFVALUE,WMOVWFEEDATABSFSTATUS,RP0BCFEECON1,E
2、EPGDBSFEECON1,WRENBCFINTCON,GIEBTFSCINTCON,GIEGOTO$-2MOVLW0X55MOVWFEECON2MOVLW0XAAMOVWFEECON2BSFEECON1,WRBSFINTCON,GIEBCFEECON1,WREN;BTFSCEECON1,WR;GOTO$-1BCFSTATUS,RP0BCFSTATUS,RP1RETURN在加入延时后,将;BTFSCEECON1,WR;GOTO$-1这两句前的分号去掉,同样出现写 EEPORM就会死机。(用编程器可以看到只有第一个字节被改写)。请 DX 指点一下,这个问题已经困了一天,还没找到原因。急啊!作者:
3、eyuge2 2005-2-4 13:07:00 回复 1 完全错误。629273 错误很多,数据手册有很好的例程你怎么不看?WRITE_EEPROMBSFSTATUS,RP1BSFSTATUS,RP0BTFSCEECON1,WRGOTO$-1BCFSTATUS,RP0MOVFADDR,W;地址在addr 中,数据在 value 中MOVWFEEADRMOVFVALUE,WMOVWFEEDATABSFSTATUS,RP0BCFEECON1,EEPGDBSFEECON1,WRENBCFINTCON,GIEBTFSCINTCON,GIE;这个完全没有必要GOTO$-2MOVLW0X55MOVWFE
4、ECON2MOVLW0XAAMOVWFEECON2BSFEECON1,WRBSFINTCON,GIEBCFEECON1,WREN;你应该在 BSF EECON1 WR 之后等待中断就可以了,如果不开中断,就检测相应的中断标志。第二个字节应该在中断之后再写。象你的程序,如果没有中断服务程序的话就是复位后运行到这里形成一个死循环。;BTFSCEECON1,WR;GOTO$-1BCFSTATUS,RP0BCFSTATUS,RP1RETURN作者:xieyuanbin 2005-2-4 13:29:00回复 2 进一步解释 629274 BCFINTCON,GIEBTFSCINTCON,GIEGOTO
5、$-2这有没有必要,这里先不提,顶多只是多了两条指令的问题,不会影响到程序的流程。我在这里关中断是为了保证下面 5 条指令的顺序性。开中断是因为还有其它类型的中断要响应。EEPROM 的写中断 使能位没有打开,EEPROM 的写中断请求是不会被响应的,应该不会像你说的形成死循环。这里是靠检测 WR位来判断上次的写EEPROM 是否完成,继 而启动本次 的 EEPROM 写操作 。WRITE_EEPROM是当作一个子程序来调用的。调用它的主程序是这样的MOVFPUSHLENGTHH,WMOVWFVALUEMOVLW.1MOVWFADDRCALLWRITE_EEPROM;DELAY.20MOVFP
6、USHLENGTHL,WMOVWFVALUEMOVLW.2MOVWFADDRCALLWRITE_EEPROM;DELAY.20 就 是上面说到的延时(延时 20ms)是一个宏上面提到的种种情况在 MPLAB6.5下软仿真都能完成其功能。VALUE ADDR 定义在公用RAM 中作者:eyuge2 2005-2-4 14:00:00回复 3 请参考,似乎你在开始写之后将写使能位WREN 关闭了。629275 连续写 EEPROM的例程,在 16F877 上调试通过。WRITEEPCLRWDTBSFSTATUS,RP1; BANK2MOVFINDF,WMOVWFEEDATA; Data Memor
7、y Value to writeBSFSTATUS, RP0; Bank 3BCFEECON1, EEPGD; Point to DATA memoryBSFEECON1, WREN; Enable writesMOVLWH55;MOVWFEECON2; Write 55hMOVLWHAA;MOVWFEECON2; Write AAhBSFEECON1, WR; Set WR bit to begin writeCLRFSTATUSBTFSSPIR2,EEIFGOTO$-1;WAITINT FOR WRITE FINISHBCFPIR2,EEIFBSFSTATUS,RP0BSFSTATUS,R
8、P1;BANK3BCFEECON1, WREN; Disable writesBCFSTATUS,RP0; BANK2INCFFSRINCFEEADRBCFSTATUS,RP1; BANK0BCFPIR2,4DECFSZCOUNT1GOTOWRITEEP作者:xieyuanbin 2005-2-4 14:58:00回复 4 请再看看 629276 谢谢,你的程序采用了间接寻址,对多个字节的连续写很实用。我最多只需写两个字节,用简单的就行了。在开始写之后将写使能位 WREN 关闭了,是参照数据手册上的例程。你给的程序好像有点小问题,没看到清 EEIF位哦。我碰到的问题比较奇怪主程序不变,如下:M
9、OVFPUSHLENGTHH,WMOVWFVALUEMOVLW.1MOVWFADDRCALLWRITE_EEPROMDELAY.20MOVFPUSHLENGTHL,WMOVWFVALUEMOVLW.2MOVWFADDRCALLWRITE_EEPROM下面是 WRITE_EEPROM 子程序(看上去有些怪,对 WR检测了两次。是为了测试才这样做的。)WRITE_EEPROMBSFSTATUS,RP1BSFSTATUS,RP0BTFSCEECON1,WRGOTO$-1BCFSTATUS,RP0MOVFADDR,W;地址在 addr 中,数据在 value 中MOVWFEEADRMOVFVALUE,
10、WMOVWFEEDATABSFSTATUS,RP0BCFEECON1,EEPGDBSFEECON1,WRENBCFINTCON,GIEBTFSCINTCON,GIEGOTO$-2MOVLW0X55MOVWFEECON2MOVLW0XAAMOVWFEECON2BSFEECON1,WRBSFINTCON,GIEBCFEECON1,WREN;BTFSCEECON1,WR;GOTO$-1BCFSTATUS,RP0BCFSTATUS,RP1RETURN注意加分号的两句。有分号时,什么问题都没有。把分号去掉,一执行到上面那段主程序就死机(按键没反应)。用编程器读EEPROM 会发现只有 01H 单元被改写
11、,02H 单元的值没有变化。作者:eyuge2 2005-2-4 15:39:00回复 5 没有跨页 629277 我程序不大,没有超过 2K,没有跨页问题作者:eyuge2 2005-2-4 15:44:00回复 6 已经解决了 629278 犯了一个基本错误,在进入中断之后忘了将 STATUS 清 0,将 BANK恢复到BANK0。写 EEPROM 要花费 2ms 到8ms 的时间,故在检测 WR 状态位要花费相当长时间,会进入中断(时间间隔为 1ms 的T0 中断)。中断服务 程序中要进行 AD 转换,会检测 ADCON0中的 GO 标志位。ADCON0 的地址为 0X1F,由于进入中断
12、后没有清 STATUS,故当前的 RAM 还在 BANK3 中(EECON1 在 BANK3 中),检测ADCON0 中GO 位实际是在检测 0X19F 的D2 位。先 前启动 AD时将此位置为 1,它是不会自动清0 的,故会在此形成死循环。谢谢 xieyuanbin,不好意思了!;*;该例程是让大家熟 PIC16F87X 内部 EEPROM 的读写方法。;把二制数写入地址00H 到 3FH 的 EEPROM 数据存储器中,然后读出显示到发光二极管上。;其效果有类似于跑马灯;*;片内 EEPROM 读写验证 ;硬件环境:PIC 演示板;*;*C EQU 0HSTATUS EQU 3H ;定义状
13、态寄存器地址RP0 EQU 5H ;定义页选位RP0 的位地址RP1 EQU 6H ;定义页选位 RP1 的位地址Z EQU 2H ;定义 0状态位的位地址PORTC EQU 7H ;定义 RC口数据寄存器地址TRISC EQU 87H ;定义 RC 口方向控制寄存器地 址EECON1 EQU 18CH ;定义写控制寄存器 1 的地址EECON2 EQU 18DH ;定义写控制寄存器 2的地址EEDATA EQU 10CH ;定义读/写数据寄存器地址EEADR EQU 10DH ;定义读/写地址寄存器地址RD EQU 0 ;定义读启动控制位位地址WR EQU 1 ;定义写启动控 制位位地址WR
14、EN EQU 2 ;定义写使能控 制位位地址EEPGD EQU 7 ;定义访问目标选择控制位位址F EQU 1 ;定义目标寄存器为 RAM 的指示符W EQU 0 ;定义目标寄 存器为 W 的指示符INTCON EQU 0BH ;定义中断控制寄存 器地址GIE EQU 07H ;GIE 的位地址ADDR EQU 70H ;定义地址变量DATA1 EQU 71H ;定义数 据变量;*ORG 0000H ;NOP ;放置一条ICD 必须的空操作指令GOTO MAIN ;ORG 0004HGOTO $ORG 0008H ;MAINBCF STATUS,RP1 ;选体 1 为当前体 BSF STATUS,RP0 ;MOVLW 00H ;设定 RC全部为输出MOVWF TRISC ;BSF STATUS,RP1 ;体3 为当前体CLRF ADDR ;地址变量清 0MOVLW B00000011MOVWF DATA1WRITEBSF STATUS,RP1 ;选定体 3BTFSC EECON1,WR ;上一次写操作是否完成GOTO $-1