PIC12F509每次上电定时不一样---“来自一个STM32爱好者的困惑”
本帖最后由 wang479871 于 2014-7-28 17:07 编辑由于每次研发既要考虑到单片机的ROM,又要考虑到单片机的成本,所以每次产品选型,选了几天后,最终还是会把目光落在STM8S003F3上。
这次需要的功能很简单,但是需要稳定,咬一咬牙,还是选用PIC12F509。
好不容易画了几天时间才点亮一个LED。现在需要用到定时器,无奈,PIC12F509的定时器只能用查询的方式定时,是没有定时中断的(这是我个人的见解,不知对否)。
现在碰到的问题是:PIC12F509烧录一个定时程序,用逻辑分析仪来测试周期,可是发现:单片机每次上电后,所定时的时间都是不一样,最大的有接近于△t=0.1ms。
一下这是我的程序:
#include<pic.h>
#define uchar unsigned char
#define uintunsigned int
#define Cap_V GP2
#define LED GP4
__CONFIG(0x0fea); //也可以在编译环境里设置,打开《PIC12F508_509.pdf》第42页,会有"Special Fetures Of The CPU",配置位
uint Data_Code_Valu=0; //10bit的编码,最大值1024
ucharData_Code_Temp; //把编码值分解成10bit二进制,Data_Code_Temp是最低位,但是先发射最低位
uchar Count_0_18ms=0; //每隔0.18ms计数一次
//初始化函数
void init()
{
TRIS=0X00; //全部输出
OPTION=0X00; //设置所有I/O走做普通I/O口
TMR0 = 56;
}
void main()
{
uchar i;
init();
while(1)
{
if(TMR0 > 150)
{
TMR0 = 56;
if(i)
{
i = 0;
LED = 1;
}
else
{
i = 1;
LED = 0;
}
}
}
}
重新上电,测得定时间隔为0.170ms
再次重新上电,测得定时间隔为0.221ms
我现在正在检查是我的“配置位不对”,还是我的“原理图不对” 12F509没用过,12F510定时器要先设置 CM1CON0
CM1CON0 = BIT4; //12F510 TIM0 直接查询标志位不可以么?? 上电复位后,把内部RC振荡的校准值送OSCCAL寄存器试试。 #asm
movwf OSCCAL
#asmend lgg88 发表于 2014-7-28 19:11
直接查询标志位不可以么??
我试了,把定时改成“软件延时”,每次上电的延时时间也相差很大 szxszx 发表于 2014-7-28 21:02
#asm
movwf OSCCAL
#asmend
请问C语言怎么表示? 看一下数据手册内部RC振荡介绍,上电复位后CPU会把校准数据放到W寄存器,然后你的第一条指令就可以把校准数据送入OSCCAL了。
按理说不送校准数据也可以,因为每次上电复位后OSCCAL是固定的值,相对于4M振荡频率是一个固定的偏差。
我也不知道怎样用C写,就是把W的内容送OSCCAL。
上面是PICC C嵌入汇编的写法 wang479871 发表于 2014-7-28 17:08
我现在正在检查是我的“配置位不对”,还是我的“原理图不对”
你木有接外部晶振的问题? 本帖最后由 mon51 于 2014-7-29 13:03 编辑
12F509 功能简单,如果成本允许,可以用12F629,f675,f683这些是带中断的。
现在没有搞清楚:你是上电后,IO脚反转的时间有误差,还是每一次上电后IO反转与上一下的时间有误差?
如果是后者,可以看看你的复位处理,一般这类片子的RC有1%的误差。定时器的最大范围是:256*1(uS)。你还可以把分频器给它。 它的内部晶振误差造成的吧?这个误差1% 内部晶振,内部晶振,内部晶振,内部晶振,内部晶振,内部晶振。{:sad:}{:sad:}{:sad:} alias 发表于 2014-7-29 16:37
内部晶振,内部晶振,内部晶振,内部晶振,内部晶振,内部晶振。 ...
前辈是指“内部晶振不准吗”? wang479871 发表于 2014-7-30 09:04
前辈是指“内部晶振不准吗”?
内部晶振1%误差 查询定时器不好用。有时会漏过去吧。 楼主, 不建议使用12F509
12F629,f675,f683 这些也不建议。。
应该使用最新颖的 12F1501
你要的都有了。。只是没有EEprom
价格也比12F509, 12F629,f675,f683便宜多了。。
页:
[1]