This graph shows which files directly or indirectly include this file:
Go to the source code of this file.
Data Structures | |
struct | STG_STRUCT |
union | IO32 |
union | LONGBYTE |
union | WORDBYTE |
Defines | |
#define | __attribute__(x) |
#define | DEFAULT_STG_BASE_ADDRESS 0x200 |
#define | STG_SUCCESS 0 |
#define | STG_FAILURE 1 |
#define | NUM_AXIS_IN_SYS 8 |
#define | MAX_AXIS 8 |
#define | CNT0_D 0x00 |
#define | CNT1_D 0x01 |
#define | CNT0_C 0x02 |
#define | CNT1_C 0x03 |
#define | CNT2_D 0x04 |
#define | CNT3_D 0x05 |
#define | CNT2_C 0x06 |
#define | CNT3_C 0x07 |
#define | CNT4_D 0x08 |
#define | CNT5_D 0x09 |
#define | CNT4_C 0x0a |
#define | CNT5_C 0x0b |
#define | CNT6_D 0x0c |
#define | CNT7_D 0x0d |
#define | CNT6_C 0x0e |
#define | CNT7_C 0x0f |
#define | DAC_0 0x10 |
#define | DAC_1 0x12 |
#define | DAC_2 0x14 |
#define | DAC_3 0x16 |
#define | DAC_4 0x18 |
#define | DAC_5 0x1a |
#define | DAC_6 0x1c |
#define | DAC_7 0x1e |
#define | ADC 0x410 |
#define | ADC_0 0x410 |
#define | ADC_1 0x412 |
#define | ADC_2 0x414 |
#define | ADC_3 0x416 |
#define | ADC_4 0x418 |
#define | ADC_5 0x41a |
#define | ADC_6 0x41c |
#define | ADC_7 0x41e |
#define | CNTRL0 0x401 |
#define | DIO_A 0x400 |
#define | DIO_B 0x402 |
#define | DIO_C 0x404 |
#define | DIO_D 0x401 |
#define | PORT_A 0x400 |
#define | PORT_B 0x402 |
#define | PORT_C 0x404 |
#define | PORT_D 0x405 |
#define | INTC 0x405 |
#define | BRDTST 0x403 |
#define | MIO_1 0x406 |
#define | ABC_DIR 0x406 |
#define | MIO_2 0x407 |
#define | D_DIR 0x407 |
#define | ODDRST 0x407 |
#define | TIMER_0 0x408 |
#define | TIMER_1 0x40a |
#define | TIMER_2 0x40c |
#define | TMRCMD 0x40e |
#define | ICW1 0x409 |
#define | ICW2 0x40b |
#define | OCW1 0x40b |
#define | OCW2 0x409 |
#define | OCW3 0x409 |
#define | IRRreg 0x409 |
#define | ISR 0x409 |
#define | IDLEN 0x409 |
#define | IMR 0x40b |
#define | SELDI 0x40b |
#define | IDL 0x40d |
#define | CNTRL1 0x40f |
#define | IXEVN 0x80 |
#define | IXODD 0x40 |
#define | LIXEVN 0x20 |
#define | LIXODD 0x10 |
#define | EOC 0x08 |
#define | TP0 0x04 |
#define | USR_INT 0x02 |
#define | TP2 0x01 |
#define | AUTOZERO 0x80 |
#define | IXLVL 0x40 |
#define | IXS1 0x20 |
#define | IXS0 0x10 |
#define | USRINT 0x08 |
#define | IA2 0x04 |
#define | IA1 0x02 |
#define | IA0 0x01 |
#define | CNTRL0_AZ 0x80 |
#define | CNTRL0_AD2 0x40 |
#define | CNTRL0_AD1 0x20 |
#define | CNTRL0_AD0 0x10 |
#define | CNTRL0_CAL 0x08 |
#define | CNTRL0_IA2 0x04 |
#define | CNTRL0_IA1 0x02 |
#define | CNTRL0_IA0 0x01 |
#define | CNTRL1_WDTOUT 0x80 |
#define | CNTRL1_INT_G2 0x40 |
#define | CNTRL1_INT_T0 0x10 |
#define | CNTRL1_INT_T2 0x20 |
#define | CNTRL1_NOT_SLAVE 0x08 |
#define | CNTRL1_IEN_G2 0x04 |
#define | CNTRL1_IEN_T0 0x01 |
#define | CNTRL1_IEN_T2 0x02 |
#define | BRDTST_EOC 0x08 |
#define | INTR 13 |
#define | INT_MASK 0x20 |
#define | IC_ADD 0x20 |
#define | EOI_5 0x65 |
#define | IC_MASK 0x21 |
#define | IRQSL 0x84 |
#define | STG_PORT_A 0x01 |
#define | STG_PORT_B 0x02 |
#define | STG_PORT_C_LO 0x04 |
#define | STG_PORT_C_HI 0x08 |
#define | STG_PORT_C (STG_PORT_C_LO | STG_PORT_C_HI) |
#define | STG_PORT_D_LO 0x10 |
#define | STG_PORT_D_HI 0x20 |
#define | STG_PORT_D (STG_PORT_D_LO | STG_PORT_D_HI) |
#define | STG_PORT_INPUT 0 |
#define | STG_PORT_OUTPUT 1 |
#define | A_DIR_BIT 0x10 |
#define | B_DIR_BIT 0x02 |
#define | C_LOW_DIR_BIT 0x01 |
#define | C_HI_DIR_BIT 0x08 |
#define | D_DIR_BIT 0x10 |
#define | D_LOW_DIR_BIT 0x01 |
#define | D_HI_DIR_BIT 0x08 |
#define | _500_MICROSECONDS 500 |
#define | _1_MILLISECOND 1000 |
#define | _2_MILLISECONDS 2000 |
#define | _3_MILLISECONDS 3000 |
#define | _4_MILLISECONDS 4000 |
#define | _5_MILLISECONDS 5000 |
#define | _10_MILLISECONDS 10000 |
#define | _100_MILLISECONDS 100000L |
#define | _1_SECOND 1000000L |
#define | MAX_PERIOD -1L |
#define | NO_BOARD 1 |
#define | BOARD_PRESENT 0 |
#define | MODEL_NO_ID 0 |
#define | MODEL1 1 |
#define | MODEL2 2 |
Enumerations | |
enum | ePort_typ { A_port, B_port, C_port, D_port } |
enum | eHomeDir_typ { HomeSwitchFORWARD, HomeSwitchREVERSE } |
Functions | |
char | __attribute__ ((unused)) stg_h[]="$Id |
void | ServoToGoConstructor (STG_STRUCT *stg, unsigned short wRequestedIrq) |
void | ServoToGoDestructor (STG_STRUCT *stg) |
void | Initialize (STG_STRUCT *stg, unsigned short wRequestedIrq) |
void | SetIrq (STG_STRUCT *stg, unsigned short wRequestedIrq) |
unsigned short | BaseFind (STG_STRUCT *stg) |
unsigned short | BrdtstOK (STG_STRUCT *stg, unsigned short wBaseAddress) |
void | SetDDir (STG_STRUCT *stg, unsigned short nSwDir) |
void | MotSim (STG_STRUCT *stg) |
void | RawDAC (STG_STRUCT *stg, unsigned short nAxis, long lCounts) |
void | StartADC (STG_STRUCT *stg, unsigned short wAxis) |
short | SpinReadADC (STG_STRUCT *stg, unsigned short wAxis) |
long | ReadADC (STG_STRUCT *stg, unsigned short wAxis, short *counts) |
void | AutoZeroAdc (STG_STRUCT *stg) |
void | DontAutoZeroAdc (STG_STRUCT *stg) |
void | CalADC (STG_STRUCT *stg) |
void | EncoderInit (STG_STRUCT *stg) |
void | EncoderLatch (STG_STRUCT *stg) |
void | EncoderResetAddr (STG_STRUCT *stg) |
void | SetEncoderCounts (STG_STRUCT *stg, unsigned short nAxis, long lCounts) |
void | SelectIndexAxis (STG_STRUCT *stg, unsigned char byAxis, unsigned char byPol) |
void | SelectIndexOrExtLatch (STG_STRUCT *stg, unsigned char bySelectBits) |
void | EnableCounterLatchOnIndexOrExt (STG_STRUCT *stg, unsigned char bySelectBits) |
short | IndexPulse (STG_STRUCT *stg) |
unsigned short | IndexPulseLatch (STG_STRUCT *stg) |
void | ResetIndexLatches (STG_STRUCT *stg, unsigned char byLatchBits) |
unsigned char | CurrentIRR (STG_STRUCT *stg) |
void | ResetIndexLatch (STG_STRUCT *stg) |
unsigned char | GetIndexLatches (STG_STRUCT *stg) |
unsigned char | GetSELDI (STG_STRUCT *stg) |
unsigned char | GetIDLEN (STG_STRUCT *stg) |
unsigned char | GetCNTRL0 (STG_STRUCT *stg) |
unsigned char | GetCNTRL1 (STG_STRUCT *stg) |
unsigned char | GetBRDTST (STG_STRUCT *stg) |
void | ResetWatchdogLatch (STG_STRUCT *stg) |
void | EncReadAll (STG_STRUCT *stg, LONGBYTE *lbEnc) |
unsigned long | RawDI (STG_STRUCT *stg) |
void | RawDO (STG_STRUCT *stg, unsigned long lOutBits) |
void | RawDOPort (STG_STRUCT *stg, unsigned char byBitNumber, unsigned char bySet0or1, unsigned short nPort) |
void | DioDirection (STG_STRUCT *stg, const unsigned short nSwDir) |
void | StopTimer (STG_STRUCT *stg) |
void | StartInterrupts (STG_STRUCT *stg) |
void | IrqReset (STG_STRUCT *stg) |
void | SelectInterruptPeriod (STG_STRUCT *stg, long lPeriodSelect) |
void | StopInterrupts (STG_STRUCT *stg) |
unsigned short | GetBoardPresence (STG_STRUCT *stg) |
unsigned short | GetAxes (STG_STRUCT *stg) |
unsigned short | GetIrq (STG_STRUCT *stg) |
unsigned short | GetAddr (STG_STRUCT *stg) |
unsigned short | GetModel (STG_STRUCT *stg) |
void | Timer2Delay (STG_STRUCT *stg, unsigned short counts) |
void | StartTimer2TerminalCount (STG_STRUCT *stg, unsigned short count) |
void | StartTimer2RTI (STG_STRUCT *stg, unsigned short count) |
unsigned short | ReadTimer2TerminalCount (STG_STRUCT *stg) |
short | PollTimer2 (STG_STRUCT *stg) |
void | MaskTimer2Interrupt (STG_STRUCT *stg) |
void | UnMaskTimer2Interrupt (STG_STRUCT *stg) |
int | AddressInRange (STG_STRUCT *stg, long) |
Variables | |
eDir_typ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 242 of file stg2.h. 00242 { HomeSwitchFORWARD, HomeSwitchREVERSE } eHomeDir_typ; |
|
Definition at line 241 of file stg2.h. 00241 { A_port, B_port, C_port, D_port } ePort_typ; |
|
|
|
Definition at line 1377 of file stg_v2_axis8.c. 01378 { 01379 /* set the Analog to Digital converter to autozero on each conversion */ 01380 01381 if (stg->wModel == MODEL1) 01382 fOutP(stg->wBaseAddress + INTC, fInP(stg->wBaseAddress + INTC) & ~AUTOZERO); 01383 else /* MODEL2 */ 01384 fOutP(stg->wBaseAddress + CNTRL0, fInP(stg->wBaseAddress + CNTRL0) | CNTRL0_AZ); 01385 } |
|
Definition at line 355 of file stg_v2_axis8.c. 00356 { 00357 short i; 00358 unsigned short io_add; 00359 00360 for (i = 15; i >= 0; i--) /* search all possible addresses */ 00361 { 00362 io_add = i * 0x20 + 0x200; 00363 if ( BrdtstOK(stg, 00364 io_add) ) 00365 return io_add; 00366 } 00367 return(0); 00368 } |
|
Definition at line 378 of file stg_v2_axis8.c. 00379 { 00380 unsigned short BrdtstAddress; 00381 unsigned short SerSeq, HighNibble; 00382 int j; 00383 00384 BrdtstAddress = BaseAddress + BRDTST; 00385 00386 SerSeq = 0; 00387 for (j = 7; j >= 0; j--) 00388 { 00389 HighNibble = fInP(BrdtstAddress) >> 4; 00390 if (HighNibble & 8) /* is SER set */ 00391 { 00392 /* shift bit to position specifed by Q2, Q1, Q0 */ 00393 /* which are the lower three bits. Put bit in SerSeq. */ 00394 SerSeq |= 1 << (HighNibble & 7); 00395 } 00396 } 00397 if (SerSeq == 0x75) /* SER sequence is 01110101 */ 00398 { 00399 stg->wModel = MODEL1; 00400 return 1; /*true */ 00401 } 00402 if (SerSeq == 0x74) /* SER sequence is 01110100 */ 00403 { 00404 stg->wModel = MODEL2; 00405 return 1; /* true */ 00406 } 00407 /* stg->wModel = MODEL_NO_ID; */ 00408 return 0; /* false */ 00409 } |
|
Definition at line 1397 of file stg_v2_axis8.c. 01398 { 01399 /* Start calibration cycle on ADC chip */ 01400 01401 unsigned char Cntrl0; 01402 01403 if (stg->wModel == MODEL2) /* this function only in Model 2 board. */ 01404 { 01405 Cntrl0 = fInP(stg->wBaseAddress + CNTRL0) & 0x07; /* save irq */ 01406 fOutP(stg->wBaseAddress + CNTRL0, Cntrl0); /* cal is low */ 01407 /* cal pulse should be 60 ns. The ISA bus is 10 MHz. or 100 ns. */ 01408 /* so we can just set it back high. */ 01409 fOutP(stg->wBaseAddress + CNTRL0, Cntrl0 | 0x08); /* cal is high */ 01410 } 01411 } |
|
Definition at line 1077 of file stg_v2_axis8.c. 01078 { 01079 fOutP(stg->wBaseAddress + OCW3, 0x0a); /* IRR on next read */ 01080 return fInP(stg->wBaseAddress + IRRreg); 01081 } |
|
Definition at line 1254 of file stg_v2_axis8.c. 01255 { 01256 unsigned char byHwDir; /* direction bits for hardware */ 01257 unsigned long lCurrentData; 01258 01259 if (stg->wNoBoardFlag == NO_BOARD) 01260 { 01261 return; 01262 } 01263 01264 /* get the current data in the I/O ports. We'll replace it when we're */ 01265 /* done. When you change a port to output, it will start at what the */ 01266 /* input was (usually high). This way, bits won't change (except for a */ 01267 /* glitch) when a port is set to output. */ 01268 01269 lCurrentData = RawDI(stg); 01270 01271 byHwDir = 0x9b; /* initially all ports input */ 01272 01273 if (nSwDir & STG_PORT_A) /* check the bit for A out */ 01274 byHwDir &= ~A_DIR_BIT; /* if output, set bit to 0 */ 01275 if (nSwDir & STG_PORT_B) 01276 byHwDir &= ~B_DIR_BIT; 01277 if (nSwDir & STG_PORT_C_LO) 01278 byHwDir &= ~C_LOW_DIR_BIT; 01279 if (nSwDir & STG_PORT_C_HI) 01280 byHwDir &= ~C_HI_DIR_BIT; 01281 01282 fOutP(stg->wBaseAddress + ABC_DIR, byHwDir); /* set direction for A, B and C */ 01283 01284 SetDDir(stg, nSwDir); 01285 stg->wSaveDirs = nSwDir; /* save, mostly for other function */ 01286 RawDO(stg, lCurrentData); 01287 } |
|
Definition at line 1387 of file stg_v2_axis8.c. 01388 { 01389 /* set the Analog to Digital converter to NOT autozero */ 01390 01391 if (stg->wModel == MODEL1) 01392 fOutP(stg->wBaseAddress + INTC, fInP(stg->wBaseAddress + INTC) | AUTOZERO); 01393 else /* MODEL2 */ 01394 fOutP(stg->wBaseAddress + CNTRL0, fInP(stg->wBaseAddress + CNTRL0) & ~CNTRL0_AZ); 01395 } |
|
Definition at line 1066 of file stg_v2_axis8.c. 01067 { 01068 /* routine for Model 2 */ 01069 fOutP(stg->wBaseAddress + IDLEN, bySelectBits); 01070 } |
|
Definition at line 917 of file stg_v2_axis8.c. 00918 { 00919 WORDBYTE wbTransfer; 00920 /* static unsigned char byOldByte2[MAX_AXIS]; */ 00921 /* static unsigned char byEncHighByte[MAX_AXIS]; */ 00922 short i; 00923 00924 if (stg->wNoBoardFlag == NO_BOARD) 00925 { 00926 for (i = 0; i < 8; i++) 00927 { 00928 lbEnc[i].Long = stg->lSimEnc[i]; 00929 } 00930 return; 00931 } 00932 00933 /* Disable interrupts here? No, the timer will latch new data in the */ 00934 /* hardware anyway. Maybe we should stop the timer? In an interrupt */ 00935 /* service routine, you're synchronized with the timer; so the readings */ 00936 /* will never change while you're reading them. If you're polling, you */ 00937 /* would first latch the encoder counts with the EncoderLatch() function. */ 00938 /* But, the timer could latch the counts again, in the middle of the read. */ 00939 /* A critical section will help in some extreme cases. */ 00940 00941 /* reset counter internal addr ptr to point to first byte */ 00942 /* BUG FIX-- don't go past 4 axes on 4 axis board */ 00943 fOutPW(stg->wBaseAddress + CNT0_C, 0x0101); 00944 fOutPW(stg->wBaseAddress + CNT2_C, 0x0101); 00945 if (stg->wAxesInSys > 4) { 00946 fOutPW(stg->wBaseAddress + CNT4_C, 0x0101); 00947 fOutPW(stg->wBaseAddress + CNT6_C, 0x0101); 00948 } 00949 00950 for (i = 0; i < 3; i++) /* 24 bits means get 3 bytes each */ 00951 { 00952 wbTransfer.Word = fInPW(stg->wBaseAddress + CNT0_D); 00953 00954 lbEnc[0].Byte[i] = wbTransfer.Byte.high; 00955 lbEnc[1].Byte[i] = wbTransfer.Byte.low; 00956 00957 wbTransfer.Word = fInPW(stg->wBaseAddress + CNT2_D); 00958 00959 lbEnc[2].Byte[i] = wbTransfer.Byte.high; 00960 lbEnc[3].Byte[i] = wbTransfer.Byte.low; 00961 00962 /* BUG FIX-- index rolls off end and kills stack if you 00963 have a 4 axis board after this point */ 00964 if (stg->wAxesInSys < 8) 00965 { 00966 continue; 00967 } 00968 00969 wbTransfer.Word = fInPW(stg->wBaseAddress + CNT4_D); 00970 00971 lbEnc[4].Byte[i] = wbTransfer.Byte.high; 00972 lbEnc[5].Byte[i] = wbTransfer.Byte.low; 00973 00974 wbTransfer.Word = fInPW(stg->wBaseAddress + CNT6_D); 00975 00976 lbEnc[6].Byte[i] = wbTransfer.Byte.high; 00977 lbEnc[7].Byte[i] = wbTransfer.Byte.low; 00978 } 00979 00980 /* maintain the high byte, to extend the counter to 32 bits */ 00981 /* */ 00982 /* base decisions to increment or decrement the high byte */ 00983 /* on the highest 2 bits of the 24 bit value. To get the */ 00984 /* highest 2 bits, use 0xc0 as a mask on byte [2] (the third */ 00985 /* byte). */ 00986 00987 for (i = 0; i < MAX_AXIS; i++) 00988 { 00989 /* check for -1 to 0 transition */ 00990 00991 if ( ( (stg->byOldByte2[i] & 0xc0) == 0xc0 ) /* 11xxxxxx */ 00992 && ( (lbEnc[i].Byte[2] & 0xc0) == 0 ) /* 00xxxxxx */ 00993 ) 00994 stg->byEncHighByte[i]++; 00995 00996 /* check for 0 to -1 transition */ 00997 00998 if ( ( (stg->byOldByte2[i] & 0xc0) == 0 ) /* 00xxxxxx */ 00999 && ( (lbEnc[i].Byte[2] & 0xc0) == 0xc0 ) /* 11xxxxxx */ 01000 ) 01001 stg->byEncHighByte[i]--; 01002 01003 lbEnc[i].Byte[3] = stg->byEncHighByte[i]; 01004 stg->byOldByte2[i] = lbEnc[i].Byte[2]; /* current byte 2 becomes old one */ 01005 } 01006 }; |
|
Definition at line 619 of file stg_v2_axis8.c. 00620 { 00621 unsigned short wAdd, uplim; /* for BUG FIX below */ 00622 #if 0 00623 /* These variables are used only in the if 0'd out sections below. */ 00624 unsigned short wA; 00625 unsigned short const wTestPat = 0x5aa5; 00626 LONGBYTE enc[MAX_AXIS]; /* BUG FIX-- was hard-coded 8 */ 00627 #endif 00628 00629 if (stg->wNoBoardFlag == NO_BOARD) 00630 { 00631 stg->wAxesInSys = MAX_AXIS; 00632 return; 00633 } 00634 00635 /* It is possible that the encoder counts are being held by battery */ 00636 /* backup, so we'll read the encoders, and save the values */ 00637 /* Then we'll initialize the encoder chips, since it's more likely that */ 00638 /* the ecoders were not kept alive by battery and need to be initialized */ 00639 00640 #if 0 00641 /* FIXME-- we need to read all the encoders here, so temporarily set 00642 wAxesInSys to MAX_AXIS */ 00643 stg->wAxesInSys = MAX_AXIS; 00644 EncReadAll(stg, enc); 00645 stg->wAxesInSys = 0; 00646 #endif 00647 00648 /* probably the right thing is to sign extend the 24 bits, so, instead */ 00649 /* of a 24 bit unsigned count, we have +/- 23 bits. */ 00650 00651 /* for ( i = 0; i < 8; i++) */ 00652 /* { */ 00653 /* byEncHighByte[i] = enc[i].Byte[2] & 0x80 ? 0xff : 0; */ 00654 /* byOldByte2[i] = enc[i].Byte[2]; */ 00655 /* } */ 00656 00657 /* FIXME-- we don't yet have wAxesInSys, so we'll have to go to the max */ 00658 uplim = stg->wBaseAddress + CNT6_C; 00659 00660 for (wAdd = stg->wBaseAddress + CNT0_C; wAdd <= uplim; wAdd +=4) 00661 { 00662 /* we're going to be slick and do two chips at a time, that's why */ 00663 /* the registers are arranged data, data, control, control. You */ 00664 /* can do two at a time, by using word operations, instead of */ 00665 /* byte operations. Not a big deal for initializing, but reading is */ 00666 /* done pretty often. */ 00667 00668 fOutPW(wAdd, 0x2020); /* master reset */ 00669 00670 /* Set Counter Command Register - Input Control, OL Load (P3), */ 00671 /* and Enable Inputs A and B (INA/B). */ 00672 00673 fOutPW(wAdd, 0x6868); 00674 00675 /* Set Counter Command Register - Output Control */ 00676 00677 fOutPW(wAdd, 0x8080); 00678 00679 /* Set Co7unter Command Register - Quadrature */ 00680 00681 fOutPW(wAdd, 0xc3c3); 00682 00683 fOutPW(wAdd, 0x0404); /* reset counter to zero */ 00684 } 00685 00686 /* Figure out how many axes are on the card */ 00687 00688 #if 0 00689 /* FIXME-- we don't yet have wAxesInSys, so we'll have to go to the max */ 00690 uplim = stg->wBaseAddress + CNT6_D; 00691 00692 for (wA = stg->wBaseAddress + CNT0_D; wA <= uplim; wA +=4) 00693 { 00694 /* reset address pointer */ 00695 00696 fOutPW(wA + 2, 0x0101); 00697 00698 /* write a pattern to the preset register */ 00699 00700 fOutPW(wA, wTestPat); 00701 fOutPW(wA, wTestPat); 00702 fOutPW(wA, wTestPat); 00703 00704 /* transfer the preset register to the count register */ 00705 00706 fOutPW(wA + 2, 0x0909); 00707 00708 /* transfer counter to output latch */ 00709 00710 fOutPW(wA + 2, 0x0202); 00711 00712 /* read the output latch and see if it matches */ 00713 00714 if (fInPW(wA) != wTestPat) 00715 break; 00716 if (fInPW(wA) != wTestPat) 00717 break; 00718 if (fInPW(wA) != wTestPat) 00719 break; 00720 00721 /* now replace the values that you saved previously, in case the */ 00722 /* encoder was battery backed up */ 00723 00724 fOutP(wA, enc[stg->wAxesInSys].Byte[0]); 00725 fOutP(wA, enc[stg->wAxesInSys].Byte[1]); 00726 fOutP(wA, enc[stg->wAxesInSys].Byte[2]); 00727 00728 fOutP(wA + 1, enc[stg->wAxesInSys + 1].Byte[0]); 00729 fOutP(wA + 1, enc[stg->wAxesInSys + 1].Byte[1]); 00730 fOutP(wA + 1, enc[stg->wAxesInSys + 1].Byte[2]); 00731 00732 /* transfer the preset register to the count register */ 00733 00734 fOutPW(wA + 2, 0x0909); 00735 00736 stg->wAxesInSys += 2; 00737 00738 /* write zeros to preset register, we don't want to do a master reset */ 00739 /* (MRST), because then we would need to re-initialize the counter */ 00740 00741 /* fOutPW(wA, 0); */ 00742 /* fOutPW(wA, 0); */ 00743 /* fOutPW(wA, 0); */ 00744 00745 /* reset counter, BRW and CRY and address pointer (RADR) */ 00746 00747 /* fOutPW(wA + 2, 0x0505); */ 00748 } 00749 #else 00750 stg->wAxesInSys = 8; 00751 #endif 00752 }; |
|
Definition at line 1447 of file stg_v2_axis8.c. 01448 { 01449 if (stg->wNoBoardFlag == NO_BOARD) 01450 { 01451 return; 01452 } 01453 01454 /* normally you'll have the timer latch the data in hardware, but */ 01455 /* if the timer isn't running, we need to latch it ourselves. */ 01456 01457 /* BUG FIX-- don't go past 4 axes on 4 axis board */ 01458 fOutPW(stg->wBaseAddress + CNT0_C, 0x0303); 01459 fOutPW(stg->wBaseAddress + CNT2_C, 0x0303); 01460 if (stg->wAxesInSys > 4) { 01461 fOutPW(stg->wBaseAddress + CNT4_C, 0x0303); 01462 fOutPW(stg->wBaseAddress + CNT6_C, 0x0303); 01463 } 01464 }; |
|
Definition at line 1471 of file stg_v2_axis8.c. 01472 { 01473 if (stg->wNoBoardFlag == NO_BOARD) 01474 { 01475 return; 01476 } 01477 01478 /* This function resets all the counter's internal address pointers to point */ 01479 /* to the first byte in the 3 byte sequence */ 01480 01481 /* BUG FIX-- don't go past 4 axes on 4 axis board */ 01482 fOutPW(stg->wBaseAddress + CNT0_C, 0x0101); 01483 fOutPW(stg->wBaseAddress + CNT2_C, 0x0101); 01484 if (stg->wAxesInSys > 4) { 01485 fOutPW(stg->wBaseAddress + CNT4_C, 0x0101); 01486 fOutPW(stg->wBaseAddress + CNT6_C, 0x0101); 01487 } 01488 }; |
|
Definition at line 1539 of file stg_v2_axis8.c. 01540 { 01541 return stg->wBaseAddress; 01542 }; |
|
Definition at line 1529 of file stg_v2_axis8.c. 01530 { 01531 return stg->wAxesInSys; 01532 }; |
|
Definition at line 1519 of file stg_v2_axis8.c. 01520 { 01521 return fInP(stg->wBaseAddress + BRDTST); 01522 } |
|
Definition at line 1524 of file stg_v2_axis8.c. 01525 { 01526 return stg->wNoBoardFlag; 01527 }; |
|
Definition at line 1500 of file stg_v2_axis8.c. 01501 { 01502 return fInP(stg->wBaseAddress + CNTRL0); 01503 } |
|
Definition at line 1505 of file stg_v2_axis8.c. 01506 { 01507 return fInP(stg->wBaseAddress + CNTRL1); 01508 } |
|
Definition at line 1495 of file stg_v2_axis8.c. 01496 { 01497 return fInP(stg->wBaseAddress + IDLEN); 01498 } |
|
Definition at line 1112 of file stg_v2_axis8.c. 01113 { 01114 /* routine for Model 2 board */ 01115 01116 return fInP(stg->wBaseAddress + IDL); 01117 } |
|
Definition at line 1534 of file stg_v2_axis8.c. 01535 { 01536 return stg->wIrq; 01537 }; |
|
Definition at line 1544 of file stg_v2_axis8.c. 01545 { 01546 return stg->wModel; 01547 }; |
|
Definition at line 1490 of file stg_v2_axis8.c. 01491 { 01492 return fInP(stg->wBaseAddress + SELDI); 01493 } |
|
Definition at line 1554 of file stg_v2_axis8.c. 01555 { 01556 /* poll for the index pulse of the axis that was previously set up. */ 01557 /* Normally you would look at the latched pulse. This function will */ 01558 /* probably only get used during testing. */ 01559 01560 unsigned char byIRR, byAxisMask; 01561 01562 byIRR = CurrentIRR(stg); 01563 byAxisMask = (stg->byIndexPollAxis & 1) ? IXODD : IXEVN; /* even or odd axis? */ 01564 01565 /* The raw index pulse isn't inverted by the hardware if the index pulse is */ 01566 /* low active (only the latched pulse is). For consistancy, we'll invert */ 01567 /* the pulse in software. */ 01568 01569 if (stg->byIndexPulsePolarity == 0) /* if pulse is low true */ 01570 byIRR ^= byAxisMask; /* flip bit */ 01571 01572 if (byIRR & byAxisMask) /* check index pulse */ 01573 return 1; 01574 return 0; 01575 } |
|
Definition at line 1088 of file stg_v2_axis8.c. 01089 { 01090 /* routine for Model 1 board */ 01091 01092 /* poll the latched index pulse of the axis that was previously set up */ 01093 01094 unsigned char byIRR, byAxisMask; 01095 01096 byIRR = CurrentIRR(stg); 01097 byAxisMask = (stg->byIndexPollAxis & 1) ? LIXODD : LIXEVN; /* even or odd axis? */ 01098 if (byIRR & byAxisMask) /* check latched index pulse */ 01099 return 1; 01100 return 0; 01101 01102 /* */ 01103 /* a faster, but messier way */ 01104 /* */ 01105 /*fOutP(stg->wBaseAddress + OCW3, 0x0a); // IRR on next read */ 01106 /* */ 01107 /*return ( fInP(stg->wBaseAddress + IRR) */ 01108 /* & ( (stg->byIndexPollAxis & 1) ? LIXODD : LIXEVN ) // mask for even or odd */ 01109 /* ); */ 01110 } |
|
Definition at line 416 of file stg_v2_axis8.c. 00417 { 00418 /* 00419 * First find the the base I/O address of the board. 00420 * 00421 * only do this in the DOS example. It's dangerous under 95, and can't be 00422 * done under NT 00423 */ 00424 stg->wBaseAddress = BaseFind(stg); 00425 if (stg->wBaseAddress == 0) 00426 { 00427 stg->wNoBoardFlag = NO_BOARD; 00428 } 00429 else /* BUG FIX-- need an else */ 00430 { 00431 stg->wNoBoardFlag = BOARD_PRESENT; 00432 } 00433 #ifndef rtlinux 00434 printf("Servo To Go Board IO address = 0x%X\n",stg->wBaseAddress); 00435 #endif 00436 00437 /* 00438 * Initialize the interrupt controller 00439 */ 00440 if (stg->wModel == MODEL1) 00441 { 00442 fOutP(stg->wBaseAddress + MIO_2, 0x92); /* initialize INTC as output reg. */ 00443 /* sets port D to input since we have */ 00444 /* to set it to something. */ 00445 SetIrq(stg, wRequestedIrq); /* selects the IRQ in INTC. Now, if a stray */ 00446 /* interrupt is issued (see below) it will */ 00447 /* go to an interrupt that isn't enabled on */ 00448 /* the motherboard yet (if your system is */ 00449 /* set up correctly). */ 00450 fOutP(stg->wBaseAddress + ICW1, 0x1a ); /* initialize 82C59 as single chip, */ 00451 /* level triggered */ 00452 fOutP(stg->wBaseAddress + ICW2, 0x00 ); /* icw2 - not used, must write */ 00453 /* could issue stray interrupt here - danger! */ 00454 fOutP(stg->wBaseAddress + OCW1, 0xff); /* mask off all interrupt sources (the */ 00455 /* interrupt on the motherboard isn't */ 00456 /* enabled yet, you do that when you install */ 00457 /* your interrupt handler.). */ 00458 } 00459 else /* must be a Model 2 */ 00460 { 00461 fOutP(stg->wBaseAddress + MIO_2, 0x8b); /* initialize CNTRL0 as output reg. */ 00462 /* BRDTST to input. */ 00463 /* sets port D, high and low, to input */ 00464 /* since we have to set it to something. */ 00465 SetIrq(stg, wRequestedIrq); /* selects the IRQ in CNTRL0. Now, if a stray */ 00466 /* interrupt is issued (see below) it will */ 00467 /* go to an interrupt that isn't enabled on */ 00468 /* the motherboard yet (if your system is */ 00469 /* set up correctly). */ 00470 } 00471 }; |
|
|
|
Definition at line 1691 of file stg_v2_axis8.c. 01692 { 01693 if (stg->wNoBoardFlag == NO_BOARD) 01694 { 01695 return; 01696 } 01697 01698 if (stg->wModel == MODEL1) 01699 fOutP(stg->wBaseAddress + OCW1, CurrentIRR(stg) | TP2); 01700 else /* Model 2 */ 01701 /* we want to save the state of the slave mode, and set the */ 01702 /* high nibble bits high, so you don't reset any latches. */ 01703 /* bit pattern: 1111x000 where x is don't change */ 01704 fOutP(stg->wBaseAddress + CNTRL1, 01705 (fInP(stg->wBaseAddress + CNTRL1) & CNTRL1_NOT_SLAVE) | 0xf0); 01706 } |
|
Definition at line 1352 of file stg_v2_axis8.c. 01353 { 01354 static long lState_1[MAX_AXIS] = {0}; /* state variables */ 01355 long lScaledUp; 01356 const short nScale = 10; 01357 int nAxis; 01358 01359 for (nAxis = 0; nAxis < MAX_AXIS; nAxis++) 01360 { 01361 /* The input is guaranteed to be +/- 12 bits */ 01362 /* Scale up state so we don't loose resolution */ 01363 lScaledUp = stg->lSimDac[nAxis] << nScale; 01364 01365 /* note: I assume right shift is sign preserving (for signed value) */ 01366 01367 /* lag */ 01368 lState_1[nAxis] += (lScaledUp - lState_1[nAxis]) >> (4 + nAxis); /*lint !e704 */ 01369 /* ^^^^^^^ time constant */ 01370 /* is different for each axis */ 01371 01372 /* integrator (shift out the scale factor and then some) */ 01373 stg->lSimEnc[nAxis] += lState_1[nAxis] >> (nScale + 1); /*lint !e704 */ 01374 } 01375 } |
|
Definition at line 1654 of file stg_v2_axis8.c. 01655 { 01656 if (stg->wNoBoardFlag == NO_BOARD) 01657 { 01658 return 0; 01659 } 01660 01661 if (stg->wModel == MODEL1) 01662 return !(CurrentIRR(stg) & TP2); /* mask selects bit for TP2 */ 01663 else /* MODEL 2 */ 01664 { 01665 unsigned char byRegCntrl1, byNewCntrl1; 01666 01667 byRegCntrl1 = fInP(stg->wBaseAddress + CNTRL1); 01668 if (byRegCntrl1 & CNTRL1_INT_T2) 01669 { 01670 /* If it's set, we want to reset the latch, by writing a zero */ 01671 /* to CNTRL1_INT_T2. */ 01672 01673 /* When we write to CNTRL1, we don't want to change SLAVE, IEN_G2 */ 01674 /* IEN_T2, or IEN_T0 -- the lower 4 bits. So, we start with */ 01675 01676 byNewCntrl1 = byRegCntrl1 & 0x0f; /* (0000xxxx) */ 01677 01678 /* We don't want to reset WDTOUT, INT_G2, or INT_T0--we only want */ 01679 /* to reset ...T2. (1101xxxx) */ 01680 01681 byNewCntrl1 |= CNTRL1_WDTOUT | CNTRL1_INT_G2 | CNTRL1_INT_T0; 01682 01683 fOutP(stg->wBaseAddress + CNTRL1, byNewCntrl1); /* reset bit */ 01684 01685 return 1; /* true */ 01686 } 01687 } 01688 return 0; /* false */ 01689 } |
|
Definition at line 863 of file stg_v2_axis8.c. 00864 { 00865 if (stg->wNoBoardFlag == NO_BOARD) 00866 { 00867 return; 00868 } 00869 00870 if ( nAxis > 7 ) /* is axis within range? */ 00871 return; 00872 00873 00874 /* input / output: */ 00875 /* */ 00876 /* lCounts (decimal) ... -lCounts ... +0x1000 ... volts */ 00877 /* */ 00878 /* 0x1000 (4096) 0xfffff000 0 +10 */ 00879 /*out 0 0 0x1000 0 */ 00880 /* 0xfffff001 (-4095) 0xfff 0x1fff -10 */ 00881 00882 /* So, the domain might be different than you expected. I expected: */ 00883 /* 0xf000 (-4096) to 0xfff (4095), rather than */ 00884 /* 0xf001 (-4095) to 0x1000 (4096) */ 00885 00886 /* reverse slope so positive counts give positive voltage */ 00887 lCounts = - lCounts; 00888 00889 /* shift for DAC */ 00890 lCounts += 0x1000; 00891 00892 if (lCounts > 0x1FFF) /* clamp + output */ 00893 { 00894 lCounts = 0x1FFF; 00895 } 00896 if (lCounts < 0) /* clamp - output */ 00897 { 00898 lCounts = 0; 00899 } 00900 00901 if (stg->wNoBoardFlag == NO_BOARD) /* are we simulating? */ 00902 { 00903 stg->lSimDac[nAxis] = lCounts; 00904 return; 00905 } 00906 00907 /* nCounts = (USHORT) (lCounts + 0x1000); // correct range for DAC */ 00908 00909 fOutPW(stg->wBaseAddress + DAC_0 + (nAxis << 1), (unsigned short)lCounts); 00910 }; |
|
Definition at line 1125 of file stg_v2_axis8.c. 01126 { 01127 IO32 xInBits; 01128 01129 if (stg->wNoBoardFlag == NO_BOARD) 01130 { 01131 xInBits.all = 0; 01132 return(xInBits.all); 01133 } 01134 01135 if (stg->wModel == MODEL1) 01136 { 01137 xInBits.port.A = fInP(stg->wBaseAddress + DIO_A); 01138 xInBits.port.B = fInP(stg->wBaseAddress + DIO_B); 01139 xInBits.port.C = fInP(stg->wBaseAddress + DIO_C); 01140 xInBits.port.D = fInP(stg->wBaseAddress + DIO_D); 01141 } 01142 else /* Model 2 */ 01143 { 01144 xInBits.port.A = fInP(stg->wBaseAddress + PORT_A); 01145 xInBits.port.B = fInP(stg->wBaseAddress + PORT_B); 01146 xInBits.port.C = fInP(stg->wBaseAddress + PORT_C); 01147 xInBits.port.D = fInP(stg->wBaseAddress + PORT_D); 01148 } 01149 return (xInBits.all); 01150 }; |
|
Definition at line 1158 of file stg_v2_axis8.c. 01159 { 01160 if (stg->wNoBoardFlag == NO_BOARD) 01161 { 01162 return; 01163 } 01164 if (stg->wModel == MODEL1) 01165 { 01166 fOutP(stg->wBaseAddress + DIO_A, ((IO32 *)&lOutBits)->port.A); 01167 fOutP(stg->wBaseAddress + DIO_B, ((IO32 *)&lOutBits)->port.B); 01168 fOutP(stg->wBaseAddress + DIO_C, ((IO32 *)&lOutBits)->port.C); 01169 fOutP(stg->wBaseAddress + DIO_D, ((IO32 *)&lOutBits)->port.D); 01170 } 01171 else /* Model 2 */ 01172 { 01173 fOutP(stg->wBaseAddress + PORT_A, ((IO32 *)&lOutBits)->port.A); 01174 fOutP(stg->wBaseAddress + PORT_B, ((IO32 *)&lOutBits)->port.B); 01175 fOutP(stg->wBaseAddress + PORT_C, ((IO32 *)&lOutBits)->port.C); 01176 fOutP(stg->wBaseAddress + PORT_D, ((IO32 *)&lOutBits)->port.D); 01177 } 01178 }; |
|
Definition at line 1180 of file stg_v2_axis8.c. 01181 { 01182 unsigned nOffset; 01183 unsigned char byData; 01184 01185 if (stg->wNoBoardFlag == NO_BOARD) 01186 { 01187 return; 01188 } 01189 01190 if (nPort > 3) 01191 return; 01192 01193 if (stg->wModel == MODEL1) 01194 nOffset = aPortOffset_1[nPort]; 01195 else /* Model 2 */ 01196 nOffset = aPortOffset_2[nPort]; 01197 01198 byData = fInP(stg->wBaseAddress + nOffset); 01199 if (bySet0or1 == 1) 01200 byData |= 1 << byBitNumber; 01201 else 01202 byData &= ~(1u << byBitNumber); 01203 fOutP(stg->wBaseAddress + nOffset, byData); 01204 }; |
|
Definition at line 571 of file stg_v2_axis8.c. 00572 { 00573 if (stg->wNoBoardFlag == NO_BOARD) 00574 { 00575 return STG_SUCCESS; 00576 } 00577 00578 if (wAxis > 7) 00579 return STG_FAILURE; 00580 00581 if (stg->wModel == MODEL1) 00582 { 00583 if ( !(CurrentIRR(stg) & 0x08) ) /* is the conversion done? */ 00584 return STG_FAILURE; /* no, return failure */ 00585 00586 /* conversion is done, get counts. */ 00587 /* *counts = fInPW(stg->wBaseAddress + ADC_0 + (wAxis << 1)); */ 00588 /* *counts = fInPW(stg->wBaseAddress + ADC_1); // debug */ 00589 } 00590 else /* Model 2 */ 00591 { 00592 /* is the conversion done? */ 00593 if ( fInP(stg->wBaseAddress + BRDTST) & BRDTST_EOC ) 00594 return STG_FAILURE; /* no, return failure */ 00595 00596 /* conversion is done, get counts. */ 00597 /* *counts = fInPW(stg->wBaseAddress + ADC_1); */ 00598 } 00599 00600 *counts = fInPW(stg->wBaseAddress + ADC_0 + (wAxis << 1)); 00601 00602 if (*counts & 0x1000) /* is sign bit negative? */ 00603 *counts |= 0xf000; /* sign extend */ 00604 else 00605 *counts &= 0xfff; /* make sure high order bits are zero. */ 00606 00607 return STG_SUCCESS; 00608 00609 }; |
|
Definition at line 1644 of file stg_v2_axis8.c. 01645 { 01646 unsigned short count; 01647 char *pByte = (char *)&count; 01648 fOutP(stg->wBaseAddress + TMRCMD, 0x80); /* timer 2, latch */ 01649 *pByte++ = fInP(stg->wBaseAddress + TIMER_2); /* LSB */ 01650 *pByte = fInP(stg->wBaseAddress + TIMER_2); /* MSB */ 01651 return count; 01652 } |
|
Definition at line 1013 of file stg_v2_axis8.c. 01014 { 01015 /* routine for Model 1 */ 01016 01017 fInP(stg->wBaseAddress + ODDRST); /*lint !e534 reset index pulse latch for ODD axis */ 01018 fInP(stg->wBaseAddress + BRDTST); /*lint !e534 reset index pulse latch for EVEN axis */ 01019 } |
|
Definition at line 1021 of file stg_v2_axis8.c. 01022 { 01023 /* routine for Model 2 */ 01024 fOutP(stg->wBaseAddress + IDL, byLatchBits); 01025 } |
|
Definition at line 1510 of file stg_v2_axis8.c. 01511 { 01512 unsigned char byCntrl1 = fInP(stg->wBaseAddress + CNTRL1); 01513 byCntrl1 &= ~CNTRL1_WDTOUT; /*set bit low, to reset */ 01514 /* don't reset other latches */ 01515 byCntrl1 |= CNTRL1_INT_G2 | CNTRL1_INT_T2 | CNTRL1_INT_T0; 01516 fOutP(stg->wBaseAddress + CNTRL1, byCntrl1); 01517 } |
|
Definition at line 1033 of file stg_v2_axis8.c. 01034 { 01035 /* routine for Model 1 */ 01036 01037 /* */ 01038 /* initialize stuff to poll index pulse */ 01039 /* */ 01040 unsigned char byIntc; 01041 01042 stg->byIndexPollAxis = byAxis; /* save axis to check later */ 01043 stg->byIndexPulsePolarity = byPol; /* save polarity as new default */ 01044 byAxis &= 0x6; /* ignore low bit, we check 2 axes at a time */ 01045 byAxis <<= 3; /* shift into position for IXS1, IXS0 */ 01046 byIntc = fInP(stg->wBaseAddress + INTC); /* get a copy of INTC, we'll change */ 01047 /* some bits in it, not all */ 01048 byIntc &= ~(IXLVL | IXS1 | IXS0); /* zero bits for axis and polarity */ 01049 byIntc |= byAxis; /* put axes address in INTC */ 01050 if (byPol != 0) /* is index pulse active high? */ 01051 byIntc |= IXLVL; 01052 fOutP(stg->wBaseAddress + INTC, byIntc); 01053 ResetIndexLatch(stg); 01054 01055 /* The latched index pulse should be low now. If it's not, either something's */ 01056 /* wrong, or we happened to initialize it while the index pulse was active. */ 01057 } |
|
Definition at line 1059 of file stg_v2_axis8.c. 01060 { 01061 /* routine for Model 2 */ 01062 01063 fOutP(stg->wBaseAddress + SELDI, bySelectBits); 01064 } |
|
Definition at line 759 of file stg_v2_axis8.c. 00760 { 00761 if (stg->wNoBoardFlag == NO_BOARD) 00762 { 00763 return; 00764 } 00765 00766 if (lPeriodSelect != MAX_PERIOD) 00767 { 00768 fOutP(stg->wBaseAddress + TMRCMD, 0x56); /* timer 1, read/load LSB (MSB is 0) */ 00769 /* mode 3 (square wave) */ 00770 fOutP(stg->wBaseAddress + TIMER_1, 0xb4); /* 0xb4 = 180 -> 25 uSec period */ 00771 } 00772 else 00773 { 00774 fOutP(stg->wBaseAddress + TMRCMD, 0x76); /* timer 1, read/load LSB then MSB */ 00775 /* mode 3 (square wave) */ 00776 fOutP(stg->wBaseAddress + TIMER_1, 0xff); /* LSB */ 00777 fOutP(stg->wBaseAddress + TIMER_1, 0xff); /* MSB */ 00778 } 00779 00780 switch (lPeriodSelect) 00781 { 00782 case _500_MICROSECONDS: 00783 fOutP(stg->wBaseAddress + TMRCMD, 0x34); /* timer 0, read/load LSB followed by */ 00784 /* MSB, mode 2 (real-time interrupt) */ 00785 fOutP(stg->wBaseAddress + TIMER_0, 0x14); /* 0x14 = 20 = .5 mS */ 00786 fOutP(stg->wBaseAddress + TIMER_0, 0x00); 00787 break; 00788 case _1_MILLISECOND: 00789 fOutP(stg->wBaseAddress + TMRCMD, 0x34); /* timer 0, read/load LSB followed by */ 00790 /* MSB, mode 2 (real-time interrupt) */ 00791 fOutP(stg->wBaseAddress + TIMER_0, 0x28); /* 0x28 = 40 = 1 mS */ 00792 fOutP(stg->wBaseAddress + TIMER_0, 0x00); 00793 break; 00794 case _2_MILLISECONDS: 00795 fOutP(stg->wBaseAddress + TMRCMD, 0x34); /* timer 0, read/load LSB followed by */ 00796 /* MSB, mode 2 (real-time interrupt) */ 00797 fOutP(stg->wBaseAddress + TIMER_0, 0x50); /* 0x50 = 80 = 2 mS */ 00798 fOutP(stg->wBaseAddress + TIMER_0, 0x00); 00799 break; 00800 case _3_MILLISECONDS: 00801 fOutP(stg->wBaseAddress + TMRCMD, 0x34); /* timer 0, read/load LSB followed by */ 00802 /* MSB, mode 2 (real-time interrupt) */ 00803 fOutP(stg->wBaseAddress + TIMER_0, 0x78); /* 0x78 = 120 = 3 mS */ 00804 fOutP(stg->wBaseAddress + TIMER_0, 0x00); 00805 break; 00806 case _4_MILLISECONDS: 00807 fOutP(stg->wBaseAddress + TMRCMD, 0x34); /* timer 0, read/load LSB followed by */ 00808 /* MSB, mode 2 (real-time interrupt) */ 00809 fOutP(stg->wBaseAddress + TIMER_0, 0xA0); /* 0xA0 = 160 = 4 mS */ 00810 fOutP(stg->wBaseAddress + TIMER_0, 0x00); 00811 break; 00812 case _5_MILLISECONDS: 00813 fOutP(stg->wBaseAddress + TMRCMD, 0x34); /* timer 0, read/load LSB followed by */ 00814 /* MSB, mode 2 (real-time interrupt) */ 00815 fOutP(stg->wBaseAddress + TIMER_0, 0xC8); /* 0xC8 = 200 = 5 mS */ 00816 fOutP(stg->wBaseAddress + TIMER_0, 0x00); 00817 break; 00818 case _10_MILLISECONDS: 00819 fOutP(stg->wBaseAddress + TMRCMD, 0x34); /* timer 0, read/load LSB followed by */ 00820 /* MSB, mode 2 (real-time interrupt) */ 00821 fOutP(stg->wBaseAddress + TIMER_0, 0x90); /* 0x0190 = 400 = 10 mS */ 00822 fOutP(stg->wBaseAddress + TIMER_0, 0x01); 00823 break; 00824 case _100_MILLISECONDS: 00825 fOutP(stg->wBaseAddress + TMRCMD, 0x34); /* timer 0, read/load LSB followed by */ 00826 /* MSB, mode 2 (real-time interrupt) */ 00827 fOutP(stg->wBaseAddress + TIMER_0, 0xA0); /* 0x0FA0 = 4000 = 100 mS */ 00828 fOutP(stg->wBaseAddress + TIMER_0, 0x0F); 00829 break; 00830 case _1_SECOND: 00831 fOutP(stg->wBaseAddress + TMRCMD, 0x34); /* timer 0, read/load LSB followed by */ 00832 /* MSB, mode 2 (real-time interrupt) */ 00833 fOutP(stg->wBaseAddress + TIMER_0, 0x40); /* 0x9C40 = 40000 = 1 S */ 00834 fOutP(stg->wBaseAddress + TIMER_0, 0x9c); 00835 break; 00836 case MAX_PERIOD: 00837 fOutP(stg->wBaseAddress + TMRCMD, 0x34); /* timer 0, read/load LSB followed by */ 00838 /* MSB, mode 2 (real-time interrupt) */ 00839 fOutP(stg->wBaseAddress + TIMER_0, 0xff); /* LSB */ 00840 fOutP(stg->wBaseAddress + TIMER_0, 0xff); /* MSB */ 00841 break; 00842 default: 00843 /* wrong input? then don't change it */ 00844 break; 00845 } 00846 }; |
|
Definition at line 236 of file stg_v2_axis8.c. 00237 { 00238 int t; 00239 00240 #if defined (LINUX) 00241 iopl(3); /* get access to I/O ports, must be root. */ 00242 #endif 00243 00244 /* BUG FIX-- init globals */ 00245 stg->wAxesInSys = 0; 00246 stg->wBaseAddress = 0; 00247 stg->wIrq = 0; 00248 stg->wModel = MODEL_NO_ID; 00249 stg->wNoBoardFlag = NO_BOARD; 00250 stg->wAxesInSys = 0; 00251 stg->wSaveDirs = 0; 00252 stg->byIndexPollAxis = 0; 00253 stg->byIndexPulsePolarity = 1; 00254 for (t = 0; t < MAX_AXIS; t++) { 00255 stg->lSimDac[t] = 0; 00256 stg->lSimEnc[t] = 0; 00257 stg->byEncHighByte[t] = 0; 00258 stg->byOldByte2[t] = 0; 00259 } 00260 00261 Initialize(stg, wRequestedIrq); /* figure out board address, init irq controller */ 00262 EncoderInit(stg); 00263 SelectInterruptPeriod(stg, _1_MILLISECOND); /* initialize timer */ 00264 stg->byIndexPulsePolarity = 1; /* default active level high */ 00265 if (stg->wModel == MODEL2) 00266 fOutP(stg->wBaseAddress + CNTRL1, CNTRL1_NOT_SLAVE); 00267 }; |
|
Definition at line 274 of file stg_v2_axis8.c. 00275 { 00276 unsigned short nAxis; 00277 00278 StopInterrupts(stg); 00279 00280 /* set all the DAC outputs to 0. */ 00281 for (nAxis = 0; nAxis < MAX_AXIS; nAxis++) 00282 RawDAC(stg, nAxis, 0); 00283 00284 /* set all the digital I/O bits to input */ 00285 DioDirection(stg, 0); 00286 } |
|
Definition at line 1289 of file stg_v2_axis8.c. 01290 { 01291 unsigned char byHwDir; /* direction bits for hardware */ 01292 unsigned char bySaveReg, bySaveIMR, bySaveCntrl1, bySaveCntrl0; 01293 01294 if (stg->wModel == MODEL1) 01295 { 01296 bySaveReg = fInP(stg->wBaseAddress + INTC); /* INTC needs to be saved, because */ 01297 /* MIO_2 reinitializes the 8255 which */ 01298 /* implements the INTC register. */ 01299 byHwDir = 0x92; /* initialize port D input */ 01300 if (nSwDir & STG_PORT_D) /* is port D output? */ 01301 byHwDir &= ~D_DIR_BIT; /* if yes, set bit to 0, */ 01302 bySaveIMR = fInP(stg->wBaseAddress + IMR); /* get the current interrupt mask */ 01303 fOutP(stg->wBaseAddress + OCW1, 0xff); /* mask off all interrupts */ 01304 fOutP(stg->wBaseAddress + MIO_2, byHwDir); /* set direction for port D */ 01305 fOutP(stg->wBaseAddress + INTC, bySaveReg); /* restore interrupt control reg. */ 01306 fOutP(stg->wBaseAddress + OCW1, bySaveIMR); /* restore interrupt mask */ 01307 } 01308 else /* Model 2 */ 01309 { 01310 bySaveCntrl0 = fInP(stg->wBaseAddress + CNTRL0); /* CNTRL0 needs to be saved, because */ 01311 /* D_DIR reinitializes the 8255 which */ 01312 /* implements the CNTRL0 register. */ 01313 byHwDir = 0x8b; /* initialize CNTRL0 as output reg. */ 01314 /* BRDTST to input. */ 01315 /* sets port D, high and low, to input */ 01316 if (nSwDir & STG_PORT_D_LO) /* low nibble */ 01317 byHwDir &= ~D_LOW_DIR_BIT; 01318 if (nSwDir & STG_PORT_D_HI) /* high nibble */ 01319 byHwDir &= ~D_HI_DIR_BIT; 01320 01321 bySaveCntrl1 = fInP(stg->wBaseAddress+CNTRL1);/* save for interrupt enables */ 01322 01323 /* don't reset any latches; put in slave state; */ 01324 /* disable interrupts, so the glitch in CTRL0 doesn't */ 01325 /* cause an interrupt on wrong irq */ 01326 fOutP(stg->wBaseAddress + CNTRL1, 0xf0); 01327 01328 fOutP(stg->wBaseAddress + D_DIR, byHwDir); /* set port D direction */ 01329 01330 /* restore CNTRL0, because it was re-initialized, which */ 01331 /* lost any previous contents. */ 01332 fOutP(stg->wBaseAddress + CNTRL0, bySaveCntrl0); 01333 01334 /* re-enable interrupts, and restore slave state, don't */ 01335 /* reset any latches. (1111xxxx) */ 01336 fOutP(stg->wBaseAddress+CNTRL1, (bySaveCntrl1 & 0x0f) | 0xf0); 01337 } 01338 }; |
|
Definition at line 1418 of file stg_v2_axis8.c. 01419 { 01420 unsigned short wAddress; 01421 char *ByteUnion = (char *)&lCounts; /* get pointer to lCounts, so you */ 01422 /* can take it apart byte by byte */ 01423 01424 wAddress = stg->wBaseAddress + CNT0_D; 01425 wAddress += (nAxis & 0x6) << 1; /* shift to multiply by 2 */ 01426 /* pairs of data regs seperated by pairs */ 01427 /* of control regs, skip over control. */ 01428 wAddress += nAxis & 1; 01429 fOutP(wAddress, ByteUnion[0]); 01430 fOutP(wAddress, ByteUnion[1]); 01431 fOutP(wAddress, ByteUnion[2]); 01432 01433 /* transfer the preset register to the count register */ 01434 fOutP(wAddress + 2, 0x09); 01435 01436 /* set things for the part that extends the 24 bit counter */ 01437 /* to 32 bits. */ 01438 stg->byEncHighByte[nAxis] = ByteUnion[3]; 01439 stg->byOldByte2[nAxis] = ByteUnion[2]; 01440 } |
|
Definition at line 293 of file stg_v2_axis8.c. 00294 { 00295 unsigned char byIntReg; 00296 00297 if (stg->wNoBoardFlag == NO_BOARD) 00298 return; 00299 00300 stg->wIrq = wRequestedIrq; /* assume it's OK for now, check later */ 00301 00302 if (stg->wModel == MODEL1) 00303 byIntReg = 0x80; /* initial value for the high bits in the register */ 00304 /* sets auto zero off */ 00305 else /* MODEL2 */ 00306 byIntReg = 0x88; /* cal high too, not calibrating ADC */ 00307 00308 /* now put low bits into byIntReg to select irq */ 00309 00310 switch (wRequestedIrq) 00311 { 00312 case 3: break; /* add zero */ 00313 00314 case 5: byIntReg |= 4; 00315 break; 00316 00317 case 7: byIntReg |= 2; 00318 break; 00319 00320 case 9: byIntReg |= 6; 00321 break; 00322 00323 case 10: byIntReg |= 5; 00324 break; 00325 00326 case 11: byIntReg |= 7; 00327 break; 00328 00329 case 12: byIntReg |= 3; 00330 break; 00331 00332 case 15: byIntReg |= 1; 00333 break; 00334 00335 default: stg->wIrq = 5; /* ERROR, requested irq not valid, use 5 */ 00336 byIntReg |= 4; /* There is no safe value, leaving zero */ 00337 /* here would select IRQ 3 which is worse */ 00338 /* than 5 because IRQ 3 is usually for COM 2 */ 00339 break; 00340 } 00341 00342 if (stg->wModel == MODEL1) 00343 fOutP(stg->wBaseAddress + INTC, byIntReg); /* set irq */ 00344 else /* MODEL2 */ 00345 fOutP(stg->wBaseAddress + CNTRL0, byIntReg); 00346 } |
|
Definition at line 530 of file stg_v2_axis8.c. 00531 { 00532 short counts; 00533 short j; 00534 00535 if (stg->wNoBoardFlag == NO_BOARD) 00536 { 00537 return 0; 00538 } 00539 00540 if (wAxis > 7) 00541 return -1; 00542 00543 if (stg->wModel == MODEL1) 00544 { 00545 /* make sure conversion is done, assume polling delay is done. */ 00546 /* EOC (End Of Conversion) is bit 0x08 in IIR (Interrupt Request */ 00547 /* Register) of Interrupt Controller. Don't wait forever though */ 00548 /* bail out eventually. */ 00549 00550 for (j = 0; (!(CurrentIRR(stg) & 0x08)) && (j < 10000); j++); 00551 00552 counts = ( fInPW(stg->wBaseAddress + ADC_0 + (wAxis << 1)) ); 00553 } 00554 else 00555 { 00556 /* is the conversion done? */ 00557 for (j = 0; (fInP(stg->wBaseAddress + BRDTST) & BRDTST_EOC) && (j < 10000); j++); 00558 00559 /* conversion is done, get counts. */ 00560 counts = fInPW(stg->wBaseAddress + ADC); 00561 } 00562 00563 if (counts & 0x1000) /* is sign bit negative? */ 00564 counts |= 0xf000; /* sign extend */ 00565 else 00566 counts &= 0xfff; /* make sure high order bits are zero. */ 00567 00568 return counts; 00569 }; |
|
Definition at line 478 of file stg_v2_axis8.c. 00479 { 00480 unsigned char Cntrl0; 00481 00482 if (stg->wNoBoardFlag == NO_BOARD) 00483 { 00484 return; 00485 } 00486 00487 if (wAxis > 7) 00488 return; 00489 00490 if (stg->wModel == MODEL1) 00491 { 00492 /* do a dummy read from the ADC, just to set the input multiplexer to */ 00493 /* the right channel */ 00494 fInPW(stg->wBaseAddress + ADC_0 + (wAxis << 1)); /*lint !e534 */ 00495 00496 /* wait 4 uS for settling time on the multiplexer and ADC */ 00497 /* you probably shouldn't really have a delay in */ 00498 /* a driver. */ 00499 Timer2Delay(stg, 28); 00500 00501 /* now start conversion. */ 00502 fOutPW(stg->wBaseAddress + ADC_0 + (wAxis << 1), 0); 00503 } 00504 else /* Model 2 */ 00505 { 00506 Cntrl0 = fInP(stg->wBaseAddress + CNTRL0) & 0x07; /* save irq */ 00507 00508 Cntrl0 |= (wAxis << 4) | 0x88; /* shift bits to AD2, AD1, AD0 */ 00509 /* set bit 0x80 high for autozero */ 00510 /* set bit 0x08 high, not calibrating */ 00511 fOutP(stg->wBaseAddress + CNTRL0, Cntrl0); /* select ADC channel */ 00512 00513 /* don't have to do a dummy read for a model 2 */ 00514 00515 /* wait 4 uS for settling time on the multiplexer and ADC */ 00516 /* you probably shouldn't really have a delay in */ 00517 /* a driver. */ 00518 Timer2Delay(stg, 28); 00519 00520 /* now start conversion. */ 00521 fOutPW(stg->wBaseAddress + ADC, 0); 00522 } 00523 }; |
|
Definition at line 1727 of file stg_v2_axis8.c. 01728 { 01729 if (stg->wNoBoardFlag == NO_BOARD) 01730 { 01731 return; 01732 } 01733 if (stg->wModel == MODEL1) 01734 fOutP(stg->wBaseAddress + OCW1, ~0x04); /* enable interrupt for timer 0 */ 01735 else /* MODEL2 */ 01736 /* we want to save the state of the slave mode, and set the */ 01737 /* high nibble bits high, so you don't reset any latches. */ 01738 /* 1111x001, where x means don't change */ 01739 { 01740 fOutP(stg->wBaseAddress + CNTRL1, CNTRL1_IEN_T0 | CNTRL1_NOT_SLAVE); 01741 } 01742 }; |
|
Definition at line 1629 of file stg_v2_axis8.c. 01630 { 01631 char *pByte = (char *)&count; 01632 01633 if (stg->wNoBoardFlag == NO_BOARD) 01634 { 01635 return; 01636 } 01637 01638 fOutP(stg->wBaseAddress + TMRCMD, 0xb4); /* timer 2, read/load LSB followed */ 01639 /* by MSB, mode 2 (real time int). */ 01640 fOutP(stg->wBaseAddress + TIMER_2, *pByte++); /* LSB (little endian) */ 01641 fOutP(stg->wBaseAddress + TIMER_2, *pByte); /* MSB */ 01642 } |
|
Definition at line 1614 of file stg_v2_axis8.c. 01615 { 01616 char *pByte = (char *)&count; 01617 01618 if (stg->wNoBoardFlag == NO_BOARD) 01619 { 01620 return; 01621 } 01622 01623 fOutP(stg->wBaseAddress + TMRCMD, 0xb0); /* timer 2, read/load LSB followed */ 01624 /* by MSB, mode 0 (terminal count) */ 01625 fOutP(stg->wBaseAddress + TIMER_2, *pByte++); /* LSB (little endian) */ 01626 fOutP(stg->wBaseAddress + TIMER_2, *pByte); /* MSB */ 01627 } |
|
Definition at line 1749 of file stg_v2_axis8.c. 01750 { 01751 if (stg->wNoBoardFlag == NO_BOARD) 01752 { 01753 return; 01754 } 01755 if (stg->wModel == MODEL1) 01756 fOutP(stg->wBaseAddress + OCW1, 0xff); /* disable all interrupts */ 01757 else /* MODEL2 */ 01758 /* we want to save the state of the slave mode, and set the */ 01759 /* high nibble bits high, so you don't reset any latches. */ 01760 /* disable all interrupts, since only one can be enabled at */ 01761 /* a time (currently). If more than one was enabled, it's */ 01762 /* an error (currently). */ 01763 /* 1111x000, where x means not changed. */ 01764 fOutP(stg->wBaseAddress + CNTRL1, 01765 (fInP(stg->wBaseAddress + CNTRL1) & CNTRL1_NOT_SLAVE) | 0xf0); 01766 }; |
|
Definition at line 1582 of file stg_v2_axis8.c. 01583 { 01584 if (stg->wNoBoardFlag == NO_BOARD) 01585 { 01586 return; 01587 } 01588 01589 /* stop the timer by putting it into one shot mode, it will never get */ 01590 /* a trigger */ 01591 01592 /* bug bug this doesn't work */ 01593 01594 fOutP(stg->wBaseAddress + TMRCMD, 0x0a); /* timer 0, mode 1 */ 01595 } |
|
Definition at line 1602 of file stg_v2_axis8.c. 01603 { 01604 if (stg->wNoBoardFlag == NO_BOARD) 01605 { 01606 return; 01607 } 01608 01609 StartTimer2TerminalCount(stg, counts); 01610 01611 while (PollTimer2(stg)); 01612 } |
|
Definition at line 1708 of file stg_v2_axis8.c. 01709 { 01710 if (stg->wModel == MODEL1) 01711 fOutP(stg->wBaseAddress + OCW1, CurrentIRR(stg) & ~TP2); 01712 else /* Model 2 */ 01713 { 01714 /* we want to save the state of the slave mode, and set the */ 01715 /* high nibble bits high, so you don't reset any latches. */ 01716 /* bit pattern: 1111x010 where x is don't change */ 01717 fOutP(stg->wBaseAddress + CNTRL1, 01718 (fInP(stg->wBaseAddress + CNTRL1) & CNTRL1_NOT_SLAVE) | CNTRL1_IEN_T2); 01719 } 01720 } |
|
Definition at line 25 of file stg2.h. 00025 : stg2.h,v 1.5 2001/10/30 23:34:05 paul_c Exp $"; 00026 00027 /* 00028 Number of axes in system defaults to 4. If STG_8_AXES is defined 00029 by compiler directive or other means, code will support 8 axes, 00030 e.g., -DSTG_8_AXES. Note that only 6 axes are really supported, since 00031 there is not enough digital IO for limit and home switches for all 8. 00032 00033 Analog input is an option, normally not present. If STG_ANALOG_INPUT is 00034 defined by compiler directive or other means, code will support analog 00035 input, e.g., -DSTG_ANALOG_INPUT 00036 */ 00037 00038 /* 00039 Base address defaults to 0x200 00040 */ 00041 #define DEFAULT_STG_BASE_ADDRESS 0x200 00042 extern unsigned short STG_BASE_ADDRESS; 00043 00044 /* decls for external interface */ 00045 00046 extern int stgMotInit(const char * stuff); 00047 extern int stgMotQuit(void); 00048 00049 extern int stgDacNum(void); 00050 extern int stgDacWrite(int dac, double volts); 00051 extern int stgDacWriteAll(int max, double * volts); 00052 00053 extern int stgEncoderSetIndexModel(unsigned int model); 00054 extern int stgEncoderNum(void); 00055 extern int stgEncoderRead(int encoder, double * counts); 00056 extern int stgEncoderReadAll(int max, double * counts); 00057 extern int stgEncoderResetIndex(int encoder); 00058 extern int stgEncoderReadLatch(int encoder, int * flag); 00059 extern int stgEncoderReadLevel(int encoder, int * flag); 00060 00061 extern int stgMaxLimitSwitchRead(int axis, int * flag); 00062 extern int stgMinLimitSwitchRead(int axis, int * flag); 00063 00064 extern int stgHomeSwitchRead(int axis, int * flag); 00065 00066 extern int stgAmpEnable(int axis, int enable); 00067 extern int stgAmpFault(int axis, int * fault); 00068 00069 extern int stgDioInit(const char * stuff); 00070 extern int stgDioQuit(void); 00071 00072 extern int stgDioMaxInputs(void); 00073 extern int stgDioMaxOutputs(void); 00074 extern int stgDioRead(int index, int *value); 00075 extern int stgDioWrite(int index, int value); 00076 extern int stgDioCheck(int index, int *value); 00077 extern int stgDioByteRead(int index, unsigned char *byte); 00078 extern int stgDioShortRead(int index, unsigned short *sh); 00079 extern int stgDioWordRead(int index, unsigned int *word); 00080 extern int stgDioByteWrite(int index, unsigned char byte); 00081 extern int stgDioShortWrite(int index, unsigned short sh); 00082 extern int stgDioWordWrite(int index, unsigned int word); 00083 extern int stgDioByteCheck(int index, unsigned char *byte); 00084 extern int stgDioShortCheck(int index, unsigned short *sh); 00085 extern int stgDioWordCheck(int index, unsigned int *word); 00086 00087 extern int stgAioInit(const char * stuff); 00088 extern int stgAioQuit(void); 00089 00090 extern int stgAioMaxInputs(void); 00091 extern int stgAioMaxOutputs(void); 00092 extern int stgAioStart(int index); 00093 extern void stgAioWait(void); 00094 extern int stgAioRead(int index, double *volts); 00095 extern int stgAioWrite(int index, double volts); 00096 extern int stgAioCheck(int index, double *volts); 00097 extern int stgModel(void); 00098 00099 #define STG_SUCCESS 0 00100 #define STG_FAILURE 1 00101 00102 #define NUM_AXIS_IN_SYS 8 00103 #define MAX_AXIS 8 00104 00105 #define CNT0_D 0x00 00106 #define CNT1_D 0x01 00107 #define CNT0_C 0x02 00108 #define CNT1_C 0x03 00109 #define CNT2_D 0x04 00110 #define CNT3_D 0x05 00111 #define CNT2_C 0x06 00112 #define CNT3_C 0x07 00113 #define CNT4_D 0x08 00114 #define CNT5_D 0x09 00115 #define CNT4_C 0x0a 00116 #define CNT5_C 0x0b 00117 #define CNT6_D 0x0c 00118 #define CNT7_D 0x0d 00119 #define CNT6_C 0x0e 00120 #define CNT7_C 0x0f 00121 #define DAC_0 0x10 00122 #define DAC_1 0x12 00123 #define DAC_2 0x14 00124 #define DAC_3 0x16 00125 #define DAC_4 0x18 00126 #define DAC_5 0x1a 00127 #define DAC_6 0x1c 00128 #define DAC_7 0x1e 00129 #define ADC 0x410 00130 #define ADC_0 0x410 00131 #define ADC_1 0x412 00132 #define ADC_2 0x414 00133 #define ADC_3 0x416 00134 #define ADC_4 0x418 00135 #define ADC_5 0x41a 00136 #define ADC_6 0x41c 00137 #define ADC_7 0x41e 00138 #define CNTRL0 0x401 /* Model 2 */ 00139 #define DIO_A 0x400 /* Model 1 */ 00140 #define DIO_B 0x402 /* Model 1 */ 00141 #define DIO_C 0x404 /* Model 1 */ 00142 #define DIO_D 0x401 /* Model 1 */ 00143 #define PORT_A 0x400 /* Model 2, replaces DIO_A */ 00144 #define PORT_B 0x402 /* Model 2, replaces DIO_B */ 00145 #define PORT_C 0x404 /* Model 2, replaces DIO_C */ 00146 #define PORT_D 0x405 /* Model 2, replaces DIO_D */ 00147 #define INTC 0x405 /* Model 1 */ 00148 #define BRDTST 0x403 00149 #define MIO_1 0x406 00150 #define ABC_DIR 0x406 /* Model 2 */ 00151 #define MIO_2 0x407 00152 #define D_DIR 0x407 /* Model 2 */ 00153 #define ODDRST 0x407 00154 #define TIMER_0 0x408 00155 #define TIMER_1 0x40a 00156 #define TIMER_2 0x40c 00157 #define TMRCMD 0x40e 00158 #define ICW1 0x409 00159 #define ICW2 0x40b 00160 #define OCW1 0x40b 00161 #define OCW2 0x409 00162 #define OCW3 0x409 00163 #define IRRreg 0x409 /* there's something called IRR in ntddk.h */ 00164 #define ISR 0x409 00165 #define IDLEN 0x409 00166 #define IMR 0x40b 00167 #define SELDI 0x40b 00168 #define IDL 0x40d 00169 #define CNTRL1 0x40f 00170 00171 /* 00172 * Some bit masks for various registers 00173 */ 00174 /* for IRR, ISR, and IMR */ 00175 #define IXEVN 0x80 00176 #define IXODD 0x40 00177 #define LIXEVN 0x20 00178 #define LIXODD 0x10 00179 #define EOC 0x08 00180 #define TP0 0x04 00181 #define USR_INT 0x02 00182 #define TP2 0x01 00183 /* for INTC */ 00184 #define AUTOZERO 0x80 00185 #define IXLVL 0x40 00186 #define IXS1 0x20 00187 #define IXS0 0x10 00188 #define USRINT 0x08 00189 #define IA2 0x04 00190 #define IA1 0x02 00191 #define IA0 0x01 00192 00193 #define CNTRL0_AZ 0x80 00194 #define CNTRL0_AD2 0x40 00195 #define CNTRL0_AD1 0x20 00196 #define CNTRL0_AD0 0x10 00197 #define CNTRL0_CAL 0x08 00198 #define CNTRL0_IA2 0x04 00199 #define CNTRL0_IA1 0x02 00200 #define CNTRL0_IA0 0x01 00201 00202 #define CNTRL1_WDTOUT 0x80 00203 #define CNTRL1_INT_G2 0x40 00204 #define CNTRL1_INT_T0 0x10 00205 #define CNTRL1_INT_T2 0x20 00206 #define CNTRL1_NOT_SLAVE 0x08 00207 #define CNTRL1_IEN_G2 0x04 00208 #define CNTRL1_IEN_T0 0x01 00209 #define CNTRL1_IEN_T2 0x02 00210 00211 #define BRDTST_EOC 0x08 00212 00213 /* 00214 * We're hardwired to irq 5 (sorry). This is normally reserved for 00215 * lpt2, but most people don't have two printers. Sometimes a modem, 00216 * sound card, etc. will be using this interrupt. It would be easiest 00217 * to remove any offending card temporarily. Otherwise you'll have 00218 * to figure out how to change the following define's. 00219 */ 00220 #define INTR 13 /* irq5 is short 13 */ 00221 #define INT_MASK 0x20 /* mask for motherboard interrupt controller */ 00222 #define IC_ADD 0x20 /* address of the interrupt controller on your */ 00223 /* motherboard (NOT the one on the Servo To Go */ 00224 /* board). For low numbered interrupts (0-7) */ 00225 /* it's 0x20, for higher numbered interrupts */ 00226 /* (8-15) it's 0xa0 */ 00227 #define EOI_5 0x65 /* Specific EOI for IRQ 5 (used with above) */ 00228 #define IC_MASK 0x21 /* The interrupt mask register on your motherboard */ 00229 00230 #define IRQSL 0x84 /* IRQ selection for INTC register */ 00231 /* end of irq related defines */ 00232 00233 /* */ 00234 /* digital I/O port stuff */ 00235 /* */ 00236 /* begin to use the enumerated type, rather than the defines */ 00237 /* */ 00238 typedef enum { A_dir = 0x01, B_dir = 0x02, C_lo_dir = 0x04, 00239 C_hi_dir = 0x08, C_dir = 0x0c, D_lo_dir = 0x10, 00240 D_hiDir = 0x20, D_dir = 0x30 } eDir_typ; |
|
|