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

📄 812pg.c

📁 用于工业控制方面.常见的板卡操作.板卡型号为812板.
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************/
/*      File name :     812PG.C                                         */
/*      Purpose :       ACL-812PG Library Source Code                   */
/*      Date :          5/15/1994                                       */
/*      Version :       1.0                                             */
/*                                                                      */
/*      Copyright ADCLONE Inc. (c) 1994  all right reserved             */
/************************************************************************/
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include "\ns\lib\812\812pg.h"

/**************************************/
/* Constants Decalerations            */
/**************************************/

#define         LOBYTE(arg)     (*(unsigned char *)&arg)
#define         HIBYTE(arg)     (*((unsigned char *)&arg + 1))
#define         LOWORD(arg)     (*(unsigned int *)&arg)
#define         HIWORD(arg)     (*((unsigned int *)&arg + 1))

/***** Define Relative Addresses *****/
#define         TIMER0          0x00
#define         TIMER1          0x01
#define         TIMER2          0x02
#define         TMR_MODE        0x03
#define         DA1_L           0x04
#define         DA1_H           0x05
#define         DA2_L           0x06
#define         DA2_H           0x07
#define         CLR_IRQ         0x08
#define         GAIN_CTRL       0x09
#define         MUX_CTRL        0x0A
#define         MODE_CTRL       0x0B
#define         SOFT_TRIG       0x0C
#define         DOUT_L          0x0D
#define         DOUT_H          0x0E

#define         AD_L            0x04
#define         AD_H            0x05
#define         DIN_L           0x06
#define         DIN_H           0x07

/*-------  Define DMA  ---------------------------------*/
#define         DMA                 0
#define         DMA_WR_MASK         DMA+0x0A
#define         DMA_WR_MODE         DMA+0x0B
#define         DMA_WR_CLRFF        DMA+0x0C
#define         DMA_RD_STATUS       DMA+0x08
#define         DMA0_BASE_ADDRS     DMA+0x00
#define         DMA0_BASE_CNTR      DMA+0x01
#define         DMA1_BASE_ADDRS     DMA+0x02
#define         DMA1_BASE_CNTR      DMA+0x03
#define         DMA3_BASE_ADDRS     DMA+0x06
#define         DMA3_BASE_CNTR      DMA+0x07
#define         PAGE1_REG_ADDRS     0x83
#define         PAGE3_REG_ADDRS     0x82

/*-------  Define 8259 ---------------------------------*/
#define         IC8259_1        0x20
#define         IC8259_2        0xA0
#define         EOI             0x20

/*------------------------------------------------------*/
#define         NO_INIT      0xff
#define         INITIALED         0x00

void    interrupt       dma_isr0(void);
void    interrupt       dma_isr1(void);
void    interrupt       ad_isr0(void);
void    interrupt       ad_isr1(void);
void    interrupt       (*old_isr0)(void);
void    interrupt       (*old_isr1)(void);

int   Card_No;
int   Board_Status[2]   ={NO_INIT,NO_INIT};
int   Base_Address[2];
int   Ext_IRQ_Vect[2];
int   Ext_Irqmask[2];
int   DMA_Set[2]        ={0,0};
int   AD_INT_Ch[2]      ={0,0};
int   AD_DMA_Ch[2]      ={1,3};
int   AD_TC_Flag[2]     ={1,1};
int   AD_INT_Count[2];
int   AD_Counter[2];
int   AD_INT_Set[2]     ={0,0};
int   *AD_INT_Buf[2];
int   AD_INT_Status[2]     ={ AD_INT_STOP , AD_INT_STOP };
int   Ext_Timer_Mode[2];
int   AD_DMA_Count[2] ;
/*----------------------------------------------------------------------*/
int _812_Initial(int card_index  ,int address)
{
    extern int Card_No;
    extern int Base_Address[2];
    extern int Board_Status[2];

        if ( card_index != 0 && card_index != 1 )   return Invalid_Board_Number;

		if ( address > 0x3f0 || address < 0x200 || (address & 0x0f) != 0){
                Board_Status[card_index] = NO_INIT ;
                return Base_Address_Error ;
        }

        Card_No = card_index;
        Base_Address[ Card_No ] = address;
        Board_Status[card_index] = INITIALED ;
        return NoError ;
}
int _812_Switch_Card_No( int card_index )
{
    extern int Card_No;

        if ( card_index != 0 && card_index != 1 )   return Invalid_Board_Number;
        if (Board_Status[card_index] == NO_INIT)    return Board_No_Init ;

        Card_No = card_index;
        return NoError;
}
/*---------------------------------------------- Digital Input  ------------*/
int _812_DI(int port_no, unsigned char *data )
{
    extern int Card_No;
    extern int Base_Address[2];
    extern int Board_Status[2];


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

    if (port_no == 0)
        *data = inp( Base_Address[Card_No]+DIN_L );
    else if (port_no == 1)
        *data = inp( Base_Address[Card_No]+DIN_H );
    else
        return Port_Error;

    return      NoError;
}

/*----------------------------------------------------------------------*/
int _812_DI_Channel( int ch_no, unsigned int *data )
{
    extern int Card_No;
    extern int Base_Address[2];
    extern int Board_Status[2];

    unsigned char dt;

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;
    if( ch_no > 15 || ch_no<0 )                 return  Invalid_DI_Channel;

    if( ch_no >=8 )
    {
                _812_DI( DI_HI_BYTE , &dt );
                ch_no-=8;
    }
    else        _812_DI( DI_LO_BYTE , &dt );

    *data = ((unsigned int)dt       >> ch_no) & 0x01;
    return  NoError;
}


/*---------------------------------------------- Digital Output ------------*/
/*int _812_DO_Old( int port_no, unsigned char data )
{
	extern int Card_No;
    extern int Base_Address[2];
    extern int Board_Status[2];

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

    if (port_no == 0)
	outp( Base_Address[Card_No] + DOUT_L , data );
    else if (port_no == 1)
	outp( Base_Address[Card_No] + DOUT_H , data );
    else
	return Port_Error;

    return      NoError;
}
*/
int _812_DO(unsigned  data )
{
	if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;

	outpw( Base_Address[Card_No] + DOUT_L , data );
	return      NoError;

}

/*---------------------------------------------- DA  -----------------------*/
int _812_DA( int da_no, unsigned int  data )
{
    extern int Card_No;
    extern int Base_Address[2];
    extern int Board_Status[2];

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

    if (da_no == 0){
        outp(Base_Address[Card_No]+DA1_L,LOBYTE(data));
        outp(Base_Address[Card_No]+DA1_H,HIBYTE(data));
    }
    else if (da_no == 1){
        outp(Base_Address[Card_No]+DA2_L,LOBYTE(data));
        outp(Base_Address[Card_No]+DA2_H,HIBYTE(data));
    }
    else{
        return Invalid_DA_Channel;
    }
	return      NoError;
}

/*---------------------------------------------- AD  -----------------------*/
int _812_AD_Set_Channel( int ch )
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     Base_Address[2];

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;
    if (  ch < 0 || ch > 15 )                   return Invalid_AD_Channel ;

    outp(Base_Address[Card_No]+MUX_CTRL , ch  );
    return NoError;
}
/*----------------------------------------------------------------------*/
int _812_AD_Set_Gain( int gain  )
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     Base_Address[2];

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;
    if ( gain < 0 || gain > 4 )                 return Invalid_AD_Gain ;
    outp(Base_Address[Card_No]+GAIN_CTRL , gain );
    return NoError;
}
/*----------------------------------------------------------------------*/
int _812_AD_Set_Mode( int mode  )
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     Base_Address[2];

    if (Board_Status[Card_No] == NO_INIT)       return Board_No_Init ;
    if ( mode < 0 || mode > 7 )                 return Invalid_Mode ;

	outp(Base_Address[Card_No]+MODE_CTRL, mode );
    return NoError;
}

/*----------------------------------------------------------------------*/
int _812_AD_Soft_Trig( void )
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     Base_Address[2];

    if ( Board_Status[Card_No] == NO_INIT )     return Board_No_Init ;
    outp( Base_Address[Card_No]+SOFT_TRIG, 0 );
    return NoError;
}

/*----------------------------------------------------------------------*/
int _812_CLR_IRQ( void )
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     Base_Address[2];

    if ( Board_Status[Card_No] == NO_INIT )  return Board_No_Init ;
    outp( Base_Address[Card_No]+CLR_IRQ, 0 );
    return NoError;
}

/*----------------------------------------------------------------------*/
int _812_AD_Aquire( int *ad_data )
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     Base_Address[2];

    int time_out_index=0;

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

    outp(Base_Address[Card_No]+MODE_CTRL , AD_MODE_1 );    /* Set Soft Transfer*/
    outp(Base_Address[Card_No]+SOFT_TRIG ,   0       );    /* Software Trigger */

    do {
        *(char *)((char *)ad_data + 1) = inp( Base_Address[Card_No]+AD_H );
        if ( time_out_index++ == 200 )          return AD_Aquire_Time_Out ;

    }while(  (*(&(char)*ad_data + 1) & 0x10 ) == 0x10 );   /* Check data ready */

    *(char *)(ad_data)=(char)inp( Base_Address[Card_No]+AD_L );
    return  NoError;
}


/*----------------------------------------------------------------------*/
int _812_AD_Timer( int c1 , int c2 )
{
extern  int     Card_No;
extern  int     Board_Status[2];
extern  int     Base_Address[2];

    if ( Board_Status[Card_No] == NO_INIT )     return Board_No_Init ;
    if ( c1!=0 && c2!=0 ) {
        if ( c1==1 || c2==1 || (unsigned long)c1*c2 < 20 )
			 return Invalid_Timer_Value ;
    }
    outp( Base_Address[Card_No]+TMR_MODE , 0x76 );    /* Mode 3 : Timer 1*/
    outp( Base_Address[Card_No]+TIMER1 , LOBYTE( c1 ) );
    outp( Base_Address[Card_No]+TIMER1 , HIBYTE( c1 ) );

    outp( Base_Address[Card_No]+TMR_MODE , 0xB6 );    /* Mode 3 : Timer 2*/
    outp( Base_Address[Card_No]+TIMER2 , LOBYTE( c2 ) );
    outp( Base_Address[Card_No]+TIMER2 , HIBYTE( c2 ) );
	return  NoError;
}

/*----------------------------------------------------------------------*/
void interrupt dma_isr0(void)
{
extern  int     Base_Address[2];
extern  int     AD_INT_Ch[2];
extern  int     AD_DMA_Ch[2];

		outportb( Base_Address[0]+MODE_CTRL,0x00); /* Disable Internal Trig */
		outportb( Base_Address[0]+CLR_IRQ , 0 );

		outportb( DMA_WR_MASK, 0x04 + AD_DMA_Ch[0]);

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

void interrupt dma_isr1(void)
{
extern  int     Base_Address[2];
extern  int     AD_INT_Ch[2];
extern  int     AD_DMA_Ch[2];

        outportb( Base_Address[1]+MODE_CTRL,0x00); /* Disable Internal Trig */
        outportb( Base_Address[1]+CLR_IRQ , 0 );

        outportb( DMA_WR_MASK, 0x04 + AD_DMA_Ch[1]);

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


/*----------------------------------------------------------------------*/
int _812_AD_DMA_Start( int ad_ch_no, int ad_gain , int dma_ch_no , int irq_no,
                       int dma_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     DMA_Set[2];
extern  int     AD_DMA_Ch[2];

	unsigned char       irqmask;

⌨️ 快捷键说明

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