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

📄 serio.c

📁 PROFIBUS SLAVE PROGRAMS PRO FIBUS SLAVE PROGRAMS
💻 C
📖 第 1 页 / 共 2 页
字号:
				Set_SMOD1();		//SMOD1 = 1
   				BRL = 191;
   				break;
   			}	

   			case 9600:
   			{
				Set_SMOD1();		//SMOD1 = 1
   				BRL = 126;
   				break;
   			}	

   			case 4800:
   			{
   				BRL = 126;
   				break;
   			}	

			case 38400:
   			default:
   			{
				Set_SMOD1();		//SMOD1 = 1
   				BRL = 223;
   				break;
   			}	
   		}//switch( baudrate )
   	#else
		Set_SMOD1();				//SMOD1 = 1
   		switch( baudrate )
   		{
   			case 57600:
   			{
   				BRL = 245;
   				break;
   			}	

   			case 19200:
   			{
   				BRL = 223;
   				break;
   			}	

   			case 9600:
   			{
   				BRL = 191;
   				break;
   			}	

   			case 4800:
   			{
   				BRL = 126;
   				break;
   			}	

			case 38400:
   			default:
   			{
   				BRL = 240;
   				break;
   			}	
   		}//switch( baudrate )
	#endif//#ifdef AT89C5132_MODE_X2

	REN=1;
    // clear interrupt flags
    TI = RI = 0;
	IPH0 |= MSK_ES;
	IPL0 |= MSK_ES;
 	ES = 1; 						//Enable serial interrupt
   	BDRCON |= 0x10;               	//Baud rate generator run
}//void init_serio__ (UWORD baudrate)
#endif//#ifdef EvaBoard_AT89C5132

#ifdef _C501
void init_serio__(UWORD baudrate)
{
    memset(&snd_buff[0], 0, sizeof(snd_buff));
    memset(&rec_buff[0], 0, sizeof(snd_buff));

    write_rec_ptr = 0;      // Writepointer into receive buffer
    read_rec_ptr  = 0;      // Readpointer  from receive buffer
    rec_counter   = 0;      // Counter of byte in receive buffer
    write_snd_ptr = 0;      // Writepointer into send buffer
    read_snd_ptr  = 0;      // Readpointer  from send buffer
    snd_counter   = 0;      // Counter of byte in send buffer

    serial_state  = ON;     // shows state of serial line
    thr_empty     = TRUE;   // Transmitter reg. empty

    // set timer 2 to baudrate generator
    // set default values to timer 2
    // set baudrate
    set_baud ( baudrate );

    T2CON = 0x00;
    // enable transmit and receive clock
    //T2IE = T2RSE = 1;
    RCLK = TCLK = 1;
    // start timer 2
    TR2 = 1;
    // serial line configuration
    // mode 3, 9bit UART
    SM0 = SM1 = 1;
    // port3 pins
    TXD = RXD = 1;
    // receive enable
    REN = 1;
    // clear interrupt flags
    TI = RI = 0;
    // enable serial interrupt
    ES = 1;
    // set high priority
    //PS = 1;
    CTS = 1 ;        // Define as Input pin
    RTS = 1 ;        // Do not want to send yet
}//void init_serio__ (UWORD baudrate)

/*---------------------------------------------------------------------------*/
/*                                                                           */
/*   void set_baud ( UWORD baudrate )                                        */
/*                                                                           */
/*   function:     set baudrate                                              */
/*                                                                           */
/*---------------------------------------------------------------------------*/
void set_baud (UWORD baudrate)
{
    // set baudrate 24MHz
    switch(baudrate)
    {
        case 11520:
        {
            //set reload value
            RCAP2H = 0xFF;
            RCAP2L = 0xF8;
            break;
        }

        case 57600:
        {
            //set reload value
            RCAP2H = 0xFF;
            RCAP2L = 0xF3;
            break;
        }

        case 38400:
        {
            // set reload value
            RCAP2H = 0xFF;
            RCAP2L = 0xED;//0xEC;
            break;
        }

        case 19200:
        {
            // set reload value
            RCAP2H = 0xFF;
            RCAP2L = 0xD9;
            break;
        }

        case 9600:
        {
            // set reload value
            RCAP2H = 0xFF;
            RCAP2L = 0xB2;
            break;
        }

        default:
        {
            // Parameter Error
            // Unknown Baudrate
            break ;
        }

    } // end switch( baudrate )
    return;
}//void set_baud (UWORD baudrate)
#endif//#ifdef _C501

/*---------------------------------------------------------------------------*/
/*                                                                           */
/*   void ser_isr ( void ) interrupt                                         */
/*                                                                           */
/*   function:     interrupt routine                                         */
/*                                                                           */
/*---------------------------------------------------------------------------*/
void ser_isr ( void ) interrupt IRQ_UART using 1          // Keil Compiler
//_interrupt(4) _using(1) void ser_isr (void)      // Tasking Compiler
{
    // disable interrupts
    DISABLE_ALL_INTERRUPT_BIT__;

    // send fifo empty
    if( _testbit_( TI ))
    {
        //if( read_snd_ptr == write_snd_ptr )
        if(snd_counter == 0)
        {
            // Nothing to send, set flag
            thr_empty = 1;
            // RTS handshake
            RTS = 1;
        }
        else
        {
            // something to send
            // Byte moved through the ACCU, to get the correct parity set
            ACC = snd_buff [read_snd_ptr];
            // even parity
            TB8 = P;
            // start send
            SBUF = ACC;
            // wraps automatically, since Byte
            read_snd_ptr++;
            snd_counter--;
        }
    }

    // receive fifo full
    if( _testbit_( RI ))
    {
        // read it in!
        rec_buff [write_rec_ptr] = SBUF;
        // Byte moved through the ACCU automatically, so
        // is the correct parity set
        parity = P;
        // here, check EVEN parity
        if( parity != RB8 )
        {

        }
        else
        {
            // clear error
        }

        if(serial_state == ON)
        {
            // wraps automatically since byte
            write_rec_ptr++;
            rec_counter++;
        }
        else
        {
            // clear serial buffer, serial communication is closed
            write_rec_ptr = read_rec_ptr;
            rec_counter = 0;
        }
    }

    // enable interrupts
    ENABLE_ALL_INTERRUPT_BIT__;
}

#endif//#ifdef RS232_SERIO

/*****************************************************************************/
/*  Copyright (C) profichip GmbH 2004. Confidential.                         */
/*****************************************************************************/

⌨️ 快捷键说明

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