打印

CCP模块中比较输出的哪里不对了? 望前辈指点一下

[复制链接]
2438|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
哪位前辈有空帮我指导一下,我刚学PIC,在学习CCP模块中比较输出,想在CCP1引脚输出脉冲波形,用Proteus仿真时,就是搞不懂为什么输出周期约为65.5ms?CCPR1寄存器的值与TMR1的值相符时进入中断时,TMR1的值得怎么比CCPR1的值要大?先在这里说声谢谢了
/********************************************
标题:CCP 比较功能模式
硬件支持:proteus (pic 16F877)4MHZ
日期:2010.09.27
说明:
CCPRXH:CCPRXL 的值与 TMR1的寄存器值相符,引脚电平变化  
问题:周期为什么是固定不变的,进入中断前TMR1就已经溢出了? ?  
***********************************************/
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
void init();
/****************************************************************************
* 名    称:main()
* 功    能:
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void main()
{
init();
while(1);
}
/****************************************************************************
* 名    称:init()
* 功    能:CCP1寄存器设置
* 入口参数:
* 出口参数:
* 说    明:
****************************************************************************/
void init()
{
TRISC2=0;//CCP引脚作为输出
CCP1IE=1;//CCP1模块中断使能位
TMR1H=0x00;
TMR1L=0x00;
T1CON=0X01;//TMR10N=1
CCP1CON=0x08;//1000 比较模式,相等输出高电平
CCPR1H=0x00;
// CCPR1H=0x0f;
CCPR1L=0xff;
PEIE=1;//外围中断使能
GIE=1; //总中断使能
}
/****************************************************************************
* 名    称:interrupt timer()
* 功    能:中断
* 入口参数:
* 出口参数:
* 说    明:改变CCPR1H:CCPR1L的值,就可以改变频率
****************************************************************************/
void interrupt timer()
{
if(CCP1IF)
{
  CCP1IF=0;
  if(CCP1CON==0x08)//是否输出高电平
  {
   CCPR1H=0x01;
   CCPR1L=0x0;
   CCP1CON=0x09;//di电平
  }
  else   //输出低电平
  {
   CCPR1H=0xdf;
   CCPR1L=0x00;
   CCP1CON=0x08;//高电平
  }
}
}




桌面.zip (199.48 KB)
沙发
yellowland| | 2010-12-13 14:06 | 只看该作者
tmr1需要你手工清除,不然一直增长会到65536,65536*1us=65.5ms

使用特权

评论回复
板凳
明天及以后| | 2011-1-6 22:10 | 只看该作者
改变CCPR1H和CCPR1L的值只能改变脉宽。要改变频率需要改变PR2的值。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

221

帖子

0

粉丝