
另外一般时钟晶振偏差会小很多,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")
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)