请教PIC的定时器

2020-02-08 12:18发布

我用PIC单片机的定时器让RA2输出113K的方波,使用的是内部4M时钟
TMR0是8位的,我现在先给TMR0赋值254  然后等待溢出中断,让RA2取反,可是输出只有21K,怎么回事呀?
刚学,请帮我看一下谢谢了、

#include<pic.h>            //包含单片机内部资源预定义
//#include<pic16630.h>         //包含 的头文件
__CONFIG(0x0194);           //芯片配置字
#define uint unsigned int
#define uchar unsigned char
#define       K113       RA2         //
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
  for(b=110;b>0;b--);
}

void init(void)
{

TRISA=0xF8;   //1111 1000
OPTION=0x00; //0000 1111
    INTCON=0XA0;
TMR0=0xfe;
}
void main()                //主程序
  {
init();
    while(1)
{
RA1=1;
delay(500);
RA1=0;
delay(500);
}
  }
void interrupt ISR(void)  //中断服务函数只能有一个
{
   if(T0IE && T0IF)    //判断TMR0中断
  {
  TMR0=0xfe;
  T0IF = 0;   //消除TMR0中断标志
  K113=!K113;

  }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
surf_131
1楼-- · 2020-02-08 14:06
TMR0最小预分频是1:2。
4M时钟时机器周期是1us。
中断响应的标准延迟是5个机器周期。
编译器非“正版”时可能有插入更多nop周期的问题。

一个方波的周期,要有两次中断响应。21k似乎是每24个机器周期就让波形反转一次。大约这个程序跑在这平台上一直在不断响应中断和中断返回之间折腾。

lz你的平台运行速度太低。在这样的速度下,你要打算获得你要的波形(只能粗略接近),就要关闭一切中断,每3个NOP反转一次你指定的输出端口。
gw168sh
2楼-- · 2020-02-08 16:19
谢谢楼上的,我看看频率能不能偏移一下
millwood0
3楼-- · 2020-02-08 17:30
"我现在先给TMR0赋值254  然后等待溢出中断"

read about "interrupt latency".
yklstudent
4楼-- · 2020-02-08 18:35
 精彩回答 2  元偷偷看……
tim0511
5楼-- · 2020-02-08 19:42
中断函数放在主函数下面不需要声明吗?

一周热门 更多>