3865|8

20

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

Atmega16的常量无法读取 [复制链接]

本帖最后由 ltwsq 于 2015-4-17 13:33 编辑

用CVAVR编写了一段程序,其中定义了一个常量数组。
flash unsigned int level_count[]={                                   0x0000,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0002,
                                   0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,0x0002,
                                   0x0002,0x0002,0x0003,0x0003,0x0003,0x0003,0x0003,0x0003,0x0003,0x0003,0x0003,0x0003,0x0003,0x0003,0x0003,0x0004,
                                   0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x0005,0x0006,
                                   0x0006,0x0006,0x0006,0x0006,0x0006,0x0007,0x0007,0x0007,0x0007,0x0007,0x0008,0x0008,0x0008,0x0008,0x0008,0x0009,
                                   0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000c,0x000c,0x000c,0x000d,0x000d,0x000d,
                                   0x000e,0x000e,0x000e,0x000f,0x000f,0x0010,0x0010,0x0011,0x0011,0x0012,0x0012,0x0013,0x0013,0x0014,0x0014,0x0015,
                                   0x0015,0x0016,0x0016,0x0017,0x0018,0x0018,0x0019,0x001a,0x001a,0x001b,0x001c,0x001d,0x001d,0x001e,0x001f,0x0020,
                                   0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002e,0x002f,0x0030,0x0031,
                                   0x0033,0x0034,0x0036,0x0037,0x0039,0x003a,0x003c,0x003e,0x003f,0x0041,0x0043,0x0045,0x0047,0x0048,0x004a,0x004d,
                                   0x004f,0x0051,0x0053,0x0055,0x0058,0x005a,0x005d,0x005f,0x0062,0x0065,0x0067,0x006a,0x006d,0x0070,0x0073,0x0076,
                                   0x007a,0x007d,0x0081,0x0084,0x0088,0x008c,0x008f,0x0093,0x0097,0x009c,0x00a0,0x00a4,0x00a9,0x00ae,0x00b2,0x00b7,
                                   0x00bc,0x00c2,0x00c7,0x00cd,0x00d2,0x00d8,0x00de,0x00e4,0x00ea,0x00f1,0x00f8,0x00fe,0x0105,0x010d,0x0114,0x011c,
                                   0x0124,0x012a,0x0134,0x013d,0x0145,0x014e,0x0158,0x0161,0x016b,0x0175,0x017f,0x018a,0x0195,0x01a0,0x01ab,0x01b7,
                                   0x01c3,0x01d0,0x01dd,0x01ea,0x01f8,0x0205,0x0214,0x0222,0x0232,0x0241,0x0251,0x0262,0x0272,0x0284,0x0296,0x02a8,
                                   0x02bb,0x02ce,0x02e2,0x02f6,0x030b,0x0321,0x0337,0x034e,0x0365,0x037d,0x0396,0x03af,0x03ca,0x03e4,0x03ff,0x03ff };
使用CVAVR编译时指定了把常量存入Flash。现在在AVR Studio4中使用JTAG ICE进行硬仿真。从加载的数据来看,这个数据已经正确加到Program区。如图2所示。

现在单步执行到i=i_Power_on_level,已经得到i=254,如图3所示。
那么向下执行到OCR1A= level_count,按理就是应该将这个level_count[]常量数组的第254项的值,此时应为0x03FF赋值给OCR1A,但执行之后,OCR1A的值依然是0。如图4所示。
    这是为什么呢?给人的感觉好象都没有从常量中取得该得的值。更奇怪的是,如果在AVR Studio4中进行软仿真,这个地方可以按程序的要求得到正确的值,这是为什么呢?

2.jpg (123.01 KB, 下载次数: 0)

2.jpg

3.jpg (51.35 KB, 下载次数: 0)

3.jpg

4.jpg (102.92 KB, 下载次数: 0)

4.jpg

最新回复

新版本的编译器一般会增加功能,修复bug和提高效率。因为你的问题描述比较少,看不到前后的部分,感觉不是语法问题。 我一般使用AVRGCC,没有用CVAVR和IAR。还没有遇到这样的问题,你也可以在proteus中仿真试试。   详情 回复 发表于 2015-4-17 21:10
点赞 关注
 

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 
没有看到你程序中i是怎样定义的,检查一下数据类型和定义方式,是char还是int,可以尝试增加volatile。

点评

i 定义为unsigned int  详情 回复 发表于 2015-4-17 13:58
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
dcexpert 发表于 2015-4-17 13:50
没有看到你程序中i是怎样定义的,检查一下数据类型和定义方式,是char还是int,可以尝试增加volatile。

i 定义为unsigned int
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

4
 
还有一个比较奇怪的问题,那就是我把程序直接改成OCR1A=0x03FF,硬仿真也不能将这个正确执行下去,执行完查看,依然是OCR1A=0
 
 
 

回复

1万

帖子

25

TA的资源

版主

5
 
这样语法正确,逻辑上有问题的,往往和程序的其他部分有关,直接在这个语句上是找不到问题的。比如看门狗、堆栈溢出。

点评

现在悲剧了,为了验证问题,我特意用一个变量来获取这个常量的值 i_temp=level_count; 结果硬仿真时发现这个变量可以被正确的赋值 但接下来用这样的赋值语句给OCR1A和OCR1B赋初值, OCR1A=  详情 回复 发表于 2015-4-17 14:27
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

6
 
dcexpert 发表于 2015-4-17 14:21
这样语法正确,逻辑上有问题的,往往和程序的其他部分有关,直接在这个语句上是找不到问题的。比如看门狗、堆栈溢出。


现在悲剧了,为了验证问题,我特意用一个变量来获取这个常量的值
i_temp=level_count;
结果硬仿真时发现这个变量可以被正确的赋值
但接下来用这样的赋值语句给OCR1A和OCR1B赋初值,
    OCR1A= level_count;
    OCR1B= 0x03FF;
调试观察时,其值总为0,原来并不是常量的值取不到,而是对TIME1的OCR1A和OCR1B赋值不成功,为什么会存在这种情况呢?

1.jpg (79.09 KB, 下载次数: 0)

1.jpg
 
 
 

回复

1万

帖子

25

TA的资源

版主

7
 
升级一下编译器吧。

点评

请问一下大神,这个和编译器版本也有关系吗  详情 回复 发表于 2015-4-17 16:53
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

8
 
dcexpert 发表于 2015-4-17 14:34
升级一下编译器吧。

请问一下大神,这个和编译器版本也有关系吗

点评

新版本的编译器一般会增加功能,修复bug和提高效率。因为你的问题描述比较少,看不到前后的部分,感觉不是语法问题。 我一般使用AVRGCC,没有用CVAVR和IAR。还没有遇到这样的问题,你也可以在proteus中仿真试  详情 回复 发表于 2015-4-17 21:10
 
 
 

回复

1万

帖子

25

TA的资源

版主

9
 
ltwsq 发表于 2015-4-17 16:53
请问一下大神,这个和编译器版本也有关系吗

新版本的编译器一般会增加功能,修复bug和提高效率。因为你的问题描述比较少,看不到前后的部分,感觉不是语法问题。



我一般使用AVRGCC,没有用CVAVR和IAR。还没有遇到这样的问题,你也可以在proteus中仿真试试。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表