wang479871 发表于 2014-7-28 17:01:51

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



wang479871 发表于 2014-7-28 17:08:07

我现在正在检查是我的“配置位不对”,还是我的“原理图不对”

kang1209 发表于 2014-7-28 17:52:53

12F509没用过,12F510定时器要先设置        CM1CON0


CM1CON0 = BIT4; //12F510 TIM0

lgg88 发表于 2014-7-28 19:11:17

直接查询标志位不可以么??   

szxszx 发表于 2014-7-28 21:01:11

上电复位后,把内部RC振荡的校准值送OSCCAL寄存器试试。

szxszx 发表于 2014-7-28 21:02:43

#asm
movwf OSCCAL
#asmend

wang479871 发表于 2014-7-28 23:10:45

lgg88 发表于 2014-7-28 19:11
直接查询标志位不可以么??

我试了,把定时改成“软件延时”,每次上电的延时时间也相差很大

wang479871 发表于 2014-7-28 23:20:33

szxszx 发表于 2014-7-28 21:02
#asm
movwf OSCCAL
#asmend

请问C语言怎么表示?

szxszx 发表于 2014-7-29 08:00:43

看一下数据手册内部RC振荡介绍,上电复位后CPU会把校准数据放到W寄存器,然后你的第一条指令就可以把校准数据送入OSCCAL了。
按理说不送校准数据也可以,因为每次上电复位后OSCCAL是固定的值,相对于4M振荡频率是一个固定的偏差。
我也不知道怎样用C写,就是把W的内容送OSCCAL。
上面是PICC C嵌入汇编的写法

sweet_136 发表于 2014-7-29 08:17:30

wang479871 发表于 2014-7-28 17:08
我现在正在检查是我的“配置位不对”,还是我的“原理图不对”

你木有接外部晶振的问题?

mon51 发表于 2014-7-29 12:57:44

本帖最后由 mon51 于 2014-7-29 13:03 编辑

12F509 功能简单,如果成本允许,可以用12F629,f675,f683这些是带中断的。
现在没有搞清楚:你是上电后,IO脚反转的时间有误差,还是每一次上电后IO反转与上一下的时间有误差?
如果是后者,可以看看你的复位处理,一般这类片子的RC有1%的误差。定时器的最大范围是:256*1(uS)。你还可以把分频器给它。

zhiguangqi 发表于 2014-7-29 16:13:56

它的内部晶振误差造成的吧?这个误差1%

alias 发表于 2014-7-29 16:37:41

内部晶振,内部晶振,内部晶振,内部晶振,内部晶振,内部晶振。{:sad:}{:sad:}{:sad:}

wang479871 发表于 2014-7-30 09:04:02

alias 发表于 2014-7-29 16:37
内部晶振,内部晶振,内部晶振,内部晶振,内部晶振,内部晶振。 ...

前辈是指“内部晶振不准吗”?

zhiguangqi 发表于 2014-7-30 12:47:06

wang479871 发表于 2014-7-30 09:04
前辈是指“内部晶振不准吗”?

内部晶振1%误差

witin 发表于 2014-7-30 13:19:00

查询定时器不好用。有时会漏过去吧。

pic_flash 发表于 2014-8-8 22:40:30

楼主, 不建议使用12F509
12F629,f675,f683 这些也不建议。。

应该使用最新颖的 12F1501
你要的都有了。。只是没有EEprom

价格也比12F509, 12F629,f675,f683便宜多了。。
页: [1]
查看完整版本: PIC12F509每次上电定时不一样---“来自一个STM32爱好者的困惑”