AVR单片机中晶振校准如何实现?怎么测晶振是否校准?

AVR单片机中晶振校准如何实现?怎么测晶振是否校准?,第1张

AVR本身功能只能校准片内RC吧,外部晶振本身就是一个基准,正常情况下偏差是很小的,可以通过两端的电容微调。要完全校准只能通过一个外部基准时钟来测出偏差值并记录下来,再在软件里根据偏差来调整

另外一般时钟晶振偏差会小很多,32.768K或它的倍频。

首先#include <inttypes.h>这个文件你能找到的话基本就没什么问题了。

其中关键的一个宏_BV(i)1左移i位的意思。比如,_BV(PD0)就是左移0位,就是0x01了,PORTD &= ~_BV(PD0)就是PD&=~0x01意思就是PORTD第0位清0.PORTD |= _BV(PD0)就是PORTD第零位置1了。这个是可移植的,直接把PORTD改成P1,P2都行。关键是这个宏。应该是这样定义的

#define _BV(i) ((1<<i))//这就是一个可变的mask

OSCCAL = read_Osccal()这个你改不了了,51的频率不能由程序控制

AVR内部校准参数工厂保存在内部,可以通过编程器读出;见数据手册。如采用双龙公司

的下载线就可以读出,将读出的数据放在指定的FLASH单元,就可以在程序里读出校准。

下面是我做的校准程序,在ICC AVR下使用。下面就是读出的校准参数放在01FF单元:

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

** 函数名称 :send_osccal_data

** 函数描述 :读flash的0x1FF字节的内容,校正内部振荡频率

** 输入参数 :写芯片时将校正值放入flash:01FF单元

本函数采用在汇编语言

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

void send_osccal_data(void)

{

asm("ldi r31,0x1F\n"

"ldi r30,0xFF\n"

"lpm r16,z\n"

"out 0x31,r16\n"

"clr r17\n"

"ret\n")

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11369508.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存