• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

关于PIC12F509的定时计数器的问题

PIC12F509中的TMR0程序计数器,用以下写法(C语言)
...
OPTION=0xC3;/250*16=4MS/
...
IF (TMR0>250)
  COUNT++;
...
IF (COUNT>250)
  {SECOND++;
  COUNT=0;}
...

按照4MS*250=1S则程序实现的是1秒的计时.
但如果在下面程序的情况下:
...
OPTION=0xC3;/250*16=4MS/
...
VOID TM()
{IF (TMR0>250)
  COUNT++;
IF (COUNT>250)
  {SECOND++;
  COUNT=0;}}
...
VOID DELAY()
{UNSIGNED INT I;
I=255;
WHILE(I--);
}
...
VOID MAIN()
{WHILE(1);
{ DELAY();
TM();
DELAY();}}
会出现因为DELAY的时间长而忽略掉某个TMR0的溢出,从而使得SECOND的定时出现误差,这种情况下应该如何处理?特别是当这个DELAY()必须的时候.
全部回复(2)
正序查看
倒序查看
whatcall
LV.5
2
2007-05-31 23:34
看你的用法可知PIC12F509没有定时器的中断功能.
既然Delay()会过长影响你的计数检查,为何不把TM()放到DELAY()中,此时注意DELAY的延时增加(指令多了不少),如下:

VOID DELAY()
{UNSIGNED INT I;
I=255;
WHILE(I--)
  TM() ;
}

请查一下PIC12F509的Stack深度是否满足函数的两级调用.
0
回复
xyx911
LV.7
3
2007-06-01 09:06
@whatcall
看你的用法可知PIC12F509没有定时器的中断功能.既然Delay()会过长影响你的计数检查,为何不把TM()放到DELAY()中,此时注意DELAY的延时增加(指令多了不少),如下:VOIDDELAY(){UNSIGNEDINTI;I=255;WHILE(I--)  TM();}请查一下PIC12F509的Stack深度是否满足函数的两级调用.
关键是PIC12F509最多支持两层嵌套,所以不能把TMR0的计数子程序加入DELAY()中,如果直接写进去呢,如:
DELAY()
{UNSIGNED INT I;
WHILE(I--)
{ IF (TMR0>250)
    COUNT++;
  IF (COUNT>250)/计数值到一秒跳出
    I=0;
}
}
这样会不会影响DELAY()延时的精度?
如采用509的内部晶振方式,有一个OSCCAL参数值校正,每个芯片都要在烧录前先读取数值吗?如不用的话如何校准TMR0的值?(官方的资料说509的内部晶振误差在5%)
0
回复