搜索
bottom↓
回复: 19

我理解的内部RC 振荡器校准字节的正确使用方法!

[复制链接]

出0入0汤圆

发表于 2005-2-16 11:28:00 | 显示全部楼层 |阅读模式
我认为,在程序中是不应该直接用OSCCAL=0xA5这样的语句的,因为如果你大批量烧写芯片,还必须每一个芯片都读一次校准值,然后在程序中修改校准值,编译,烧写吗?所以正确的做法只能是用烧写软件自动把读取的校准值放在程序Flash的空余部分,比如最高地址(Mega8的8K的最高地址0x1FFF),在程序中用通用的指针变量的OSCCAL赋值语句即可实现比较自动的校准了。

遗憾啊,SL下载软件从界面上看应该有这个功能,可是下载了一看0x1FFF的地址内容与读取的校准字节的内容不一样,是我操作错误呢?还是软件有问题?

请名家指点一二!

另外Proyrog就不行了,可以直接修改烧写文件的缓冲区(比如修改最高地址为校准值),但还不是变成了一个芯片修改一次了吗,从这一点看,双龙的软件还是不错的!

出0入0汤圆

 楼主| 发表于 2005-2-16 13:03:01 | 显示全部楼层
双龙软件没问题,是我操作错误!

出0入0汤圆

发表于 2005-2-16 13:40:19 | 显示全部楼层
你的想法是正确的,我可以提供这样的烧录设备.

出0入0汤圆

 楼主| 发表于 2005-2-16 20:15:11 | 显示全部楼层
建议站长按照上述思路修改新手入门范例中的内部RC校准部分!以使它更经典!
头像被屏蔽

出0入0汤圆

发表于 2005-2-16 20:50:19 | 显示全部楼层
所谓的新手入门的第一个范例,当然不适合搞得这么复杂。否则,就变成了“从入门到精通”了 :)

出0入8汤圆

发表于 2005-2-17 01:12:27 | 显示全部楼层
请问楼主,如何用指针从程序存储器读出其校正值,如何从程序存储器读出某个字节的数据??

出0入0汤圆

 楼主| 发表于 2005-2-17 07:32:34 | 显示全部楼层
比如codevision中

声明部分:

char flash *OSCCAL_Value_Flash;

主程序中:

OSCCAL_Value_Flash=0x1FFF;//校准值放在了0x1FFF

OSCCAL=*OSCCAL_Value_Flash;

出0入4汤圆

发表于 2005-2-17 09:14:42 | 显示全部楼层
怎么计算这个校准值呢?我着两天正在琢磨这个问题呢

出0入8汤圆

发表于 2005-2-17 10:13:24 | 显示全部楼层
xuyankang 琴剑飘零,

使用ICC编译器,指示错误

OSCCAL_Value_Flash=0x1FFF;//校准值放在了0x1FFF

E F:\AVR\m8.c(18): operands of = have illegal types `pointer to const unsigned int' and `int'

出0入4汤圆

发表于 2005-2-17 10:29:47 | 显示全部楼层
我把校准值放在EEPROM的0x1ff地址了,应该没关系吧?

出0入4汤圆

发表于 2005-2-17 10:31:31 | 显示全部楼层
不过楼主的这种做法,实际上在下载程序的时候还要读取校准值,然后写入

出0入8汤圆

发表于 2005-2-17 11:13:15 | 显示全部楼层
终于在ICC编译器中搞出来了,



声明部分:

const unsigned int *OSCCAL_Value_Flash;//定义指向flash存储器的指针



在主程序中:

OSCCAL_Value_Flash=(unsigned int *)0x1fff; //将地址0x1fff放进OSCCAL_Value_Flash

                                          //强制转换

OSCCAL=*OSCCAL_Value_Flash;              //从0x1fff中读出校正值放进OSCCAL

出0入0汤圆

发表于 2005-2-17 20:06:37 | 显示全部楼层
受益匪浅,感谢分享!

出0入0汤圆

 楼主| 发表于 2005-2-17 20:24:57 | 显示全部楼层
其实你做的程序一般都到不了Flash的结尾,所以把校准值放在Flash结尾挺好的,这也就是为什么双龙下载软件默认放到结尾。当然放在任何地方都行,只要不修改了程序段就行。

我也不知道校准值怎么来的,只知道它可以校准频率,防止CPU读写Flash或E2P错误,或者UART,我使用校准值也是用下载软件读出的(详见新手入门),双龙软件还提供补偿功能,但我也不知道补偿的依据怎么找,所以补偿值为零即可。

在不同的IDE环境对于指针变量的定义可能稍有区别,朋友们自己琢磨。



最后还是建议站长把此帖思想加到范例中去。

出0入0汤圆

发表于 2005-2-17 23:11:13 | 显示全部楼层
哈哈,大家同为AVR菜鸟。。。



这个问题本来就应该这样处理,当然也可存入EEPROM中。

出0入8汤圆

发表于 2005-2-18 00:17:33 | 显示全部楼层
一点想不通??M8的说明书中介绍到大部份的AVR指令为16位宽,因此程序存储器的Flash结构为4KX16位。。。。。M8的程序计数器(PC)的字长为12位宽,可以寻址整个的4K程序存储器空间。(0x0000----0xfff),但现在将其校正值定在0x1fff(8K)那不就超出M8的寻址范围吗?为何程序可以正常读出呢???请各位大虾指点一下,

出0入0汤圆

发表于 2005-2-18 01:39:49 | 显示全部楼层
pgm_read_byte()函数已经考虑到此问题。



Flash存储应该是按字存储的,不过分高低各8位。

当地址为偶数时取低8位,为奇数时取高8位。



M8的程序计数器(PC)的字长为12位宽表明寻址范围为0x0000----0xfff。

但并不表明它取不回一个字或2个字节。

出0入0汤圆

发表于 2005-2-18 01:45:19 | 显示全部楼层
0x1FFF是以字节为单位的,以字为单位则为0xfff,不超出M8的寻址范围。



  AVR使用使用指令lpm读取Flash中的一个字节(没有读一个字的指令),而且LMP指令只能使用Z寄存器对Flash存储器间址取数。

  由于程序存储器的地址是以字(双字节)为单位的,因此,16位地址指针寄存器Z的高15位为程序存储器的字地址,最低位LSB为“0”时,指字的低字节;为“1”时,指字的高字节。



  在高级语言中,编译系统根据AVR的这一特点,已经自动将字节(面向用户)和字(内部程序使用)的地址进行了必要的转换,不需要程序员过多的考虑,可以按字节习惯编写程序的。但使用和阅读汇编时,要千万注意的,请参考我给出的AVR汇编的例子。

出0入8汤圆

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

本版积分规则

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

GMT+8, 2024-5-11 02:49

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

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