搜索
bottom↓
回复: 16

PIC12F509每次上电定时不一样---“来自一个STM32爱好者的困惑”

[复制链接]

出0入0汤圆

发表于 2014-7-28 17:01:51 | 显示全部楼层 |阅读模式
本帖最后由 wang479871 于 2014-7-28 17:07 编辑

由于每次研发既要考虑到单片机的ROM,又要考虑到单片机的成本,所以每次产品选型,选了几天后,最终还是会把目光落在STM8S003F3上。

这次需要的功能很简单,但是需要稳定,咬一咬牙,还是选用PIC12F509。

好不容易画了几天时间才点亮一个LED。现在需要用到定时器,无奈,PIC12F509的定时器只能用查询的方式定时,是没有定时中断的(这是我个人的见解,不知对否)。

现在碰到的问题是:PIC12F509烧录一个定时程序,用逻辑分析仪来测试周期,可是发现:单片机每次上电后,所定时的时间都是不一样,最大的有接近于△t=0.1ms。


一下这是我的程序:

#include<pic.h>
#define uchar unsigned char
#define uint  unsigned 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
uchar  Data_Code_Temp[10];        //把编码值分解成10bit二进制,Data_Code_Temp[0]是最低位,但是先发射最低位
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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-7-28 17:08:07 | 显示全部楼层
我现在正在检查是我的“配置位不对”,还是我的“原理图不对”

出0入0汤圆

发表于 2014-7-28 17:52:53 | 显示全部楼层
12F509没用过,12F510定时器要先设置        CM1CON0


CM1CON0 = BIT4; //12F510 TIM0

出0入0汤圆

发表于 2014-7-28 19:11:17 | 显示全部楼层
直接查询标志位不可以么??   

出10入10汤圆

发表于 2014-7-28 21:01:11 | 显示全部楼层
上电复位后,把内部RC振荡的校准值送OSCCAL寄存器试试。

出10入10汤圆

发表于 2014-7-28 21:02:43 | 显示全部楼层
#asm
  movwf OSCCAL
#asmend

出0入0汤圆

 楼主| 发表于 2014-7-28 23:10:45 | 显示全部楼层
lgg88 发表于 2014-7-28 19:11
直接查询标志位不可以么??

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

出0入0汤圆

 楼主| 发表于 2014-7-28 23:20:33 | 显示全部楼层
szxszx 发表于 2014-7-28 21:02
#asm
  movwf OSCCAL
#asmend

请问C语言怎么表示?

出10入10汤圆

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

出0入0汤圆

发表于 2014-7-29 08:17:30 | 显示全部楼层
wang479871 发表于 2014-7-28 17:08
我现在正在检查是我的“配置位不对”,还是我的“原理图不对”

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

出0入20汤圆

发表于 2014-7-29 12:57:44 | 显示全部楼层
本帖最后由 mon51 于 2014-7-29 13:03 编辑

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

出0入0汤圆

发表于 2014-7-29 16:13:56 | 显示全部楼层
它的内部晶振误差造成的吧?这个误差1%

出0入0汤圆

发表于 2014-7-29 16:37:41 | 显示全部楼层
内部晶振,内部晶振,内部晶振,内部晶振,内部晶振,内部晶振。

出0入0汤圆

 楼主| 发表于 2014-7-30 09:04:02 | 显示全部楼层
alias 发表于 2014-7-29 16:37
内部晶振,内部晶振,内部晶振,内部晶振,内部晶振,内部晶振。 ...

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

出0入0汤圆

发表于 2014-7-30 12:47:06 | 显示全部楼层
wang479871 发表于 2014-7-30 09:04
前辈是指“内部晶振不准吗”?

内部晶振1%误差

出0入0汤圆

发表于 2014-7-30 13:19:00 | 显示全部楼层
查询定时器不好用。有时会漏过去吧。

出0入0汤圆

发表于 2014-8-8 22:40:30 | 显示全部楼层
楼主, 不建议使用12F509
12F629,f675,f683 这些也不建议。。

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

价格也比12F509, 12F629,f675,f683  便宜多了。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 21:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表