This graph shows which files directly or indirectly include this file:
Go to the source code of this file.
Data Structures | |
union | IO32 |
union | LONGBYTE |
Defines | |
#define | __attribute__(x) |
#define | DEFAULT_STG_BASE_ADDRESS 0x200 |
#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_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 | DIO_A 0x400 |
#define | DIO_B 0x402 |
#define | BRDTST 0x403 |
#define | DIO_C 0x404 |
#define | MIO_1 0x406 |
#define | DIO_D 0x401 |
#define | INTC 0x405 |
#define | MIO_2 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 | IRR 0x409 |
#define | ISR 0x409 |
#define | IMR 0x40b |
#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 | IRQSL 0x84 |
#define | A_OUT 0x10 |
#define | B_OUT 0x02 |
#define | C_LOW_OUT 0x01 |
#define | C_HI_OUT 0x08 |
#define | D_OUT 0x04 |
#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 |
Functions | |
char | __attribute__ ((unused)) stg_h[]="$Id |
unsigned short | BaseFind (void) |
void | SetIrq (short nRequestedIrq) |
short int | Initialize (short int nReqInt) |
int | StartADC (unsigned short wAxis) |
short | RawADC (unsigned short wAxis) |
void | EncoderInit (void) |
void | SelectInterruptPeriod (long) |
void | ResetIndexLatch (void) |
void | SelectIndexAxis (unsigned char byAxis, unsigned char byPol) |
unsigned char | CurrentIRR (void) |
int | IndexPulseLatch (void) |
int | RawDAC (short nAxis, double volts) |
int | EncoderLatch (void) |
int | EncReadAll (LONGBYTE *lbEnc) |
long | RawDI (void) |
void | RawDO (unsigned char byBitNumber, unsigned char bySet0or1, unsigned short nPort) |
void | RawDOAll (IO32 xOutBits) |
void | DIODirection (unsigned short nSwDir) |
Variables | |
WORDBYTE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 197 of file stgmembs.c. 00198 { 00199 short i; 00200 unsigned short io_add; 00201 00202 for (i = 15; i >= 0; i--) // search all possible addresses 00203 { 00204 io_add = i * 0x20 + 0x200; 00205 if ( BrdtstOK(io_add) ) 00206 return io_add; 00207 } 00208 return(0); 00209 } |
|
Definition at line 903 of file stgmembs.c. 00904 { 00905 fOutP(wBaseAddress + OCW3, 0x0a); // IRR on next read 00906 return fInP(wBaseAddress + IRRreg); 00907 } |
|
|
|
Definition at line 731 of file stgmembs.c. 00732 { 00733 WORDBYTE wbTransfer; 00734 unsigned short add; 00735 short i; 00736 int max_axes = wAxesInSys; 00737 unsigned short maxAdd; 00738 if(max_axes != 8) 00739 { 00740 max_axes = 4; 00741 } 00742 00743 // static unsigned char byOldByte2[MAX_AXIS]; 00744 // static unsigned char byEncHighByte[MAX_AXIS]; 00745 00746 if (wNoBoardFlag == NO_BOARD) 00747 { 00748 for (i = 0; i < 8; i++) 00749 { 00750 lbEnc[i].Long = lSimEnc[i]; 00751 } 00752 return; 00753 } 00754 00755 // Disable interrupts here? No, the timer will latch new data in the 00756 // hardware anyway. Maybe we should stop the timer? In an interrupt 00757 // service routine, you're synchronized with the timer; so the readings 00758 // will never change while you're reading them. If you're polling, you 00759 // would first latch the encoder counts with the EncoderLatch() function. 00760 // But, the timer could latch the counts again, in the middle of the read. 00761 // A critical section will help in some extreme cases. 00762 00763 // reset counter internal addr ptr to point to first byte 00764 maxAdd = (wBaseAddress + ((max_axes>4)?CNT6_C:CNT2_D)); 00765 for (add = wBaseAddress + CNT0_C; 00766 add <= maxAdd; 00767 add +=4) 00768 fOutPW(add, 0x0101); 00769 00770 for (i = 0; i < 3; i++) // 24 bits means get 3 bytes each 00771 { 00772 wbTransfer.Word = fInPW(wBaseAddress + CNT0_D); 00773 00774 lbEnc[0].Byte[i] = wbTransfer.Byte.high; 00775 lbEnc[1].Byte[i] = wbTransfer.Byte.low; 00776 00777 wbTransfer.Word = fInPW(wBaseAddress + CNT2_D); 00778 00779 lbEnc[2].Byte[i] = wbTransfer.Byte.high; 00780 lbEnc[3].Byte[i] = wbTransfer.Byte.low; 00781 00782 if(max_axes >= 8) 00783 { 00784 wbTransfer.Word = fInPW(wBaseAddress + CNT4_D); 00785 00786 lbEnc[4].Byte[i] = wbTransfer.Byte.high; 00787 lbEnc[5].Byte[i] = wbTransfer.Byte.low; 00788 00789 wbTransfer.Word = fInPW(wBaseAddress + CNT6_D); 00790 00791 lbEnc[6].Byte[i] = wbTransfer.Byte.high; 00792 lbEnc[7].Byte[i] = wbTransfer.Byte.low; 00793 } 00794 } 00795 00796 // maintain the high byte, to extend the counter to 32 bits 00797 // 00798 // base decisions to increment or decrement the high byte 00799 // on the highest 2 bits of the 24 bit value. To get the 00800 // highest 2 bits, use 0xc0 as a mask on byte [2] (the third 00801 // byte). 00802 00803 for (i = 0; i < max_axes; i++) 00804 { 00805 // check for -1 to 0 transition 00806 00807 if ( ( (byOldByte2[i] & 0xc0) == 0xc0 ) // 11xxxxxx 00808 && ( (lbEnc[i].Byte[2] & 0xc0) == 0 ) // 00xxxxxx 00809 ) 00810 byEncHighByte[i]++; 00811 00812 // check for 0 to -1 transition 00813 00814 if ( ( (byOldByte2[i] & 0xc0) == 0 ) // 00xxxxxx 00815 && ( (lbEnc[i].Byte[2] & 0xc0) == 0xc0 ) // 11xxxxxx 00816 ) 00817 byEncHighByte[i]--; 00818 00819 lbEnc[i].Byte[3] = byEncHighByte[i]; 00820 byOldByte2[i] = lbEnc[i].Byte[2]; // current byte 2 becomes old one 00821 } 00822 }; |
|
Definition at line 462 of file stgmembs.c. 00463 { 00464 LONGBYTE enc[8]; 00465 unsigned short wAdd,wA; 00466 unsigned short const wTestPat = 0x5aa5; 00467 00468 if (wNoBoardFlag == NO_BOARD) 00469 { 00470 wAxesInSys = MAX_AXIS; 00471 return; 00472 } 00473 00474 // It is possible that the encoder counts are being held by battery 00475 // backup, so we'll read the encoders, and save the values 00476 // Then we'll initialize the encoder chips, since it's more likely that 00477 // the ecoders were not kept alive by battery and need to be initialized 00478 00479 EncReadAll(enc); 00480 00481 // probably the right thing is to sign extend the 24 bits, so, instead 00482 // of a 24 bit unsigned count, we have +/- 23 bits. 00483 00484 // for ( i = 0; i < 8; i++) 00485 // { 00486 // byEncHighByte[i] = enc[i].Byte[2] & 0x80 ? 0xff : 0; 00487 // byOldByte2[i] = enc[i].Byte[2]; 00488 // } 00489 00490 for (wAdd = wBaseAddress + CNT0_C; 00491 wAdd <= wBaseAddress + CNT6_C; wAdd +=4) 00492 { 00493 // we're going to be slick and do two chips at a time, that's why 00494 // the registers are arranged data, data, control, control. You 00495 // can do two at a time, by using word operations, instead of 00496 // byte operations. Not a big deal for initializing, but reading is 00497 // done pretty often. 00498 00499 fOutPW(wAdd, 0x2020); // master reset 00500 00501 // Set Counter Command Register - Input Control, OL Load (P3), 00502 // and Enable Inputs A and B (INA/B). 00503 00504 fOutPW(wAdd, 0x6868); 00505 00506 // Set Counter Command Register - Output Control 00507 00508 fOutPW(wAdd, 0x8080); 00509 00510 // Set Counter Command Register - Quadrature 00511 00512 fOutPW(wAdd, 0xc3c3); 00513 00514 fOutPW(wAdd, 0x0404); //reset counter to zero 00515 } 00516 00517 // Figure out how many axes are on the card 00518 00519 for ( wA = wBaseAddress + CNT0_D; wA <= wBaseAddress + CNT6_D; wA +=4) 00520 { 00521 00522 // reset address pointer 00523 00524 fOutPW(wA + 2, 0x0101); 00525 00526 // write a pattern to the preset register 00527 00528 fOutPW(wA, wTestPat); 00529 fOutPW(wA, wTestPat); 00530 fOutPW(wA, wTestPat); 00531 00532 // transfer the preset register to the count register 00533 00534 fOutPW(wA + 2, 0x0909); 00535 00536 // transfer counter to output latch 00537 00538 fOutPW(wA + 2, 0x0202); 00539 00540 // read the output latch and see if it matches 00541 00542 if (fInPW(wA) != wTestPat) 00543 break; 00544 if (fInPW(wA) != wTestPat) 00545 break; 00546 if (fInPW(wA) != wTestPat) 00547 break; 00548 00549 // now replace the values that you saved previously, in case the 00550 // encoder was battery backed up 00551 00552 fOutP(wA, enc[wAxesInSys].Byte[0]); 00553 fOutP(wA, enc[wAxesInSys].Byte[1]); 00554 fOutP(wA, enc[wAxesInSys].Byte[2]); 00555 00556 fOutP(wA + 1, enc[wAxesInSys + 1].Byte[0]); 00557 fOutP(wA + 1, enc[wAxesInSys + 1].Byte[1]); 00558 fOutP(wA + 1, enc[wAxesInSys + 1].Byte[2]); 00559 00560 // transfer the preset register to the count register 00561 00562 fOutPW(wA + 2, 0x0909); 00563 00564 wAxesInSys += 2; 00565 00566 // write zeros to preset register, we don't want to do a master reset 00567 // (MRST), because then we would need to re-initialize the counter 00568 00569 // fOutPW(wA, 0); 00570 // fOutPW(wA, 0); 00571 // fOutPW(wA, 0); 00572 00573 // reset counter, BRW and CRY and address pointer (RADR) 00574 00575 // fOutPW(wA + 2, 0x0505); 00576 } 00577 }; |
|
Definition at line 1386 of file stgmembs.c. 01387 { 01388 #if 0 01389 unsigned short wAdd; 01390 #endif 01391 int max_axes = wAxesInSys; 01392 if (wNoBoardFlag == NO_BOARD) 01393 { 01394 return; 01395 } 01396 if(max_axes != 8) 01397 { 01398 max_axes = 4; 01399 } 01400 01401 // normally you'll have the timer latch the data in hardware, but 01402 // if the timer isn't running, we need to latch it ourselves. 01403 #if 0 01404 for ( wAdd = wBaseAddress + CNT0_C; wAdd <= wBaseAddress + CNT6_C; wAdd +=4) 01405 fOutPW(wAdd, 0x0303); 01406 #endif 01407 01408 /* BUG FIX-- don't go past 4 axes on 4 axis board */ 01409 fOutPW(wBaseAddress + CNT0_C, 0x0303); 01410 fOutPW(wBaseAddress + CNT2_C, 0x0303); 01411 if (max_axes > 4) { 01412 fOutPW(wBaseAddress + CNT4_C, 0x0303); 01413 fOutPW(wBaseAddress + CNT6_C, 0x0303); 01414 } 01415 01416 }; |
|
Definition at line 914 of file stgmembs.c. 00915 { 00916 // routine for Model 1 board 00917 00918 // poll the latched index pulse of the axis that was previously set up 00919 00920 unsigned char byIRR, byAxisMask; 00921 00922 byIRR = CurrentIRR(); 00923 byAxisMask = (byIndexPollAxis & 1) ? LIXODD : LIXEVN; // even or odd axis? 00924 if (byIRR & byAxisMask) // check latched index pulse 00925 return 1; 00926 return 0; 00927 00928 // 00929 // a faster, but messier way 00930 // 00931 //fOutP(wBaseAddress + OCW3, 0x0a); // IRR on next read 00932 // 00933 //return ( fInP(wBaseAddress + IRR) 00934 // & ( (byIndexPollAxis & 1) ? LIXODD : LIXEVN ) // mask for even or odd 00935 // ); 00936 } |
|
|
|
Definition at line 382 of file stg.c. Referenced by stgAdcRead(), and stgAioRead().
00383 { 00384 short ret; 00385 short j; 00386 00387 if (wAxis > 7) 00388 return -1; 00389 00390 /* 00391 there must have been a delay between StartADC() and RawADC(), 00392 of 19 usec if autozeroing (we are), 4 uses otherwise. In code 00393 that calls this, make sure you split these calls up with some 00394 intervening code 00395 */ 00396 00397 /* make sure conversion is done, assume polling delay is done. 00398 EOC (End Of Conversion) is bit 0x08 in IIR (Interrupt Request 00399 Register) of Interrupt Controller. Don't wait forever though 00400 bail out eventually. */ 00401 00402 for (j = 0; !(_inp(STG_BASE_ADDRESS + IRR) & 0x08) && (j < 1000); j++); 00403 00404 ret = _inpw(STG_BASE_ADDRESS + ADC_0 + (wAxis << 1)); 00405 00406 if (ret & 0x1000) /* is sign bit negative? */ 00407 ret |= 0xf000; /* sign extend */ 00408 else 00409 ret &= 0xfff; /* make sure high order bits are zero. */ 00410 00411 return ret; 00412 }; |
|
|
|
|
|
|
|
|
|
Definition at line 829 of file stgmembs.c. 00830 { 00831 // routine for Model 1 00832 00833 fInP(wBaseAddress + ODDRST); //lint !e534 reset index pulse latch for ODD axis 00834 fInP(wBaseAddress + BRDTST); //lint !e534 reset index pulse latch for EVEN axis 00835 } |
|
|
|
Definition at line 584 of file stgmembs.c. 00585 { 00586 if (wNoBoardFlag == NO_BOARD) 00587 { 00588 return; 00589 } 00590 00591 if (lPeriodSelect != MAX_PERIOD) 00592 { 00593 fOutP(wBaseAddress + TMRCMD, 0x56); // timer 1, read/load LSB (MSB is 0) 00594 // mode 3 (square wave) 00595 fOutP(wBaseAddress + TIMER_1, 0xb4); // 0xb4 = 180 -> 25 uSec period 00596 } 00597 else 00598 { 00599 fOutP(wBaseAddress + TMRCMD, 0x76); // timer 1, read/load LSB then MSB 00600 // mode 3 (square wave) 00601 fOutP(wBaseAddress + TIMER_1, 0xff); // LSB 00602 fOutP(wBaseAddress + TIMER_1, 0xff); // MSB 00603 } 00604 00605 switch (lPeriodSelect) 00606 { 00607 case _500_MICROSECONDS: 00608 fOutP(wBaseAddress + TMRCMD, 0x34); // timer 0, read/load LSB followed by 00609 // MSB, mode 2 (real-time interrupt) 00610 fOutP(wBaseAddress + TIMER_0, 0x14); // 0x14 = 20 = .5 mS 00611 fOutP(wBaseAddress + TIMER_0, 0x00); 00612 break; 00613 case _1_MILLISECOND: 00614 fOutP(wBaseAddress + TMRCMD, 0x34); // timer 0, read/load LSB followed by 00615 // MSB, mode 2 (real-time interrupt) 00616 fOutP(wBaseAddress + TIMER_0, 0x28); // 0x28 = 40 = 1 mS 00617 fOutP(wBaseAddress + TIMER_0, 0x00); 00618 break; 00619 case _2_MILLISECONDS: 00620 fOutP(wBaseAddress + TMRCMD, 0x34); // timer 0, read/load LSB followed by 00621 // MSB, mode 2 (real-time interrupt) 00622 fOutP(wBaseAddress + TIMER_0, 0x50); // 0x50 = 80 = 2 mS 00623 fOutP(wBaseAddress + TIMER_0, 0x00); 00624 break; 00625 case _3_MILLISECONDS: 00626 fOutP(wBaseAddress + TMRCMD, 0x34); // timer 0, read/load LSB followed by 00627 // MSB, mode 2 (real-time interrupt) 00628 fOutP(wBaseAddress + TIMER_0, 0x78); // 0x78 = 120 = 3 mS 00629 fOutP(wBaseAddress + TIMER_0, 0x00); 00630 break; 00631 case _4_MILLISECONDS: 00632 fOutP(wBaseAddress + TMRCMD, 0x34); // timer 0, read/load LSB followed by 00633 // MSB, mode 2 (real-time interrupt) 00634 fOutP(wBaseAddress + TIMER_0, 0xA0); // 0xA0 = 160 = 4 mS 00635 fOutP(wBaseAddress + TIMER_0, 0x00); 00636 break; 00637 case _5_MILLISECONDS: 00638 fOutP(wBaseAddress + TMRCMD, 0x34); // timer 0, read/load LSB followed by 00639 // MSB, mode 2 (real-time interrupt) 00640 fOutP(wBaseAddress + TIMER_0, 0xC8); // 0xC8 = 200 = 5 mS 00641 fOutP(wBaseAddress + TIMER_0, 0x00); 00642 break; 00643 case _10_MILLISECONDS: 00644 fOutP(wBaseAddress + TMRCMD, 0x34); // timer 0, read/load LSB followed by 00645 // MSB, mode 2 (real-time interrupt) 00646 fOutP(wBaseAddress + TIMER_0, 0x90); // 0x0190 = 400 = 10 mS 00647 fOutP(wBaseAddress + TIMER_0, 0x01); 00648 break; 00649 case _100_MILLISECONDS: 00650 fOutP(wBaseAddress + TMRCMD, 0x34); // timer 0, read/load LSB followed by 00651 // MSB, mode 2 (real-time interrupt) 00652 fOutP(wBaseAddress + TIMER_0, 0xA0); // 0x0FA0 = 4000 = 100 mS 00653 fOutP(wBaseAddress + TIMER_0, 0x0F); 00654 break; 00655 case _1_SECOND: 00656 fOutP(wBaseAddress + TMRCMD, 0x34); // timer 0, read/load LSB followed by 00657 // MSB, mode 2 (real-time interrupt) 00658 fOutP(wBaseAddress + TIMER_0, 0x40); // 0x9C40 = 40000 = 1 S 00659 fOutP(wBaseAddress + TIMER_0, 0x9c); 00660 break; 00661 case MAX_PERIOD: 00662 fOutP(wBaseAddress + TMRCMD, 0x34); // timer 0, read/load LSB followed by 00663 // MSB, mode 2 (real-time interrupt) 00664 fOutP(wBaseAddress + TIMER_0, 0xff); // LSB 00665 fOutP(wBaseAddress + TIMER_0, 0xff); // MSB 00666 break; 00667 default: 00668 // wrong input? then don't change it 00669 break; 00670 } 00671 }; |
|
|
|
Definition at line 313 of file stgmembs.c. 00314 { 00315 if (wNoBoardFlag == NO_BOARD) 00316 { 00317 return; 00318 } 00319 00320 if (wAxis > 7) 00321 return; 00322 00323 if (wModel == MODEL1) 00324 { 00325 // do a dummy read from the ADC, just to set the input multiplexer to 00326 // the right channel 00327 fInPW(wBaseAddress + ADC_0 + (wAxis << 1)); //lint !e534 00328 00329 // wait 4 uS for settling time on the multiplexer and ADC 00330 // you probably shouldn't really have a delay in 00331 // a driver. 00332 Timer2Delay(28); 00333 00334 // now start conversion. 00335 fOutPW(wBaseAddress + ADC_0 + (wAxis << 1), 0); 00336 } 00337 else // Model 2 00338 { 00339 unsigned char Cntrl0; 00340 00341 Cntrl0 = fInP(wBaseAddress + CNTRL0) & 0x07; // save irq 00342 00343 Cntrl0 |= (wAxis << 4) | 0x88; // shift bits to AD2, AD1, AD0 00344 // set bit 0x80 high for autozero 00345 // set bit 0x08 high, not calibrating 00346 fOutP(wBaseAddress + CNTRL0, Cntrl0); // select ADC channel 00347 00348 // don't have to do a dummy read for a model 2 00349 00350 // wait 4 uS for settling time on the multiplexer and ADC 00351 // you probably shouldn't really have a delay in 00352 // a driver. 00353 Timer2Delay(28); 00354 00355 // now start conversion. 00356 fOutPW(wBaseAddress + ADC, 0); 00357 00358 } 00359 }; |
|
Definition at line 37 of file stg.h. 00037 : stg.h,v 1.6 2001/10/30 23:34:05 paul_c Exp $"; 00038 00039 /* 00040 Number of axes in system defaults to 4. If STG_8_AXES is defined 00041 by compiler directive or other means, code will support 8 axes, 00042 e.g., -DSTG_8_AXES. Note that only 6 axes are really supported, since 00043 there is not enough digital IO for limit and home switches for all 8. 00044 00045 Analog input is an option, normally not present. If STG_ANALOG_INPUT is 00046 defined by compiler directive or other means, code will support analog 00047 input, e.g., -DSTG_ANALOG_INPUT 00048 */ 00049 00050 /* 00051 Base address defaults to 0x200 00052 */ 00053 #define DEFAULT_STG_BASE_ADDRESS 0x200 00054 extern unsigned short STG_BASE_ADDRESS; 00055 extern int FIND_STG_BASE_ADDRESS; 00056 00057 00058 /* decls for external interface */ 00059 00060 extern int stgMotInit(const char * stuff); 00061 extern int stgMotQuit(void); 00062 00063 extern int stgAdcNum(void); 00064 extern int stgAdcStart(int adc); 00065 extern void stgAdcWait(void); 00066 extern int stgAdcRead(int adc, double * volts); 00067 00068 extern int stgDacNum(void); 00069 extern int stgDacWrite(int dac, double volts); 00070 extern int stgDacWriteAll(int max, double * volts); 00071 00072 extern int stgEncoderSetIndexModel(unsigned int model); 00073 extern int stgEncoderNum(void); 00074 extern int stgEncoderRead(int encoder, double * counts); 00075 extern int stgEncoderReadAll(int max, double * counts); 00076 extern int stgEncoderResetIndex(int encoder); 00077 extern int stgEncoderReadLatch(int encoder, int * flag); 00078 extern int stgEncoderReadLevel(int encoder, int * flag); 00079 00080 extern int stgMaxLimitSwitchRead(int axis, int * flag); 00081 extern int stgMinLimitSwitchRead(int axis, int * flag); 00082 00083 extern int stgHomeSwitchRead(int axis, int * flag); 00084 00085 extern int stgAmpEnable(int axis, int enable); 00086 extern int stgAmpFault(int axis, int * fault); 00087 00088 extern int stgDioInit(const char * stuff); 00089 extern int stgDioQuit(void); 00090 00091 extern int stgDioMaxInputs(void); 00092 extern int stgDioMaxOutputs(void); 00093 extern int stgDioRead(int index, int *value); 00094 extern int stgDioWrite(int index, int value); 00095 extern int stgDioCheck(int index, int *value); 00096 extern int stgDioByteRead(int index, unsigned char *byte); 00097 extern int stgDioShortRead(int index, unsigned short *sh); 00098 extern int stgDioWordRead(int index, unsigned int *word); 00099 extern int stgDioByteWrite(int index, unsigned char byte); 00100 extern int stgDioShortWrite(int index, unsigned short sh); 00101 extern int stgDioWordWrite(int index, unsigned int word); 00102 extern int stgDioByteCheck(int index, unsigned char *byte); 00103 extern int stgDioShortCheck(int index, unsigned short *sh); 00104 extern int stgDioWordCheck(int index, unsigned int *word); 00105 00106 extern int stgAioInit(const char * stuff); 00107 extern int stgAioQuit(void); 00108 00109 extern int stgAioMaxInputs(void); 00110 extern int stgAioMaxOutputs(void); 00111 extern int stgAioStart(int index); 00112 extern void stgAioWait(void); 00113 extern int stgAioRead(int index, double *volts); 00114 extern int stgAioWrite(int index, double volts); 00115 extern int stgAioCheck(int index, double *volts); 00116 extern int stgModel(void); 00117 00118 typedef union 00119 { 00120 unsigned short Word; 00121 struct {unsigned char high, low;} Byte; 00122 } WORDBYTE; |
|
|