⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uartintc.c

📁 build a modbus client/server for use on the Protocessor (from FieldServer Technologies) Tools Req
💻 C
📖 第 1 页 / 共 2 页
字号:
         if ( rx_vUARTIntStatus->vUARTIntRxBufDataCnt == (BYTE)RX_BUFFER_SIZE )
            {
            rx_vUARTIntStatus->UARTIntRxBufferFull = 1;
            }
         rx_vUARTIntStatus->vUARTIntRxBufWrPtr++;
         if ( rx_vUARTIntStatus->vUARTIntRxBufWrPtr >= (BYTE)RX_BUFFER_SIZE )
            {
            rx_vUARTIntStatus->vUARTIntRxBufWrPtr = 0;
            }
         }
      }

   //------------------------------------------------------------
   //
   // TX Interrupts
   //

   tx_vUARTIntStatus = &tx_vUARTIntStatus2 ;
   rx_vUARTIntStatus = &rx_vUARTIntStatus2 ;

   if ( PIR3bits.TX2IF & PIE3bits.TX2IE )
      {
      if ( !tx_vUARTIntStatus->UARTIntTxBufferEmpty )
         {
         TXREG2 = tx_vUARTIntStatus->vUARTIntTxBuffer[tx_vUARTIntStatus->vUARTIntTxBufRdPtr];
         // if ( parity )
         //    {
         //    addParityBit(1, vUARTIntStatus->vUARTIntTxBuffer[vUARTIntStatus->vUARTIntTxBufRdPtr]);
         //    }
         tx_vUARTIntStatus->UARTIntTxBufferFull = 0;
         tx_vUARTIntStatus->vUARTIntTxBufDataCnt--;
         if ( tx_vUARTIntStatus->vUARTIntTxBufDataCnt == (UINT)0 )
            {
            tx_vUARTIntStatus->UARTIntTxBufferEmpty = 1;
            }
         tx_vUARTIntStatus->vUARTIntTxBufRdPtr++;
         if ( tx_vUARTIntStatus->vUARTIntTxBufRdPtr >= (BYTE)TX_BUFFER_SIZE )
            {
            tx_vUARTIntStatus->vUARTIntTxBufRdPtr = 0;
            }
         }
      else
         {
         PIE3bits.TX2IE = 0;
#if ( ENABLE_SER2_RS485 == 'Y' )
         while ( TXSTA2bits.TRMT == (BYTE)0 );
         Delay1KTCYx (1) ;   // at 10 Mhz, 1000 instruction cycles delay for 0.4 ms.
         mSetRS485_RTSLow ( P6720SER2 );
#endif
         }
      }

   //------------------------------------------------------------
   //
   // RX Interrupts
   //

   if ( PIR3bits.RC2IF & PIE3bits.RC2IE )
      {
      if ( RCSTA2bits.FERR )
         {   /* FERR error condition */
         chTemp = RCREG2;
         rx_vUARTIntStatus->UARTIntRxError = 1;
         }
      else if ( RCSTA2bits.OERR )
         {   /* OERR error condition */
         RCSTA2bits.CREN = 0;
         RCSTA2bits.CREN = 1;
         chTemp = RCREG2;
         rx_vUARTIntStatus->UARTIntRxError = 1;
         }
      else if ( rx_vUARTIntStatus->UARTIntRxBufferFull )
         {
         chTemp = RCREG2;
         rx_vUARTIntStatus->UARTIntRxOverFlow = 1;
         }
      else if ( !rx_vUARTIntStatus->UARTIntRxBufferFull )
         {
         rx_vUARTIntStatus->UARTIntRxOverFlow = 0;
         rx_vUARTIntStatus->UARTIntRxBufferEmpty = 0;
         rx_vUARTIntStatus->vUARTIntRxBuffer[rx_vUARTIntStatus->vUARTIntRxBufWrPtr] = RCREG2;
         rx_vUARTIntStatus->vUARTIntRxBufDataCnt ++;
         if ( rx_vUARTIntStatus->vUARTIntRxBufDataCnt == (BYTE)RX_BUFFER_SIZE )
            {
            rx_vUARTIntStatus->UARTIntRxBufferFull = 1;
            }
         rx_vUARTIntStatus->vUARTIntRxBufWrPtr++;
         if ( rx_vUARTIntStatus->vUARTIntRxBufWrPtr >= (BYTE)RX_BUFFER_SIZE )
            {
            rx_vUARTIntStatus->vUARTIntRxBufWrPtr = 0;
            }
         }
      }
}


//-----------------------------------------------------------------------------------

BYTE mSetUARTPort(UINT iport, UINT ibaud, UINT iparity)
{

   //static unsigned int iport;

   BYTE baudRate ;

   if ( !mCheckPortHandle(iport) )
      {
      return 0;
      }
   else
      {
      //baudRate = ibaud;
      //parity = iparity;

      if ( ibaud == (BYTE)115 )
         {
         baudRate = ( ( UART_CLOCK_FREQ / 115200 ) / 16 ) - 1 ;
         }
      else
         {
         baudRate = ( ( UART_CLOCK_FREQ / ibaud ) / 16 ) - 1 ;
         }

      if ( iport == (UINT)P6720SER1 )
         {
         RCSTA1bits.SPEN = 0;
         SPBRG = baudRate;
         RCSTA1bits.SPEN = 1;
         }
      else
         {
         RCSTA2bits.SPEN = 0;
         SPBRG2 = baudRate;
         RCSTA2bits.SPEN = 1;
         }

#if 0
      if ( parity )
         {
         if ( iport )
            {
            TXSTA2bits.TX9 = 1;
            RCSTA2bits.RX9 = 1;
            }
         else
            {
            TXSTAbits.TX9 = 1;
            RCSTAbits.RX9 = 1;
            }
         }
#endif
      return 1;
      }
}


//-----------------------------------------------------------------------------------

VOID addParityBit(UINT iport, BYTE b)
{
   BYTE bit0 = (b & 0b00000001);
   BYTE bit1 = (b & 0b00000010);
   BYTE bit2 = (b & 0b00000100);
   BYTE bit3 = (b & 0b00001000);
   BYTE bit4 = (b & 0b00010000);
   BYTE bit5 = (b & 0b00100000);
   BYTE bit6 = (b & 0b01000000);
   BYTE bit7 = (b & 0b10000000);

   BYTE p = (bit0 & bit1 & bit2 & bit3 & bit4 & bit5 & bit6 & bit7);


   mCheckPortHandle(iport);

#if 0
   switch ( parity )
      {
      case 1:
         if ( iport == P6720SER1 )
            {
            TXSTAbits.TX9D = (1-p);break;
            }
         else
            {
            TXSTA2bits.TX9D = (1-p);break;
            }
      case 2:
         if ( iport == P6720SER1 )
            {
            TXSTAbits.TX9D = p;break;
            }
         else
            {
            TXSTA2bits.TX9D = p;break;
            }
      }
#endif
}


//====================================================================================
/*Checks the parity bit returns 0 if parity fails, returns 1 if parity passes*/
BYTE checkParityBit(UINT iport, BYTE b)
{
   BYTE bit0 = (b & 0b00000001);
   BYTE bit1 = (b & 0b00000010);
   BYTE bit2 = (b & 0b00000100);
   BYTE bit3 = (b & 0b00001000);
   BYTE bit4 = (b & 0b00010000);
   BYTE bit5 = (b & 0b00100000);
   BYTE bit6 = (b & 0b01000000);
   BYTE bit7 = (b & 0b10000000);

   BYTE p = (bit0 & bit1 & bit2 & bit3 & bit4 & bit5 & bit6 & bit7);

   mCheckPortHandle(iport);

#if 0
   switch ( parity )
      {

      case 1:
         if ( iport == P6720SER1 )
            {
            if ( TXSTAbits.TX9D == (1-p) )
               {
               return 1;
               }
            else
               {
               return 0;
               }
            }
         else
            {
            if ( TXSTA2bits.TX9D == (1-p) )
               {
               return 1;
               }
            else
               {
               return 0;
               }
            }
         break;

      case 2:

         if ( iport ==P6720SER1 )
            {
            if ( TXSTAbits.TX9D == p )
               {
               return 1;
               }
            else
               {
               return 0;
               }
            }
         else
            {
            if ( TXSTA2bits.TX9D == p )
               {
               return 1;
               }
            else
               {
               return 0;
               }
            }

         break;
      }
#endif
}


//====================================================================================

VOID mDisableUARTTxInt(UINT iport)
{
   mCheckPortHandle(iport);

   if ( iport == (UINT)P6720SER1 )
      {
      PIE1bits.TXIE = 0;
      }
   else
      {
      PIE3bits.TX2IE = 0;
      }
}


//====================================================================================

VOID mEnableUARTTxInt(UINT iport)
{
   mCheckPortHandle(iport);

   if ( iport == (UINT)P6720SER1 )
      {
      PIE1bits.TXIE = 1;
      }
   else
      {
      PIE3bits.TX2IE = 1;
      }
}


//====================================================================================

VOID mDisableUARTRxInt(UINT iport)
{
   mCheckPortHandle(iport);

   if ( iport == (UINT)P6720SER1 )
      {
      PIE1bits.RCIE = 0;
      }
   else
      {
      PIE3bits.RC2IE = 0;
      }
}


//====================================================================================

VOID mEnableUARTRxInt(UINT iport)
{
   mCheckPortHandle(iport);

   if ( iport == (UINT)P6720SER1 )
      {
      PIE1bits.RC1IE = 1;
      }
   else
      {
      PIE3bits.RC2IE = 1;
      }
}


//====================================================================================

VOID mSetUARTRxIntHighPrior(UINT iport)
{
   mCheckPortHandle(iport);

   RCONbits.IPEN = 1;
   if ( iport == (UINT)P6720SER1 )
      {
      IPR1bits.RC1IP = 1;
      }
   else
      {
      IPR3bits.RC2IP = 1;
      }
}


//====================================================================================

VOID mSetUARTRxIntLowPrior(UINT iport)
{
   mCheckPortHandle(iport);

   if ( iport == (UINT)P6720SER1 )
      {
      IPR1bits.RCIP = 0;
      }
   else
      {
      IPR3bits.RC2IP = 0;
      }
}


//====================================================================================

VOID mSetUARTTxIntHighPrior(UINT iport)
{
   mCheckPortHandle(iport);

   RCONbits.IPEN = 1;
   if ( iport == (UINT)P6720SER1 )
      {
      IPR1bits.TXIP = 1;
      }
   else
      {
      IPR3bits.TX2IP = 1;
      }
}


//====================================================================================

VOID mSetUARTTxIntLowPrior(UINT iport)
{
   mCheckPortHandle(iport);

   if ( iport == (UINT)P6720SER1 )
      {
      IPR1bits.TXIP = 0;
      }
#ifdef P18F6720
   else
      {
      IPR3bits.TX2IP = 0;
      }
#endif
}


//====================================================================================

VOID mSetUART_BRGHHigh(UINT iport)
{
   mCheckPortHandle(iport);

   if ( iport == (UINT)P6720SER1 )
      {
      TXSTAbits.BRGH = 1;
      }
   else
      {
      TXSTA2bits.BRGH = 1;
      }
}


//====================================================================================

VOID mSetUART_BRGHLow(UINT iport)
{
   mCheckPortHandle(iport);

   if ( iport == (UINT)P6720SER1 )
      {
      TXSTAbits.BRGH = 0;
      }
   else
      {
      TXSTA2bits.BRGH = 0;
      }
}


//====================================================================================

VOID mSetUARTBaud(UINT iport, UINT iBaudRate)
{

   mCheckPortHandle(iport);

   if ( iport == (UINT)P6720SER1 )
      {
      RCSTAbits.SPEN = 0;
      SPBRG = iBaudRate;
      RCSTAbits.SPEN = 1;
      }
   else
      {
      RCSTA2bits.SPEN = 0;
      SPBRG2 = iBaudRate;
      RCSTA2bits.SPEN = 1;
      }
}

VOID mSetRS485_RTSHigh (UINT iport)
{
   if ( iport == (UINT)P6720SER1 )
      {
      PORTCbits.RC5 = 1 ;
      }
   else
      {
      PORTGbits.RG3 = 1 ;
      }
}

VOID mSetRS485_RTSLow (UINT iport)
{
   if ( iport == (UINT)P6720SER1 )
      {
      PORTCbits.RC5 = 0 ;
      }
   else
      {
      PORTGbits.RG3 = 0 ;
      }

}


//====================================================================================

BYTE mCheckPortHandle(UINT iport)
{
   if ( iport >= (BYTE)PORTS )
      {
      return 0;
      }
   else
      {
      return 1;
      }

}


//====================================================================================

VOID init_timer(VOID)
{
   /* Setting Global interrupt pins */
   INTCONbits.GIEH = 1;
   INTCONbits.GIEL = 1;

   IPR1bits.TMR2IP = 1;                //TMR1 interrupt set to high priority
   PIE1bits.TMR2IE = 1;
   PIR1bits.TMR2IF = 0;

   T2CON = 0b00000111;                // INit timer 2
   PR2   = TMR2_PERIOD_REGISTER;      //Load Timer 1 value


}


//====================================================================================



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -