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

📄 812pg.c

📁 用于工业控制方面.常见的板卡操作.板卡型号为812板.
💻 C
📖 第 1 页 / 共 2 页
字号:
	unsigned int        Low_addres,High_addres,total;
	unsigned long int   Long_addres;
	unsigned char       page_address[4] = {0x00,PAGE1_REG_ADDRS,0x00,PAGE3_REG_ADDRS};

	if ( Board_Status[Card_No] == NO_INIT )     return Board_No_Init ;
	if ( ad_ch_no < 0 || ad_ch_no > 15 )        return Invalid_AD_Channel ;
    if ( ad_gain < 0 || ad_gain > 4 )           return Invalid_AD_Gain ;
    if ( dma_ch_no != 1 && dma_ch_no != 3 )     return Invalid_DMA_Channel;
    if ( irq_no < 2 || irq_no == 8 || irq_no == 13 || irq_no > 15 )
                                                return Invalid_IRQ_Channel;
    if ( c1==1 || c2==1 || (unsigned long)c1*c2 < 20 )
                                                return Invalid_Timer_Value ;
/*----------------------------------------------------------------------*/
/* DMA Function Setup                                                   */
/* Keep Card n DMA Number                                               */
/*----------------------------------------------------------------------*/
    DMA_Set  [Card_No] = 1;
    AD_DMA_Ch[Card_No] = dma_ch_no;
    AD_DMA_Count[Card_No] = dma_count;
    AD_INT_Ch[ Card_No ] = irq_no;

    if (irq_no < 8)             Ext_IRQ_Vect[Card_No] = 0x08 + irq_no ;
    else  if (irq_no == 9)      Ext_IRQ_Vect[Card_No] = 0x0A ;
          else                  Ext_IRQ_Vect[Card_No] = 0x70 + irq_no - 8;


    _812_AD_Timer( 0 , 0 );

    outp( Base_Address[Card_No]+GAIN_CTRL,ad_gain  ); /* Select A/D Gain   */
    outp( Base_Address[Card_No]+MUX_CTRL ,ad_ch_no);  /* Select A/D channel */
    outp( Base_Address[Card_No]+MODE_CTRL, 0x00);       /* Disable trig */
    outp( Base_Address[Card_No]+CLR_IRQ , 0 );


/*---- ISR Vector Setup   ----------------------------------------------*/
    disable();

/*    if (Card_No == 0){
	old_isr0 = getvect( Ext_IRQ_Vect[Card_No] );
	setvect( Ext_IRQ_Vect[Card_No] , dma_isr0 );
    }
    else{
	old_isr1 = getvect( Ext_IRQ_Vect[Card_No] );
		setvect( Ext_IRQ_Vect[Card_No] , dma_isr1 );
    } */
/*---- DMA Setup -------------------------------------------------------*/
    outp( DMA_WR_CLRFF , 0xFF );                        /* DMA FLIP FLOP Low byte first */
    outp( DMA_WR_MODE ,  LOBYTE(dma_ch_no)+0x44 );      /* single mode,channel x,write, */

/*---- get DMA ADDRESS pointer -----------------------------------------*/
    Long_addres =  (unsigned long int)FP_OFF(ad_buffer)
                +  (unsigned long int)FP_SEG(ad_buffer) *16;

    Low_addres =  LOWORD ( Long_addres ) ;
    High_addres = HIWORD ( Long_addres ) ;

/*---- set DMA base address --------------------------------------------*/
    outp( DMA0_BASE_ADDRS+dma_ch_no*2 , LOBYTE(Low_addres));  /* Offset of A/D data buffer A            */
    outp( DMA0_BASE_ADDRS+dma_ch_no*2 , HIBYTE(Low_addres));  /* Offset of A/D data buffer A            */

/*---- set DMA page address --------------------------------------------*/
    outp( page_address[dma_ch_no] , LOBYTE(High_addres));

/*---- get & set DMA counter -------------------------------------------*/
    total = dma_count*2-1 ;
    outp( DMA0_BASE_CNTR+dma_ch_no*2 , LOBYTE(total)  );     /* DMA count number */
    outp( DMA0_BASE_CNTR+dma_ch_no*2 , HIBYTE(total)  );     /* DMA count number */

    enable();
/*---- disable DMA_CH_NO mask ------------------------------------------*/
    outp( DMA_WR_MASK, dma_ch_no );             /* Ready to acept DRQ */

/*  set 8259 */
    if( irq_no < 8 ){
        irqmask = inportb( IC8259_1 + 1 );
        Ext_Irqmask[Card_No] = irqmask ;
        outp( IC8259_1 + 1 , irqmask & (0xFF ^ (1 << irq_no)));
    }
    else{
        irqmask = inportb( IC8259_1 + 1 );
        outp( IC8259_1 + 1 , irqmask & 0xFB );  /* IRQ2 : 1111 1011 */
		irqmask = inportb( IC8259_2 + 1 );
        Ext_Irqmask[Card_No] = irqmask ;
        outp( IC8259_2 + 1 , irqmask & (0xFF ^ (1 << (irq_no - 8))));
    }
/*---- Timer Setup --------------------------------------------------------*/
    _812_AD_Timer( c1 , c2 );
/*---- DMA Transfer begin -------------------------------------------------*/
    outp( Base_Address[Card_No]+MODE_CTRL,0x02 );

    return NoError;
}


/*----------------------------------------------------------------------*/
int _812_AD_DMA_Status( int *status , int *count )
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     Base_Address[2];
extern  int     DMA_Set[2];
extern  int     AD_DMA_Ch[2];

    int tc_flag;

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;
    if (DMA_Set[Card_No] == 0)                  return AD_DMA_Not_Set ;

    outp( DMA_WR_CLRFF , 0xFF );        /* DMA FLIP FLOP Low byte first */
    *count = inp( DMA0_BASE_CNTR + AD_DMA_Ch[Card_No] *2 );
    *(&(char)*count + 1) = inp( DMA0_BASE_CNTR + AD_DMA_Ch[Card_No] *2 );
    *count = (*count+1) >> 1;
    *count = AD_DMA_Count[Card_No] - *count ;

    tc_flag = inp( DMA_RD_STATUS ) ;
    if ( tc_flag & ( 1 << AD_DMA_Ch[Card_No] ) )
        *status = AD_DMA_STOP;
    else
        *status = AD_DMA_RUN;
	return NoError;
}


/*----------------------------------------------------------------------*/
int _812_AD_DMA_Stop( int *count )
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     Base_Address[2];
extern  int     DMA_Set[2];
extern  int     AD_DMA_Ch[2];
extern  int     Ext_Irqmask[2];
extern  int     Ext_IRQ_Vect[2];

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;
    if (DMA_Set[Card_No] == 0)                  return AD_DMA_Not_Set ;

    outp( Base_Address[Card_No]+MODE_CTRL, 0x01);
	DMA_Set[ Card_No ] = 0;
    _812_AD_Timer( 0 , 0 );

    if( AD_INT_Ch[Card_No]<8 )  outp( IC8259_1 + 1 , Ext_Irqmask[Card_No]  );
    else                        outp( IC8259_2 + 1 , Ext_Irqmask[Card_No]  );


/*    if (Card_No == 0)   setvect( Ext_IRQ_Vect[0] ,  old_isr0 );
    else                setvect( Ext_IRQ_Vect[1] ,  old_isr1 );
*/
    outp( Base_Address[Card_No]+CLR_IRQ , 0 );

    outp( DMA_WR_CLRFF , 0xFF );        /* DMA FLIP FLOP Low byte first */

    *count = inp( DMA0_BASE_CNTR + AD_DMA_Ch[Card_No] *2 );

    *(char *)((char *)count + 1) =
                           inp( DMA0_BASE_CNTR + AD_DMA_Ch[Card_No] *2 );

	*count = (*count+1) >> 1;

    *count = AD_DMA_Count[Card_No] - *count;

    return NoError;
}


/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
void interrupt ad_isr0(void)
{
        int     d1,d2;

        outp( Base_Address[0]+CLR_IRQ , 0 );
        if( AD_Counter[0] < AD_INT_Count[0] )
        {
                d1 = inp(Base_Address[0]+AD_L)  ;
				d2 = inp(Base_Address[0]+AD_H)  ;
				* (AD_INT_Buf[0]+AD_Counter[0] ) = d1 + ((d2<<8) & 0x0F00) ;
				AD_Counter[0] ++;
		}

		else    AD_INT_Status[0] = AD_INT_STOP;

		if( AD_INT_Ch[0] > 8 )  outp( IC8259_2, EOI );
		outp( IC8259_1 , EOI );

}

void interrupt ad_isr1(void)
{
		int d1,d2;

		outp( Base_Address[1]+CLR_IRQ , 0 );
        if( AD_Counter[1] < AD_INT_Count[1] )
        {
				d1 = inp(Base_Address[1]+AD_L)  ;
                d2 = inp(Base_Address[1]+AD_H)  ;
				* (AD_INT_Buf[1]+AD_Counter[1] ) = d1 + ((d2<<8) & 0x0F00) ;
				AD_Counter[1] ++;
		}
		else    AD_INT_Status[1] = AD_INT_STOP;

		if( AD_INT_Ch[1] > 8 )  outp( IC8259_1, EOI );
		outp( IC8259_1 , EOI );

}
/*----------------------------------------------------------------------*/
int _812_AD_INT_Start( int ad_ch_no, int ad_gain , int irq_no, int count ,
					   int *ad_buffer , int c1 , int c2)
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     Base_Address[2];
extern  int     Ext_Irqmask[2];
extern  int     Ext_IRQ_Vect[2];
extern  int     AD_INT_Status[2];
extern  int     AD_INT_Set[2];
extern  int     AD_INT_Ch[2];
extern  int     AD_INT_Count[2];

    unsigned char       irqmask;

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;
    if ( ad_ch_no < 0 || ad_ch_no > 15 )        return Invalid_AD_Channel ;
    if ( ad_gain < 0 || ad_gain > 4 )           return Invalid_AD_Gain ;
    if ( irq_no < 2 || irq_no == 8 || irq_no == 13 || irq_no > 15 )
                                                return Invalid_IRQ_Channel;
    if ( c1==1 || c2==1 || (unsigned long)c1*c2 < 20 )
                                                return Invalid_Timer_Value ;
/*---- AD Interrupt Transfer Setup -------------------------------------*/
    _812_AD_Timer( 0 , 0 );

    outp( Base_Address[Card_No]+GAIN_CTRL,ad_gain  );  /* Select A/D Gain      */
	outp( Base_Address[Card_No]+MUX_CTRL ,ad_ch_no );  /* Select A/D channel   */
    outp( Base_Address[Card_No]+MODE_CTRL, 0x00);       /* Disable trig */
    outp( Base_Address[Card_No]+CLR_IRQ  ,0   );

    AD_INT_Set[Card_No] = 1;
    AD_INT_Status[Card_No] = AD_INT_RUN;
    AD_INT_Count[ Card_No ] = count ;
    AD_INT_Buf[ Card_No ] = ad_buffer;
    AD_INT_Ch[ Card_No ] = irq_no;
    AD_Counter[ Card_No ] = 0;

    if (irq_no < 8)             Ext_IRQ_Vect[Card_No] = 0x08 + irq_no ;
    else  if (irq_no == 9)      Ext_IRQ_Vect[Card_No] = 0x0A ;
	  else                  Ext_IRQ_Vect[Card_No] = 0x70 + irq_no -8;


/*    if (Card_No == 0){
	old_isr0 = getvect( Ext_IRQ_Vect[Card_No] );
        setvect( Ext_IRQ_Vect[Card_No] , ad_isr0 );
	}
    else{
        old_isr1 = getvect( Ext_IRQ_Vect[Card_No] );
        setvect( Ext_IRQ_Vect[Card_No] , ad_isr1 );
    }
*/
/*---- Set 8259 --------------------------------------------------------*/
    disable();
    if( irq_no < 8 ){
        irqmask = inp( IC8259_1 + 1 );
        Ext_Irqmask[Card_No] = irqmask ;
        outp( IC8259_1 + 1 , irqmask & (0xFF ^ (1 << irq_no)) );
    }
    else{
        irqmask = inp( IC8259_1 + 1 );
        outp( IC8259_1 + 1 , irqmask & 0xFB );  /* IRQ2 : 1111 1011 */
        irqmask = inp( IC8259_2 + 1 );
        Ext_Irqmask[Card_No] = irqmask ;
        outp( IC8259_2 + 1 , irqmask & (0xFF ^ (1 << (irq_no-8) )) );
	}
    enable();
    _812_AD_Timer( c1 , c2 );
    outp( Base_Address[Card_No]+MODE_CTRL, 0x06); /* Interrupt Transfer */

    return NoError;
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
int _812_AD_INT_Status( int *status, int *count  )
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     AD_INT_Status[2];
extern  int     AD_INT_Count[2];

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;

    *count = AD_Counter[ Card_No ];
	*status = AD_INT_Status[ Card_No ];

    return NoError;
}


/*----------------------------------------------------------------------*/
int _812_AD_INT_Stop( int *count )
{
    extern int Base_Address[2],Card_No;
    extern int Ext_Irqmask[2] , Ext_IRQ_Vect[2];

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;
    if (AD_INT_Set[Card_No] == 0)               return AD_INT_Not_Set ;

    outp( Base_Address[Card_No]+MODE_CTRL, 0x01);       /* Soft trig */

    if( AD_INT_Ch[Card_No]<8 )  outp( IC8259_1 + 1 , Ext_Irqmask[Card_No]  );
    else                        outp( IC8259_2 + 1 , Ext_Irqmask[Card_No]  );

    _812_AD_Timer( 0 , 0 );

/*    if (Card_No == 0)   setvect( Ext_IRQ_Vect[0] ,  old_isr0 );
    else                setvect( Ext_IRQ_Vect[1] ,  old_isr1 );
*/
    *count = AD_Counter[ Card_No ];

    return NoError;
}

/*----------------------------------------------------------------------*/
/*------------------------------------------ Timer ---------------------*/
/*----------------------------------------------------------------------*/

int _812_TIMER_Start( int timer_mode , unsigned int c0)
{
    extern int Base_Address[2],Card_No;

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;
	if (timer_mode<0 || timer_mode>5)           return Invalid_Timer_Mode ;

    Ext_Timer_Mode[Card_No] = timer_mode ;
    outp(Base_Address[Card_No]+TMR_MODE, 0x30 | (timer_mode<<1) );
    outp(Base_Address[Card_No]+TIMER0 , LOBYTE(c0) );
    outp(Base_Address[Card_No]+TIMER0 , HIBYTE(c0) );

    return NoError;
}

/*----------------------------------------------------------------------*/
int _812_TIMER_Read( unsigned int *counter_value )
{
    extern int Base_Address[2],Card_No;

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;

    outp(Base_Address[Card_No]+TMR_MODE, 0x00);
    *counter_value = inp(Base_Address[Card_No]+TIMER0);
    *(&(char)*counter_value + 1) = inp(Base_Address[Card_No]+TIMER0);

    return NoError;
}

/*----------------------------------------------------------------------*/
int _812_TIMER_Stop( unsigned int *counter_value ){
    extern int Base_Address[2],Card_No;

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;

    outp(Base_Address[Card_No]+TMR_MODE, 0x00);
    *counter_value = inp(Base_Address[Card_No]+TIMER0);
    *(&(char)*counter_value + 1) = inp(Base_Address[Card_No]+TIMER0);

    outp(Base_Address[Card_No]+TMR_MODE,0x30);
    outp(Base_Address[Card_No]+TIMER0,1);
    outp(Base_Address[Card_No]+TIMER0,0);

    return NoError;
}

⌨️ 快捷键说明

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