打印

pic16f723 程序用了一段时间后,RB0中断没有了。

[复制链接]
3215|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
static void interrupt communicate(void)
{

    //////////////////////////////////////////////////////////////////////////////
    //100Hz 中断
if(INTF)   //10ms进来一次
{
     INTF =false;
  vRealy_Delay =0x00;
     if(vAdjLight_Valume <= LIGHT_STOP)  //加这句可以避开大于100Hz的干扰信号
     {
      vAdjLight_Valume = LIGHT_100;
      vDimmer_Delay++;
      if(vDimmer_Delay >= 0x06)
      {
       vDimmer_Delay=0x00;
       Light_Adjust();
      }
   }      
    TMR2ON = true;
     TMR2 = 0x00;
  if(vRealy_401 < 90) vRealy_401++;
  if(vRealy_402 < 90) vRealy_402++;
   
    }
     //100us 中断
else if(TMR2IF)
    {
     TMR2IF =false;
     TMR2 = 0X00;
  if(b100us_TAG)
  {
   b100us_TAG =false;
   
   vAdjLight_Valume--;
   if(vAdjLight_Valume <= LIGHT_STOP)   //20
   {
    TMR2ON =false;
      
    if(bSwitch401_flag == false) P_Dimmer01 = low;
    if(bSwitch402_flag == false) P_Dimmer02 = low;
   }
   else
   {
    if(vAdjLight_Valume <= vLight_Volume401)
    {
     if(vRealy_401 > Relay_Switch)
     {
      if(Dimmer401_TST())P_Dimmer01 = 1;
     }
    }
    if(vAdjLight_Valume <= vLight_Volume402)
    {
     if(vRealy_402 > Relay_Switch)
     {
      if(Dimmer402_TST())P_Dimmer02 =1;
     }
    }
   }
  }
  else
  {
   b100us_TAG =true;
  }
    }
    else if(TMR1IF) //2ms 定时中断
    {
        TMR1IF = false;
        TMR1L = T2msL;   //
        TMR1H = T2msH;
        m_2msCnt++;    // 基准时间自加计数器,中断中引用
  s_ComTCB.vTx_Interval++;
  s_ComTCB.vRx_Time++;
  s_ComTCB.bTime1_2msR++;
  vRealy_Delay++;
  if(vRealy_Delay>2)
  {
   vRealy_Delay =0x00;
   
     if(bSwitch_Relay401_flag==false) P_Relay01 =false;
     else        P_Relay01 =true;
   if(bSwitch_Relay402_flag==false) P_Relay02 =false;
   else        P_Relay02 =true;
  }  
    }
    else if(RCIF==true) //接收
    {
        RCIF = false;
        
  s_ComTCB.vRx_Time =0x00;
  s_ComTCB.bTx_Allow_flag =false;
  
        if(s_ComTCB.bReceive_status ==false)
        {
         if(RCREG == FrameStartByte)
         {
             s_ComTCB.bReceive_status = true;
             s_ComTCB.m_RxdLen=0x00;
   }
  }
  if(s_ComTCB.bReceive_status ==true)
  {
        if(s_ComTCB.m_RxdLen < REC_DATA_COUNT)   // 接收数据的个数25
        {
            s_ComTCB.m_Com_Time  = 0x00;
            a_RxdBuf[s_ComTCB.m_RxdLen] = RCREG;
            s_ComTCB.m_RxdLen += 1;
            
         }
         else
      {
       RCIE = false;
      }
     }
    }
}
}
沙发
h_x_zhong|  楼主 | 2012-11-1 09:47 | 只看该作者
void Init_Interrupt(void)   // 中断初始化
{
//        INTCON = 0x00;
//        TMR0   = TIMER0_COUNT;
//        OPTION = TIMER0_CONFIG;        // T0定时器设置200uS
        OPTION = 0x0F;                        // 如用T1则用此句关掉上3句
/*        PS0                OPTION,0                //
        PS1                OPTION,1                //
        PS2                OPTION,2                //
        PSA                OPTION,3                // 预分频分配                1-给WDT,0-给Timer0
        T0SE        OPTION,4                // TMER0时钟边沿选择        1-高至低,0-低至高 递增计数
        T0CS        OPTION,5                // TMER0时钟源选择,        1-T0CKL或CPSOSC信号,0-内部时钟(Fosc/4)
        INTEDG        OPTION,6                // 中断边沿选择,        1-上升沿,0-下降沿,触发
        RBPU        OPTION,7                // PORTB 弱上拉选择        1-使能,0-禁止,
*/
//        INTEDG = true;                        // 上升沿中断
        INTEDG = false;                        // 下降沿中断
       
        T1CON  = 0x00;                        // Timer1控制寄存器
/*        TMR1ON                T1CON,0                // Timer1使能位         1-使能,0-禁止
        T1SYNC                T1CON,2                // Timer1外部时钟输入同步控制位
        T1OSCEN                T1CON,3                // LP振荡使能控制位         1-使能,0-禁止
        T1CKPS0                T1CON,4                //
        T1CKPS1                T1CON,5
        TMR1CS0                T1CON,6                //
        TMR1CS1                T1CON,7

        TMR1CS1           TMR1CS0        T1OSCEN
           1                  1                   X                // 时钟源为容性传感振荡器
           0                  1                   X                // 时钟源为系统时钟(Fosc)
           0                  0                   X                // 时钟源为指令时钟(Fosc/4)
           1                  0                   0                // 时钟源为T1CKI引脚的外部时钟(上升沿触发计数)
           1                  0                   1                // 时钟源为T1OSC/T1OSO引脚上的晶振

        TMR1CS1           TMR1CS0        T1SYNC
           0                  X                  0                        // 将外部时钟输入与系统时钟同步(Fosc)
           0                  X                  1                        // 不同步外部时钟输入

        T1CKPS1           T1CKPS0
           0                  0                                        // 1:1预分频比
           0                  1                                        // 1:2预分频比
           1                  0                                        // 1:4预分频比
           1                  1                                        // 1:8预分频比
*/

        TMR1L  = T2msL;
        TMR1H  = T2msH;
        TMR1ON = true;                        // 开T1计数


        T2CON  = 0x00;                        // Timer2控制寄存器
       
/*        T2CKPS0                T2CON,0                // 时钟预分频选择位
        T2CKPS1                T2CON,1                //
        TMR2ON                T2CON,2                // Timer2使能位         1-使能,0-禁止      
        TOUTPS0                T2CON,3               
        TOUTPS1                T2CON,4                //
        TOUTPS2                T2CON,5
        TOUTPS3                T2CON,6                //
        未用                T2CON,7

        TMR1CS1           TMR1CS0       
           0                  0                // 预分频比为  1
           0                  1                // 预分频比为  4
           1                  0                // 预分频比为  16

        TOUTPS3         TOUTPS2  TOUTPS1        TOUTPS0
           0            0                  0                  0                        // 后分频比为  1:1
           0            0                  0                  1                        // 后分频比为  1:2
           0            0                  1                  0                        // 后分频比为  1:3
           1            1                  1                  1                        // 后分频比为  1:16
   
*/
        TMR2   = 0x00;
        PR2    = T100us;
//        TMR2ON = true;                        // 开T2计数

//        PORTB  = 0x04;
//-----------------------------------------------------------------------------
        TRISC  |= 0xC0;                        //断开两个IO。

/*        TXD8        TXSTA,0
        TX9D        TXSTA,0                        // 1=发送第9位 0=不发送
        TRMT        TXSTA,1                        // 1=发送移位寄存器空 0=满
        BRGH        TXSTA,2                        // 1=高速  0=低速
        SYNC        TXSTA,4                        // 1=同步  0=异步
        TXEN        TXSTA,5                        // 1=使能发送功能 0=禁止
        TX8_9        TXSTA,6                        // 1=9位  0=8位
        /_TX8        TXSTA,6
        TX9                TXSTA,6
        CSRC        TXSTA,7                        // 同步时钟选择        1=内部 0=外部
*/
        TXSTA  = 0x00;                        // 不选择9位数据发送,
        TXEN   = true;                        //使能串口发送;
        BRGH   = true;                        //选择串口为异步模式,低波特率

/*        RX9D        RCSTA,0
        RCD8        RCSTA,0
        OERR        RCSTA,1
        FERR        RCSTA,2
        CREN        RCSTA,4                        // 1=允许连续接收  0=禁止连续接收功能
        SREN        RCSTA,5                        // 1=使能单字节接收功能         0=禁止        异步模式下此位未用
        RC8_9        RCSTA,6                        // 1=9位  0=8位
        /_RC8        RCSTA,6
        RC9                RCSTA,6
        RX9                RCSTA,6
        SPEN        RCSTA,7                        // 1=使能串口工作 0=禁止
*/
        RCSTA =        0x00;                       
        SPEN  =        true;                        // 开串口使能位;
        CREN  =        true;                        //不选择9位数据;开启连续接收;取消地址匹配
       
        SPBRG =        UART_BAUD;

/*        PIC16F73
        TMR1IE        PIE1,0                        // 1=允许TMR1溢出中断
        TMR2IE        PIE1,1                        // 1=允许TMR2溢出中断
        CCP1IE        PIE1,2                        // 1=允许CCP1模块产生中断
        SSPIE        PIE1,3                        // 串口SSP中断允许位
        TXIE        PIE1,4                        // 1=允许SSP发送产生中断
        RCIE        PIE1,5                        // 1=允许SSP接收产生中断
        ADIE        PIE1,6                        // 1=允许AD中断
        PSPIE        PIE1,7                        // 1=允许并口中断 0=屏蔽 只有40脚CPU有
*/
        PIE1   = 0x00;

/*        PIC16F723
        TMR1IE        PIE1,0                        // Timer1中断允许位                        1-允许,0-禁止
        TMR2IE        PIE1,1                        // TMR2与PR2匹配中断位                1-允许,0-禁止
        CCP1IE        PIE1,2                        // CCP1中断允许位                        1-允许,0-禁止
        SSPIE        PIE1,3                        // 同步串口(SSP)中断允许位        1-允许,0-禁止
        TXIE        PIE1,4                        // USART发送中断允许位                1-允许,0-禁止
        RCIE        PIE1,5                        // RCIE接收中断允许位                1-允许,0-禁止
        ADIE        PIE1,6                        // AD转换器中断允许位                1-允许,0-禁止
        TMR1GIE        PIE1,7                        // Timer1门控中断允许位                1-允许,0-禁止
*/

        TXIF   = false;
        TXIE   = false;                        // 串口发送中断位使能    1-允许,0-禁止
        RCIF   = false;
        RCIE   = true;                        // 串口接收中断位使能
        TMR1IE = true;                        // 开T1中断
        TMR2IE = true;                        // 开T2中断
       
/*        RBIF        INTCON,0                // RB端口状态变化中断标志位,保持,置位,只有通过读端口消除变化,然后用软件清0
        INTF        INTCON,1                // 外中断RB0/INT标志
        T0IF        INTCON,2                // 定时器0溢出中断标志,当被置位时,要用软件清0
        RBIE        INTCON,3                // RB端口状态变化中断允许位        1=允许
        INTE        INTCON,4                // 外中断RB0/INT允许
        T0IE        INTCON,5                // 定时器0溢出中断允许
        PEIE        INTCON,6                // 外围接口中断允许
        GIE                INTCON,7                // 全局中断允许
*/       
        INTCON = 0x00;

//        T0IF   = false;
//        T0IE   = true;
        PEIE   = true;                        // 外围接口中断允许
        INTF   = false;
        INTE   = true;                        // 外中断RB0/INT标志
       
//-----------------------------------------------------------------------------
#if        PIC16F723

        CPSCON0        =0x00;                        // 容性传感控制寄存器0
/*        T0XCS        CPSCON0,0                // Timer0外部时钟源选择位
        CPSOUT        CPSCON0,1                // 容性振荡器状态位          1-拉电流,0-灌电流
        CPSRNG0        CPSCON0,2                //
        CPSRNG1        CPSCON0,3
        CPSON        CPSCON0,7                // 容性传感模块使能位  1-工作,0-关闭

        CPSRNG1         CPSRNG0
          0                  0                                // 振荡器关闭
          0                  1                                // 振荡器处于低量程。充/放电标称值0.1uA
          1                  0                                // 振荡器处于中量程。充/放电标称值1.2uA
          1                  1                                // 振荡器处于高量程。充/放电标称值18uA
*/        CPSON =        false;                        // 禁止容性传感模块工作

#endif
}

使用特权

评论回复
板凳
h_x_zhong|  楼主 | 2012-11-1 10:03 | 只看该作者
原理图

未命名.JPG (67.11 KB )

未命名.JPG

使用特权

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

本版积分规则

个人签名:H_X_ZHONG

8

主题

55

帖子

1

粉丝