[讨论] PIC定时求助

lihui17wu   2017-8-5 15:59 楼主
#include

#define uchar unsigned char
#define uint  unsigned int
void initial();   
void ccp1_pwm();
void interrupt power(void);
unsigned long int intnum;
uint pwm_duty;
uint i;
main()  
{
  initial();
while(1)

{


if(intnum>=40)
{
  intnum=0;
  CCP1CON=0x00;
  RC5=!RC5;


}
}
}
void initial()
{

    TMR1H=(65536-50000)/256;//求模
        TMR1L=(65536-50000)%256;//求余

    INTCON=0xc0;//0B11000000 GIE PEIE =1
        PIE1=0x01;//TMR1E=1
        T1CON=0x01;//TMR1ON=1

        TRISC=0B00000000;

        ANSEL=0x00;

        intnum=0;
        pwm_duty=100;
    i=0;
       

}
void ccp1_pwm()
{
     TRISC5=0;
     PR2=0x63;   
     CCP1CON=0B00001100;
     T2CKPS0=1;
     T2CKPS1=1;
     CCPR1L=pwm_duty;
     TMR2ON=1;
}
void interrupt power(void)
{
  GIE=0;
if(TMR1IF)
{
    TMR1IF=0;
    TMR1L=0;
    TMR1H=(65536-50000)/256;//求模
        TMR1L=(65536-50000)%256;//求余

    intnum++;

}  
GIE=1;
}
程序如上,为什么intnum取值大于45后 程序就运行不正常了,小于45的数都可以实现闪烁,实在是搞不清问题所在。

回复评论 (21)

大于45之后是什么效果?看代码应该和45每太大关系吧
点赞  2017-8-5 19:00
是不是看门狗起作用了?
点赞  2017-8-7 14:06
引用: dingzy_2002 发表于 2017-8-7 14:06
是不是看门狗起作用了?

是的 我弄好了 清看门狗或者禁止就好了,对了 现在弄IIC遇见问题 就是我用的FP16F722 视频是FP16F877 他里面有个寄存器SSPCON2 而FP16F722里面没有这个 里面用到起始信号SEN 停止PEN RCEN 啊 这些PIC16F722都没有 不知道怎么弄了
点赞  2017-8-10 08:58
引用: lihui17wu 发表于 2017-8-10 08:58
是的 我弄好了 清看门狗或者禁止就好了,对了 现在弄IIC遇见问题 就是我用的FP16F722 视频是FP16F877 他 ...

这个要看PIC16F722的数据手册,一般新的器件比以前的器件配置位要更多一些,位置也有可能变化
不过,好像PICC本身带有相关的函数库,你直接调用下,说不一定就可以了.
我一般是直接查数据手册,自己配置相关的寄存器,一方面熟悉器件,另一方面是了解新的器件功能.
点赞  2017-8-10 10:39
引用: dingzy_2002 发表于 2017-8-10 10:39
这个要看PIC16F722的数据手册,一般新的器件比以前的器件配置位要更多一些,位置也有可能变化
不过,好像PI ...

谢谢你的回答,对了,PIC单片机你一般用的是什么型号啊
点赞  2017-8-10 15:31
引用: lihui17wu 发表于 2017-8-10 15:31
谢谢你的回答,对了,PIC单片机你一般用的是什么型号啊

我较常用的PIC器件是:
PIC16F917
PIC16F883/4/7
PIC16F616/676
PIC12F615/675
PIC16F1933/7/9
PIC16F819/677
PIC12F1501
点赞  2017-8-12 10:40
引用: dingzy_2002 发表于 2017-8-12 10:40
我较常用的PIC器件是:
PIC16F917
PIC16F883/4/7
PIC16F616/676
PIC12F615/675
PIC16F1933/7/9
PIC1 ...

可以发一个基于PIC16F616的红外接收程序给我吗 我主要用的是PIC16F616和PIC16F722,万分感谢,卡很久了
点赞  2017-8-14 17:18
引用: lihui17wu 发表于 2017-8-14 17:18
可以发一个基于PIC16F616的红外接收程序给我吗 我主要用的是PIC16F616和PIC16F722,万分感谢,卡很久了

可能是行业不一样,我涉及的是汽车电子产品,没做过红外接收的产品。所以抱歉
点赞  2017-8-15 14:41
引用: dingzy_2002 发表于 2017-8-15 14:41
可能是行业不一样,我涉及的是汽车电子产品,没做过红外接收的产品。所以抱歉

哦 没事  以后有其他问题还望不吝赐教啊
点赞  2017-8-15 15:07
引用: lihui17wu 发表于 2017-8-15 15:07
哦 没事  以后有其他问题还望不吝赐教啊

没问题。
点赞  2017-8-17 08:52
引用: dingzy_2002 发表于 2017-8-12 10:40
我较常用的PIC器件是:
PIC16F917
PIC16F883/4/7
PIC16F616/676
PIC12F615/675
PIC16F1933/7/9
PIC1 ...

兄弟,那天可以过去拜访您不?
Microchip原装正品单片机,另有可替换单片机(无需修改PCB资料,程序可共用PIC的) 有用到的兄弟多多支持! 期待您的来电。 电话13430885511
点赞  2017-8-26 13:59
引用: dingzy_2002 发表于 2017-8-12 10:40
我较常用的PIC器件是:
PIC16F917
PIC16F883/4/7
PIC16F616/676
PIC12F615/675
PIC16F1933/7/9
PIC1 ...

,都来晒一下用过的型号:PIC18F4620 PIC32MX250F128D PIC16F1823
点赞  2017-8-26 22:42
引用: 13430885511 发表于 2017-8-26 13:59
兄弟,那天可以过去拜访您不?

你在哪?我在安徽合肥.
点赞  2017-8-28 11:50

#include
#include
void initial();   
void ccp1_pwm();
void interrupt power(void);
void delay (unsigned int x,unsigned int y);

unsigned int num=0;
unsigned int num1=0;
unsigned int work_en=0;
unsigned int T1=1;
unsigned int T0=1;
unsigned int num2=0;

main()  
{
  initial();

while(1)
{
  asm("CLRWDT");

if(work_en==0)
{

  CCP1CON=0x00;
  RC5=0;
}
else
{
   
  T0=0;
if(num<200)
{

  CCP1CON=0x00;
  RC5=1;
}
else
{

work_en=0;
num=0;
T0=1;
}

}

}


}
void initial()
{
PORTC=0x00;
TRISC=0x00;
OPTION_REG=0B10001111;
INTCON=0B11001000;
TMR1H=(65536-50000)/256;//求模
TMR1L=(65536-50000)%256;//求余
PIE1=0x01;//TMR1E=1
T1CON=0x01;
PORTA=0x00;
TRISA=0B00100100;
IOCA=0B00100000;


}
void ccp1_pwm()
{
     TRISC5=0;
     PR2=0x18;   
     CCP1CON=0B00101100;
     T2CKPS0=1;
     T2CKPS1=1;
     CCPR1L=0x0C;
     TMR2ON=1;
}
void interrupt power(void)
{
asm("CLRWDT");


if(RAIF==1)  
{
        if(RA5==1)
        {
   work_en=1;
   
        }
        else
        {
     asm("NOP");
        }
      
        RAIF=0;
}  
if(TMR1IF==1)
{
  asm("CLRWDT");
TMR1H=(65536-50000)/256;//求模
TMR1L=(65536-50000)%256;//求余
if(T0==0)
{
  num++;
}

TMR1IF=0;
}

}
void delay (unsigned int x,unsigned int y)//14+{3*(Y-1)+7}*(X-1)
{
   unsigned int z;
   do
     {
      z=y;
      do{;}
      while(--z);
     }
    while(--x);
}

这个程序我用PORTA RA5 电平变化中断 但是出现问题 感觉是在不停的进入中断,本来我的含义是检测到电平变化,自己定时亮灯,结果灯一直在亮灭亮灭,不知道是不是程序问题 还是产生电平变化的东西出问题
点赞  2017-9-19 22:29
引用: lihui17wu 发表于 2017-9-19 22:29
#include
#include
void initial();   
void ccp1_pwm();
void interrupt power(void);
void dela ...

有没有可能是WDT起作用了?
你看亮灭的频率,与WDT是否符合?
单看程序,好像RA5中断部分没什么问题.
点赞  2017-9-20 13:22
引用: dingzy_2002 发表于 2017-9-20 13:22
有没有可能是WDT起作用了?
你看亮灭的频率,与WDT是否符合?
单看程序,好像RA5中断部分没什么问题.

WDT我都直接关闭了,这个就是不知道是什么影响了,这个电平变化接的是红外感应,开始我是担心红外感应头在自己没有人也感应输出了 后来才用查询法 发现没有,所以还是担心电平变化中断有什么问题,不过这个也是以会正常 ,一会又比如我设置的10秒 亮10秒 闪一下又接着10秒。以前都没用过电平变化中断,担心自己是不是有什么地方没注意到 所以贴出来参考下
点赞  2017-9-20 14:55
引用: lihui17wu 发表于 2017-9-20 14:55
WDT我都直接关闭了,这个就是不知道是什么影响了,这个电平变化接的是红外感应,开始我是担心红外感应头 ...

如果是这样,可以这么进行调试(如果有在线调试工具就更好了)
1.先关闭PORTA,5的电平中断,看正常否
2.打开电平中断,看中断时,电平状态是否是因为电平变化引起的.
点赞  2017-9-20 16:55
引用: dingzy_2002 发表于 2017-9-20 16:55
如果是这样,可以这么进行调试(如果有在线调试工具就更好了)
1.先关闭PORTA,5的电平中断,看正常否
2.打 ...

你又没有遇见主要的问题 使能INT中断的时候,感觉AD转换没用了
点赞  2017-9-21 16:06
引用: dingzy_2002 发表于 2017-9-20 16:55
如果是这样,可以这么进行调试(如果有在线调试工具就更好了)
1.先关闭PORTA,5的电平中断,看正常否
2.打 ...

可以加个QQ方便聊天吗 我的1310520969
点赞  2017-9-21 16:09
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复