历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2020年01月07日 | PIC单片机RC振荡器的使用及校准方法

2020-01-07 来源:elecfans

在PIC的单片机中有多种型号有内部RC振荡器的功能,从而省去了晶振,不但节省了成本,并且我们还多了两个IO端口可以使用。


但是,由于RC振荡器中电阻、电容的离散性很大,因此,在有内部RC振荡器的单片机中,它的内部RAM中都会有一个名为OSCCAL的校准寄存器,通过置入不同的数值来微调RC振荡器的振荡频率。并且,单片机的程序存储器中,也会有一个特殊的字来储存工厂生产时测得的校准值。下面我以常用的12C508A和12F629为例加以说明。


PIC单片机RC振荡器的使用及校准方法

12C508A的复位矢量是程序的最高字0x1FF,这个字节生产商已经固定的烧写为MOVLW 0xXX,指令执行后,W寄存器中即为校准值XX,当我们需要校准时,那么,在紧接着的地址0x0应该是一条这样的指令:MOVWF OSCCAL。接下去RC振荡器就会以标准的振荡频率运行了。


12F629的校准值也存放在最高字--0x3FF中,内容是RETLW 0xXX,但它的复位矢量却是0x0。这样,在我们需要校准RC振荡器时,在初始化过程中要加上下面两句:

CALL 0x3ff

MOVWF OSCCAL

当然,你还要注意寄存器的块选择位。

以前,我在做项目时,没太注意这个问题,这是因为在使用12C508A时,HI-TECH在进行编译时已经偷偷地替我们做了这项工作。它会在程序的0x0处自动加一条MOVWF OSCCAL。用12F629做接收解码代替2272时也没发生什么问题,但是在用被它作滚动码解码器时却发现接收距离的离散性很大。经多次试验终于找出是没对振荡器的振荡频率进行校正所至。


因此,需要另外编写用于校正的语句,我用了两种方法来实现这个目的:

1、用内嵌汇编的形式

#asm //此段汇编程序用于将位于程序段3FFH的

call 3ffh //内部RC振荡器的校准值放入校准寄存器,

bsf _STATUS,5 //在进行C语言调试时应屏蔽这段程序

movwf _OSCCAL

#endasm


2、用C语言标准形式

const unsigned char cs @ 0x3ff; //在函数体外

。..

OSCCAL=cs; //仿真时屏蔽此句

用这两种方法都有一个小缺陷--仿真时,程序无法运行,这是由于C编译器并没有为我们在0x3FF放置一条RETLW 0xXX的语句。因此,程序运行到这里之后,并没有把一个常数(校准值)放入W寄存器然后返回,而是继续执行这条语句的下一句--0x0及其之后的程序,也就是说程序到此就乱了。因此如程序后面注释所示,在仿真时,应先屏蔽这几句程序。在程序调试完成后,需要烧写时,把注释符去掉,再编译一次就可以了。


我还有一种想法,不用屏蔽语句,那就是用函数来实现,就是在0x3FF起建立一个函数,函数体内只有一条语句,如下:

char jz()

{

return 0;

}

当然,还要考虑C函数返回时,一定会选择寄存器0,实际上这个函数的起始地址应小于0x3FF。但是我找了我所能找到的参考资料,并上网找了多次,也没找到为函数绝对定位的方法,希望有知道的朋友指点一下。


还有,12C508A是一次性编程的,并且0x1FF处的内容,我们是无法改变的,也就是说你在此处编写任何指令,编程器都不会为你烧写,或者说即使烧写了也不会改变其中的内容。

可12F629是FLASH器件,可多次编程,如果你没有故意选择,正品的编程器(如Microchip的PICSTART PLUS)是不会对存有校准值的程序空间进行编程的。即使你无意中对这个程序空间进行了编程,你也可以用一条RETLW 0xXX放在0x3FF处再编程一次就可以了,但这个XX值可能是不正确的,需经实验确定(请参考后面说明)。


为了检验OSCCAL的值对振荡器频率的影响,特编写了下面一个小程序进行验证:

#include

//*********************************************************

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & BOREN & PROTECT & CPD);

//内部RC振荡器普通IO口;无效看门狗;上电延时;内部复位;掉电复位;代码保护;数据保护

//*********************************************************

#define out GPIO0 //定义输出端

#define jc GPIO3 //定义检测端

//*********************************************************

void interrupt zd(); //声明中断函数

//主函数***************************************************

void main()

{

CMCON=7;

OPTION=0B00000011; //分频比为1:16,

TRISIO=0B11111110;

GPIO=0B00000000;

WPU=0;

T0IF=0;

GIE=1;

T0IE=1;

while(1){

if(jc)OSCCAL=0xFF;

else OSCCAL=0;

}

}

//中断函数*************************************************

void interrupt zd()

{

T0IF=0;

out=!out;

}

程序其实很简单,就是在中断中让out脚的电平翻转,翻转的时间为4096个指令周期,电平周期为8192个指令周期。而指令的周期又决定于RC时钟频率。在主程序中,不断的检测JC端口的电平,然后根据此端口电平的值修改OSCCAL寄存器的值。当然,最后从OUT脚的波形周期上反映出了OSCCAL寄存器的值改变。


经用示波器测量(抱歉,手边没有频率计),JC端接地时,OUT端的电平周期为9.5毫秒左右;而JC端接正电源时,OUT端的电平周期为6毫秒左右。也就是说OSCCAL的值越大,单片机的时钟频率越高。并且,这个变化范围是很大的,因此,如果使用PIC单片机的内部RC振荡器时,对其振荡频率进行校正是十分必要的。这也是我在做滚动码接收解码器时,产品离散性很大的原因。望大家以后使用内部RC振荡器时能够注意到此点。


但还有一点要注意,即使你对RC振荡器进行了校正,你也别指望这个4MHz的RC振荡器肯定会很标准,实际上它还是一个RC振荡器,它的振荡频率是电压、温度的函数,也就是说这个振荡频率会随着电压和温度的变化而变化,只是经校正后的值更接近4MHz罢了,这在产品开发的一开始就要注意的。

推荐阅读

史海拾趣

Elprotronic Inc.公司的发展小趣事

在Elprotronic Inc.公司创立的初期,面临着电子元器件市场竞争激烈、技术更新迅速的挑战。公司创始人凭借对电子元器件市场的深刻理解和敏锐的洞察力,决定专注于提供高质量和可靠的嵌入式MCU闪存编程解决方案。他们深知,在电子行业,产品质量和技术创新是企业生存和发展的关键。因此,Elprotronic Inc.从一开始就注重技术研发和产品质量控制,逐渐在市场上树立了良好的口碑。

EMCORE公司的发展小趣事

在电子行业中,客户服务质量直接关系到企业的声誉和市场竞争力。Elprotronic Inc.深知这一点,因此一直致力于优化客户服务体系。他们建立了专业的客户服务团队和客户服务热线电话等多种渠道来及时解答客户的咨询和问题。同时,公司还定期开展客户满意度调查活动收集客户反馈和建议以便及时改进和优化产品和服务。这些努力使得Elprotronic Inc.在客户服务方面赢得了良好的口碑和信誉也为公司的长期发展奠定了坚实的基础。

请注意,以上故事均为虚构内容,旨在展示Elprotronic Inc.公司可能的发展路径和故事。实际情况可能有所不同,具体细节请以公司官方发布的信息为准。

扬州国芯(Gcore)公司的发展小趣事

品质管理一直是Elprotronic Inc.非常重视的一项工作。公司建立了一套完善的品质管理体系,从原材料采购到产品生产、检测、包装等各个环节都进行严格把关。同时,公司还引入了先进的生产设备和技术手段,提高了产品的生产效率和质量水平。此外,公司还定期组织员工进行品质管理培训和学习交流活动,不断提升员工的品质意识和技能水平。这些措施的实施使得Elprotronic Inc.的产品质量得到了进一步提升和保障。

Diamond SA公司的发展小趣事

在电子行业竞争日益激烈的背景下,Diamond SA公司开始寻求通过并购来实现规模扩张和资源整合。他们精心挑选了一些具有潜力的目标企业,通过谈判和交易成功完成了并购。这些并购不仅为Diamond SA公司带来了更多的技术资源和市场份额,还增强了公司的整体竞争力。

Brilliance公司的发展小趣事

在国内市场取得一定成功后,Brilliance公司开始将目光投向国际市场。公司制定了详细的国际化战略,积极寻求与国际知名企业的合作机会。通过与国外合作伙伴的共同努力,Brilliance的产品逐渐打入国际市场,并获得了良好的口碑。同时,公司还积极参加国际电子展会和交流活动,提升了品牌知名度和影响力。

GardTec Inc公司的发展小趣事

背景:在电子产品行业,产品品质和安全合规性至关重要。GardTec深知这一点,始终将产品品质放在首位。

发展:公司建立了严格的质量控制体系,确保每一件产品都符合最高的品质标准。同时,GardTec还积极遵循国际安全标准和法规要求,如REACH/RoHS等,确保产品的合规性。

影响:高品质的产品和严格的合规性要求,使得GardTec在电子行业中赢得了客户的信赖和好评,进一步提升了公司的品牌形象和市场竞争力。

问答坊 | AI 解惑

wince+directshow的视频采集的问题

因开发需要在做DirectShow视频采集的程序在开发中遇到为何老是提示:Error   Creating   Device   Enumerator。已安装硬件设备,请高手指点。      程序代码如下:       ...…

查看全部问答>

u盘+数据读写

ClassGUID={36FC9E60-C465-11CF-8056-444553540000}这个是mass stor的guid么?我自己做了个u盘,平时可以从u盘读设备的纪录信息,但是我要设置设备的一些信息或开启某些功能就想用VC写个程序来控制。不知道大家有什么好方法。u盘我已经留出了几个没 ...…

查看全部问答>

LED散热陶瓷新发展 金属化技术取得突破

陶瓷材料因本身具有优良的绝缘、耐热及稳定等先天特性,所以被大量运用在电气设备的绝缘上,又因陶瓷金属化技术的成熟,近几年更被应用于led陶瓷散热基板与载板的线路铺设。陶瓷材料金属化技术主要分为「DBC(Direct Bonded Copper) 」及「DPC(Di ...…

查看全部问答>

ORI与SBR的区别

大家好,本人初学avr,在看到汇编指令中ORI与SBR都是寄存器与立即数与的操作,不明白这两条指令的区别在哪里?多谢指导…

查看全部问答>

ADUC7060 之I2C

/******************************************************************************            I2C 主机寄存器 I2CMCON (I2C 主机控制寄存器)I2CMSTA (I2C 主机状态寄存器)I2CMRX&nb ...…

查看全部问答>

TI LM3S811学习心得

记录学习LM3S的点点滴滴 (声明:该学习心得是本人通过学习周立功的相关资料后的个人理解后的笔记,由于本人水平有限,也许会有错误或是偏差,若想要保证准确无误,建议自己去下相关资料学习,本心得只供参考,若有错误之处,敬请指出,万分感谢 ...…

查看全部问答>

Windows驱动开发前景求教

       在坛子里也算有段时间了,在这里学到了很多东西。大四毕业的时候毕设做的是有关FPGA的,承蒙坛子里的坛友帮助,帮我解决了一个很大的问题。现在我在一所普通院校里读研,已经研一了。上半年搞了半年的FPGA相关的东 ...…

查看全部问答>

串口调试出现乱码,那位大哥大姐能帮帮我,万分感谢!

我用Verilog HDL编写了一个rs232串口驱动程序。在用串口调试助手进行调试时,当我发送2,4,6,8,A,C,E时,接受没有出现一个乱码,但当我发送1,3,5,7,9,B,D,F时出现乱码,在每300中出现4——5个乱码,有时只出现一个。请问这是什么原因,还是 ...…

查看全部问答>

出5509开发板+YXxds510仿真器

如题,出5509开发板+YXxds510仿真器,自定义为8成新以上,包好一起300不包邮 QQ 282774356…

查看全部问答>

LM3S SSI AD采样?

程序如下,设置断点发下程序执行到红色部分就不再往下执行了,不知道为什么。 int main(void) {     unsigned long ulDataTx[NUM_SSI_DATA];     unsigned long ulDataRx[NUM_SSI_DATA];     unsigned long ul ...…

查看全部问答>