搜索
bottom↓
回复: 9

上手PIC三天后的FLASH写操作遇到问题(读没有问题)

[复制链接]

出0入0汤圆

发表于 2007-12-6 09:23:12 | 显示全部楼层 |阅读模式
程序如下,问题就是在读的过程是完全正常,但是写的时候看FLASH区的内容没有改变的啊,怎么回事啊,我什么都没有保护哦,是在SIM的条件下仿真。



#INCLUDE<P16F877A.INC>
__CONFIG B'11111101110010'
;bit13 1=code protection off
;bit12 read as 1
;bit11 1=in-circuit debugger mode off
;bit10,9 11=flash program memory write enable
;bit8  1=data eeprom code protection off
;bit7  0=RB3 as i/o pin  lvp
;bit6  1=bor enable
;bit5,4 11=read as 11
;bit3 0=pwrt enable
;bit2 0=wdt off
;bit1,0 10=HS osc
TEMP     EQU     20H
DATA1    EQU     21H
DATA2    EQU     22H
DATA3    EQU     23H
DATA4    EQU     24H

EADRL    EQU     120H
EADRH    EQU     121H
EDATAL   EQU     122H
EDATAH   EQU     123H

ORG 0000H
GOTO MAIN
ORG 0004H
GOTO DISPOSE_INT
ORG 0005H
;--------------------------
DISPOSE_INT
RETFIE
;--------------------------
PORT_INIT
CLRW
MOVWF INTCON
MOVWF PORTA
MOVWF PORTB
BSF   STATUS,RP0
MOVWF TRISA
MOVWF TRISB
MOVLW 06H
MOVWF ADCON1
BCF   STATUS,RP0
RETLW 0
;--------------------------
MAIN
CALL  PORT_INIT
CLRW
MOVWF TEMP
BSF   STATUS,RP1
MOVLW 00
MOVWF EADRL
FLASH_READ_START
CALL  FLASH_READ
BSF   STATUS,RP1
INCF  EADRL,1
BCF   STATUS,RP1
INCF  TEMP,1
MOVLW 20H
SUBWF TEMP,0
BTFSS STATUS,Z
GOTO  FLASH_READ_START
BSF   STATUS,RP1
BCF   STATUS,RP0
MOVLW 80H
MOVWF EADRL
MOVLW 30H
MOVWF EDATAL
BCF   STATUS,RP1
MOVLW 00
MOVWF TEMP
FLASH_WRITE_START
CALL  FLASH_WRITE
BSF   STATUS,RP1
INCF  EADRL,1
BCF   STATUS,RP1
INCF  TEMP,1
MOVLW 10H
SUBWF TEMP,0
BTFSS STATUS,Z
GOTO  FLASH_WRITE_START
GOTO $
;--------------------------
FLASH_READ
BSF   STATUS,RP0
BSF   STATUS,RP1
FLASH_READ_WAIT
BTFSC EECON1,WR
GOTO  $-1
BCF   STATUS,RP0
MOVF  EADRL,0
MOVWF EEADR
MOVF  EADRH,0
MOVWF EEADRH
BSF   STATUS,RP0
BSF   EECON1,EEPGD
BSF   EECON1,RD
NOP
NOP
BCF   STATUS,RP0
MOVF  EEDATA,0
MOVWF EDATAL
MOVF  EEDATH,0
MOVWF EDATAH
BCF   STATUS,RP1
RETLW 0
;-------------------------------
FLASH_WRITE
BSF   STATUS,RP0
BSF   STATUS,RP1
FLASH_WRITE_WAIT
BTFSC EECON1,WR
GOTO $-1
BCF   STATUS,RP0
MOVF  EADRL,0
MOVWF EEADR
MOVF  EADRH,0
MOVWF EEADRH
MOVF  EDATAL,0
MOVWF EEDATA
MOVF  EDATAH,0
MOVWF EEDATH
BSF   STATUS,RP0
BSF   EECON1,EEPGD
BSF   EECON1,WREN

MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2

BSF   EECON1,WR
NOP
NOP
BCF   STATUS,RP0
BCF   STATUS,RP1
RETLW 0


END

出0入0汤圆

 楼主| 发表于 2007-12-6 09:29:07 | 显示全部楼层
bozai版主请帮忙看看

出0入0汤圆

发表于 2007-12-6 11:43:02 | 显示全部楼层
大哥,不是我说你,好歹给加个注释啊!这是汇编啊!不是C,还这么长的一段。

下面是我自己改写的子程序:用在12F675,16F630上时把这句:
BCF     EECON1,EEPGD 注释掉
用在16F877上直接使用。记得在程序开头处定义一下ADDR和VALU

;********************************************************
;写内部EEPROM子程序
;ADDR       ;要写入数据的EEPROM的地址
;VALU       ;要写入EEPROM的数据
;********************************************************
WRITEE:
    banksel   EECON1          ;选EECON1所在体。
    BTFSC    EECON1,WR        ;上一次写操作是否完成
    GOTO     $-1              ;否!返回继续检测
    banksel   ADDR            ;选ADDR所在体,就是bank0  
    MOVF      ADDR,W          ;取地址
    banksel   EEADR           ;选EEADR所在体
    MOVWF     EEADR           ;送地址寄存器
    banksel    VALU           ;选VALU所在体,就是bank0
    MOVF      VALU,W          ;取数据
    banksel   EEDATA          ;选EEDATA所在体
    MOVWF     EEDATA          ;送数据寄存器
    banksel   EECON1          ;选EECON1所在体
    BCF     EECON1,EEPGD      ;选定EEPROM为访问对象,在16F877中有用。12系列,部分16系列单片机没有EEPGD
    BSF     EECON1,WREN       ;开放写操作使能控制
    MOVLW   0x55              ;
    MOVWF   EECON2            ;送55H到寄存器EECON2(写内部EEPROM,这句是必须的)
    MOVLW   0xAA              ;   
    MOVWF   EECON2            ;送AAH到寄存器EECON2(写内部EEPROM,这句是必须的)
    BSF     EECON1,WR         ;启动写操作
    BCF     EECON1,WREN       ;禁止其他写操作发生
    NOP
    NOP
    banksel     VALU          ;恢复为bank 0
    return
;********************************************************
;读内部EEPROM子程序
;ADDR       ;要读出数据的EEPROM的地址
;VALU       ;读出的EEPROM的数据
;********************************************************

load_data                       ;读子程序
       banksel   ADDR           ;选ADDR所在体,就是bnak0   
REDAEE      
       MOVF      ADDR,W         ;取地址
       banksel    EEADR
       MOVWF      EEADR         ;送地址寄存器
       banksel    EECON1
       ;BCF        EECON1,EEPGD ;选定EEPROM为访问对象,在16F877中有用,这里没有
       BSF        EECON1,RD     ;开始读出
       banksel    EEDATA
       MOVF       EEDATA,W      ;将读出值送到W里
       banksel    VALU;bnak0
       MOVWF      VALU          ;存读出值到VALU
       return

出0入0汤圆

发表于 2007-12-6 12:43:52 | 显示全部楼层
呵呵,我没用过汇编。见笑了。
谢谢 flyunlimit

我看了下手册,感觉说的很清楚,也有示例代码的,不防看一下:


出0入0汤圆

 楼主| 发表于 2007-12-6 14:03:36 | 显示全部楼层
感谢兄弟们的回复。我马上试试,不过flyunlimit兄弟给的程序是针对EEPROM,虽然都可以操作,但是你的程序里没有
BSF   EECON1,EEPGD   ;这样才选择了FLASH,不是EEprom。我对EEPROM的试验读写都正常,换成FLASH的写就不行了,就是看不到改动的效果,0080处还是3fff。。
马上试下兄弟贴的程序,加一句BSF  EECON1,EEPGD


BOZAI兄弟不搞汇编的啊?呵呵,我都是先从汇编开始,搞C就容易点,对硬件就多了解点嘛,不过我都搞两样都不怎么样了!o(∩_∩)o...

出0入0汤圆

 楼主| 发表于 2007-12-6 14:17:57 | 显示全部楼层
问题无意中发现,还是自己的这个程序,程序是没有问题的,只是SIM仿真系统的数据更新问题,发现我一直按着让它执行,一定时间后数据才更新,这点似乎与DATASHEET上说的不符,本来应该是数据没有写完是不会执行下一步的,而倒是写完后,再写几个地址的数据时才这几个一起更新了,哈哈,希望是软件仿真的问题,下周等我的ICD2 PCB来了做个硬件仿真就好了!

其中2830是我写入的数据,不是一下就更新的,要等很久,不过指令倒是可以继续执行,纳闷!

出0入0汤圆

发表于 2007-12-6 15:44:08 | 显示全部楼层
呵呵,互相促进,我没有仔细看过877的Data Sheet,原来还能对FLASH编程啊!(EEP的那章我看了,可居然就把那么明显的FLASH给看漏了)一直纳闷877的EEPGD是干什么的。以为你要用EEPROM,所以给的是读写EEPROM的程序见谅了。877一直没有深入的用过,所以忽略了很多功能。

出0入0汤圆

 楼主| 发表于 2007-12-6 17:17:36 | 显示全部楼层
谢谢了啊,我是选它入门的,觉得PIC也还可以,就是开发工具似乎没有AVR那样百家齐放的景象。兄弟有比较好的能自制的编程器吗?
USB的!

出0入0汤圆

发表于 2007-12-6 21:35:55 | 显示全部楼层
点击此处下载ourdev_185954.rar(文件大小:2.39M)
USB转串的USB口编程器,老外设计的,用到的元件在阿莫那都有。
我用的版本是K150,基本支持全系列的PIC,可以并行编OTP,ISP接口可以引出,不过不是自己做的,淘宝上买别人做好的,1XX元。如果有什么问题,就直接按说明文件里的地址,到老外的网站上看,现在应该有更新的版本了。
提示,如果要烧写12F509,它在软件的种类列表的16CXX的后面(我以前没找到,还以为不能烧写12F509呢)。因为试图烧写一片坏的PIC,编程器烧过一回,发现这个编程器自我保护性差点;是一个PNP管烧了,用8550更换后就修好了,但好像8550不如原来的好(只是性能参数上)。

出0入0汤圆

 楼主| 发表于 2007-12-7 13:15:40 | 显示全部楼层
十分感谢flyunlimit兄弟
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 12:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表