打印

如何用C(HI-TECH )写芯片内EEPROM?

[复制链接]
4874|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
与时俱进|  楼主 | 2008-7-21 10:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在程序中给eeprom整型变量赋值时,使用软件仿真运行正常,为什么使用ICD2调试却只能写入整型低位的数据,高位却不变?有什么要注意的呢?
程序大致如下,只开TIMER0中断,观察内部eeprom时作了刷新。

unsigned int temperature,voltage;
eeprom unsigned int temperature6,voltage6;
main()
{
......
temperature6=temperature;
voltage6=voltage;
......
}
沙发
兰天白云| | 2008-7-22 08:21 | 只看该作者

eeprom是一字节一字节写进的

一个整型要2字节

使用特权

评论回复
板凳
与时俱进|  楼主 | 2008-7-22 11:04 | 只看该作者

HI-TECH的用户手册里提供的方法

以下是HI-TECH的用户手册里的eeprom变量声明及访问方法:
声明:eeprom unsigned int serial_number = 0x1234;
可以在运行时访问(写入):
serial_number = 0xAA55;

使用特权

评论回复
地板
yewuyi| | 2008-7-22 13:55 | 只看该作者

2楼已经说明了问题的原因

eeprom unsigned int serial_number = 0x1234;
这是代表了定义了变量,不代表这个变量直接就能从EEPROM‘飞’出来,请认真看芯片的数据手册

使用特权

评论回复
5
与时俱进|  楼主 | 2008-7-22 16:05 | 只看该作者

我知道写eeprom时是一个字节一个字节写入的

eeprom unsigned int serial_number = 0x1234;
这是定义整型变量,并且变量放在eeprom里,后面的‘= 0x1234’代表编程器给eeprom写入预定义值0x1234,相当于汇编的 de 0x34,0x12

serial_number = 0xAA55;
这是(c语言)程序运行时往eeprom里写入0xaa55的!

使用特权

评论回复
6
与时俱进|  楼主 | 2008-7-23 11:20 | 只看该作者

ICD2硬件调试不正常,可是软仿真是正常的!


硬件调试发现只写入整型的低字节。程序基本按照HI-TECH PICC V9.50的用户手册,以下是该手册的章节 3.2.5.1 EEPROM Access
........
In addition to the above, the compiler also provides the eeprom qualifier as an alterntive method
to configure and access EEPROM. The eeprom qualifier may only be applied to global and/or static
variables and this indicates to the compiler that the object should reside in EEPROM memory. For
example:
eeprom unsigned int serial_number = 0x1234;
this will create an eeprom “variable” which is predefined with the value 0x1234. This would be
equivalent to using the EEPROM_DATA macro with 0x12 and 0x34 as two of its parameters. The
eeprom variable may be read/written at runtime:
serial_number = 0xAA55;
and the compiler will produce the appropriate code to access EEPROM. Unlike conventional RAM
variables, if an intialized EEPROM variable is modified during runtime, next time the processor is
reset the variable will contain the updated value, not the original initialization value. So in the above
example, the first time the processor starts up, serial_number will contain 0x1234, however after
this is changed to 0xAA55, serial_number will never revert back to the original 0x1234 value, even
after reset, unless explicitly programmed to do so.

使用特权

评论回复
7
兰天白云| | 2008-7-23 13:39 | 只看该作者

注意写和读

serial_number = 0xAA55;
这是(c语言)程序运行时往eeprom里写入0xaa55的!

贴出汇编后的代码看看

使用特权

评论回复
8
yewuyi| | 2008-7-23 14:15 | 只看该作者

呵呵,不好意思,我的9.50版本一直不能用

使用特权

评论回复
9
与时俱进|  楼主 | 2008-7-23 14:34 | 只看该作者

真是太感谢了,兰天白云

---  I:EE_TEST.c  ------------------------------------------------------------------------
1:                 #include <pic.h>              //包含单片机内部资源预定义
2:                 #include <pic16f91x.h>
3:                  __CONFIG(0xe8b5); 
4:                 
5:                 unsigned int i;
6:                 eeprom unsigned int serial_no=0x1234;
7:                 
8:                 main()
9:                 {    serial_no=0x55aa;
   797    30AA     MOVLW 0xaa
   798    00F0     MOVWF 0x70
   799    3055     MOVLW 0x55
   79A    00F1     MOVWF 0x71
   79B    3070     MOVLW 0x70
   79C    00A2     MOVWF 0x22
   79D    3080     MOVLW 0x80
   79E    00A3     MOVWF 0x23
   79F    3002     MOVLW 0x2
   7A0    00A4     MOVWF 0x24
   7A1    3000     MOVLW 0
   7A2    118A     BCF 0xa, 0x3
   7A3    27CB     CALL 0x7cb
   7A4    118A     BCF 0xa, 0x3
10:                    NOP();
   7A5    0000     NOP
11:                    NOP();        
   7A6    0000     NOP
12:                }
   7A7    0183     CLRF 0x3

使用特权

评论回复
10
与时俱进|  楼主 | 2008-7-23 14:36 | 只看该作者

更详细的,好像天衣无缝

 Line  Address  Opcode Label                Disassembly              

  1944   0797  30AA   main    MOVLW 0xaa                             
  1945   0798  00F0           MOVWF 0x70                             
  1946   0799  3055           MOVLW 0x55                             
  1947   079A  00F1           MOVWF 0x71                             
  1948   079B  3070           MOVLW 0x70                             
  1949   079C  00A2           MOVWF 0x22                             
  1950   079D  3080           MOVLW 0x80                             
  1951   079E  00A3           MOVWF 0x23                             
  1952   079F  3002           MOVLW 0x2                              
  1953   07A0  00A4           MOVWF 0x24                             
  1954   07A1  3000           MOVLW 0                                
  1955   07A2  118A           BCF PCLATH, 0x3                        
  1956   07A3  27CB           CALL 0x7cb                             
  1957   07A4  118A           BCF PCLATH, 0x3                        
  1958   07A5  0000           NOP                                    
  1959   07A6  0000           NOP                                    
  1960   07A7  0183           CLRF STATUS                            
  1961   07A8  118A           BCF PCLATH, 0x3                        
  1962   07A9  2800           GOTO 0                                 
  1963   07AA  0183           CLRF STATUS                            
  1964   07AB  00A2           MOVWF 0x22                             
  1965   07AC  00A3           MOVWF 0x23                             
  1966   07AD  0822           MOVF 0x22, W                           
  1967   07AE  1703           BSF STATUS, 0x6                        
  1968   07AF  008D           MOVWF PIR2                             
  1969   07B0  1683           BSF STATUS, 0x5                        
  1970   07B1  1C8C           BTFSS PIR1, 0x1                        
  1971   07B2  2FC4           GOTO 0x7c4                             
  1972   07B3  2FB0           GOTO 0x7b0                             
  1973   07B4  1683           BSF STATUS, 0x5                        
  1974   07B5  1703           BSF STATUS, 0x6                        
  1975   07B6  138C           BCF PIR1, 0x7                          
  1976   07B7  140C           BSF PIR1, 0                            
  1977   07B8  1283           BCF STATUS, 0x5                        
  1978   07B9  1303           BCF STATUS, 0x6                        
  1979   07BA  0823           MOVF 0x23, W                           
  1980   07BB  0084           MOVWF FSR                              
  1981   07BC  1383           BCF STATUS, 0x7                        
  1982   07BD  1703           BSF STATUS, 0x6                        
  1983   07BE  080C           MOVF PIR1, W                           
  1984   07BF  0080           MOVWF INDF                             
  1985   07C0  1303           BCF STATUS, 0x6                        
  1986   07C1  0AA3           INCF 0x23, F                           
  1987   07C2  1703           BSF STATUS, 0x6                        
  1988   07C3  0A8D           INCF PIR2, F                           
  1989   07C4  1283           BCF STATUS, 0x5                        
  1990   07C5  1303           BCF STATUS, 0x6                        
  1991   07C6  03A3           DECF 0x23, F                           
  1992   07C7  0F23           INCFSZ 0x23, W                         
  1993   07C8  2FB4           GOTO 0x7b4                             
  1994   07C9  0822           MOVF 0x22, W                           
  1995   07CA  0008           RETURN                                 
  1996   07CB  0183           CLRF STATUS                            
  1997   07CC  00A5           MOVWF 0x25                             
  1998   07CD  0822           MOVF 0x22, W                           
  1999   07CE  00A6           MOVWF 0x26                             
  2000   07CF  0823           MOVF 0x23, W                           
  2001   07D0  00A7           MOVWF 0x27                             
  2002   07D1  0825           MOVF 0x25, W                           
  2003   07D2  1703           BSF STATUS, 0x6                        
  2004   07D3  008D           MOVWF PIR2                             
  2005   07D4  1683           BSF STATUS, 0x5                        
  2006   07D5  138C           BCF PIR1, 0x7                          
  2007   07D6  2FF9           GOTO 0x7f9                             
  2008   07D7  0827           MOVF 0x27, W                           
  2009   07D8  00A9           MOVWF 0x29                             
  2010   07D9  0826           MOVF 0x26, W                           
  2011   07DA  120A           BCF PCLATH, 0x4                        
  2012   07DB  118A           BCF PCLATH, 0x3                        
  2013   07DC  200E           CALL 0xe                               
  2014   07DD  120A           BCF PCLATH, 0x4                        
  2015   07DE  118A           BCF PCLATH, 0x3                        
  2016   07DF  1703           BSF STATUS, 0x6                        
  2017   07E0  008C           MOVWF PIR1                             
  2018   07E1  1303           BCF STATUS, 0x6                        
  2019   07E2  0AA6           INCF 0x26, F                           
  2020   07E3  1903           BTFSC STATUS, 0x2                      
  2021   07E4  0AA7           INCF 0x27, F                           
  2022   07E5  1683           BSF STATUS, 0x5                        
  2023   07E6  1703           BSF STATUS, 0x6                        
  2024   07E7  188C           BTFSC PIR1, 0x1                        
  2025   07E8  2FE5           GOTO 0x7e5                             
  2026   07E9  1003           BCF STATUS, 0                          
  2027   07EA  1F8B           BTFSS INTCON, 0x7                      
  2028   07EB  2FEE           GOTO 0x7ee                             
  2029   07EC  1403           BSF STATUS, 0                          
  2030   07ED  138B           BCF INTCON, 0x7                        
  2031   07EE  150C           BSF PIR1, 0x2                          
  2032   07EF  3055           MOVLW 0x55                             
  2033   07F0  008D           MOVWF PIR2                             
  2034   07F1  30AA           MOVLW 0xaa                             
  2035   07F2  008D           MOVWF PIR2                             
  2036   07F3  148C           BSF PIR1, 0x1                          
  2037   07F4  110C           BCF PIR1, 0x2                          
  2038   07F5  1803           BTFSC STATUS, 0                        
  2039   07F6  178B           BSF INTCON, 0x7                        
  2040   07F7  1283           BCF STATUS, 0x5                        
  2041   07F8  0A8D           INCF PIR2, F                           
  2042   07F9  1283           BCF STATUS, 0x5                        
  2043   07FA  1303           BCF STATUS, 0x6                        
  2044   07FB  03A4           DECF 0x24, F                           
  2045   07FC  0F24           INCFSZ 0x24, W                         
  2046   07FD  2FD7           GOTO 0x7d7                             
  2047   07FE  0825           MOVF 0x25, W                           
  2048   07FF  0008           RETURN        

   15   000E  1283           BCF STATUS, 0x5                        
    16   000F  1303           BCF STATUS, 0x6                        
    17   0010  00A8           MOVWF 0x28                             
    18   0011  1BA9           BTFSC 0x29, 0x7                        
    19   0012  281C           GOTO 0x1c                              
    20   0013  1B29           BTFSC 0x29, 0x6                        
    21   0014  2824           GOTO 0x24                              
    22   0015  0829           MOVF 0x29, W                           
    23   0016  008A           MOVWF PCLATH                           
    24   0017  0828           MOVF 0x28, W                           
    25   0018  0AA8           INCF 0x28, F                           
    26   0019  1903           BTFSC STATUS, 0x2                      
    27   001A  0AA9           INCF 0x29, F                           
    28   001B  0082           MOVWF PCL                              
    29   001C  1383           BCF STATUS, 0x7                        
    30   001D  1829           BTFSC 0x29, 0                          
    31   001E  1783           BSF STATUS, 0x7                        
    32   001F  0828           MOVF 0x28, W                           
    33   0020  0AA8           INCF 0x28, F                           
    34   0021  0084           MOVWF FSR                              
    35   0022  0800           MOVF INDF, W                           
    36   0023  0008           RETURN                                  



使用特权

评论回复
11
yewuyi| | 2008-7-23 16:01 | 只看该作者

从汇编代码里面看,显然不具备写2个字节到EE的代码

你的这个写法,如果不是理解错,那么就是用错了,你仔细看看DATASHEET里面有关EEPROM的那节内容就知道,你的这个想法应该是不可行的。

PIC的EEPROM没有页写功能(以前有人提过,但MCP没有采纳),所以每次只能写一个字节到EEPROM,写一个直接到EEPROM需要5MS的时间,也就是你发出写命令后,需要5MS的时间才能再次执行写操作,你要求写一个整型也就是2个字节的数据到EEPROM,那么至少需要执行两次写操作,并且两次中间有一个至少5MS的延迟,从反汇编代码看,连最白痴的DELAY也没有,显然这是不可能写进去两个字节的。


你可以结合软仿真一步一步执行看看结果。

使用特权

评论回复
12
yewuyi| | 2008-7-23 16:18 | 只看该作者

在俺的PICC8.05里面

eeprom unsigned int serial_number = 0x1234;
这样的定义不能正确编译,呵呵,没办法了。。。

使用特权

评论回复
13
与时俱进|  楼主 | 2008-7-23 16:55 | 只看该作者

回11楼:再说一次:软仿真没问题!

 1970   07B1  1C8C           BTFSS PIR1, 0x1       
2024   07E7  188C           BTFSC PIR1, 0x1
由于PIR1、EECON1两者只是bank不同,上述语句应该是
BTFSS EECON1,WR
因此两个语句应该就是判断写是否完成的吧?没完成则等待! 
而且大概看了一下,好像在读eeprom时也有这个判断是否在写eeprom的语句,说明hi-tech还是想得很周到的。               

使用特权

评论回复
14
yewuyi| | 2008-7-23 17:01 | 只看该作者

你直接烧片测试是否写入不就得了。。。

ICD2调试的时候,可能是中断的问题造成的,在EEPROM写的时候一般要求关闭中断的了

使用特权

评论回复
15
与时俱进|  楼主 | 2008-7-23 22:53 | 只看该作者

回复: 你直接烧片测试是否写入不就得了。。。

呵呵,就是烧写后发现只能写入低字节!才去做的调试。
难道大家都没这样用过?
看来只能规矩点,自己编写eeprom程序了。谢谢楼上各位热心帮助!

使用特权

评论回复
16
兰天白云| | 2008-7-24 08:41 | 只看该作者

楼主的程序写好象没问题,但读就难说了

这样试试,用自己的程序写,然后找个读的工具读数据,看看是写的问题还是读的问题

使用特权

评论回复
17
与时俱进|  楼主 | 2008-7-24 09:33 | 只看该作者

谢谢版主热心,应该是写的问题

一楼的程序并没有读的语句,是从观察窗口得知没写成功的,也就是说读是用ICD2的功能,不会有问题的。
相反,我的实际程序中有这样的读语句 volt=voltage6,这是读eeprom语句并赋值给整型变量volt,实际运行结果是正确的。

使用特权

评论回复
18
与时俱进|  楼主 | 2008-7-29 11:26 | 只看该作者

只好使用eeprom_write()

和eeprom_read()两函数,不过组装及分拆int成char有些烦,而且直接使用固定地址对eeprom变量进行访问不符合编程规范。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

1290

帖子

2

粉丝