📄 apci1710_tor.c
字号:
/*****************************/ ul_RealTimingInterval = (ULONG) (ul_TimerValue / (250.0 * (double) b_PCIInputClock)); d_RealTimingInterval = (double) ul_TimerValue / (250.0 * (double) b_PCIInputClock); if ((double) ((double) ul_TimerValue / (250.0 * (double) b_PCIInputClock)) >= (double) ((double) ul_RealTimingInterval + 0.5)) { ul_RealTimingInterval = ul_RealTimingInterval + 1; } ul_TimingInterval = ul_TimingInterval - 1; ul_TimerValue = ul_TimerValue - 2; if (b_PCIInputClock != APCI1710_40MHZ) { ul_TimerValue = (ULONG) ((double) (ul_TimerValue) * 1.007752288); } break; /*****/ /* s */ /*****/ case 3: /******************/ /* Timer 0 factor */ /******************/ ul_TimerValue = (ULONG) (ul_TimingInterval * (250000.0 * b_PCIInputClock)); /*******************/ /* Round the value */ /*******************/ if ((double) ((double) ul_TimingInterval * (250000.0 * (double) b_PCIInputClock)) >= ((double) ((double) ul_TimerValue + 0.5))) { ul_TimerValue = ul_TimerValue + 1; } /*****************************/ /* Calculate the real timing */ /*****************************/ ul_RealTimingInterval = (ULONG) (ul_TimerValue / (250000.0 * (double) b_PCIInputClock)); d_RealTimingInterval = (double) ul_TimerValue / (250000.0 * (double) b_PCIInputClock); if ((double) ((double) ul_TimerValue / (250000.0 * (double) b_PCIInputClock)) >= (double) ((double) ul_RealTimingInterval + 0.5)) { ul_RealTimingInterval = ul_RealTimingInterval + 1; } ul_TimingInterval = ul_TimingInterval - 1; ul_TimerValue = ul_TimerValue - 2; if (b_PCIInputClock != APCI1710_40MHZ) { ul_TimerValue = (ULONG) ((double) (ul_TimerValue) * 1.007752288); } break; /******/ /* mn */ /******/ case 4: /******************/ /* Timer 0 factor */ /******************/ ul_TimerValue = (ULONG) ((ul_TimingInterval * 60) * (250000.0 * b_PCIInputClock)); /*******************/ /* Round the value */ /*******************/ if ((double) ((double) (ul_TimingInterval * 60.0) * (250000.0 * (double) b_PCIInputClock)) >= ((double) ((double) ul_TimerValue + 0.5))) { ul_TimerValue = ul_TimerValue + 1; } /*****************************/ /* Calculate the real timing */ /*****************************/ ul_RealTimingInterval = (ULONG) (ul_TimerValue / (250000.0 * (double) b_PCIInputClock)) / 60; d_RealTimingInterval = ((double) ul_TimerValue / (250000.0 * (double) b_PCIInputClock)) / 60.0; if ((double) (((double) ul_TimerValue / (250000.0 * (double) b_PCIInputClock)) / 60.0) >= (double) ((double) ul_RealTimingInterval + 0.5)) { ul_RealTimingInterval = ul_RealTimingInterval + 1; } ul_TimingInterval = ul_TimingInterval - 1; ul_TimerValue = ul_TimerValue - 2; if (b_PCIInputClock != APCI1710_40MHZ) { ul_TimerValue = (ULONG) ((double) (ul_TimerValue) * 1.007752288); } break; } fpu_end (); } // if (b_PCIInputClock != APCI1710_GATE_INPUT) else { /*************************************************************/ /* 2 Clock used for the overflow and the reload from counter */ /*************************************************************/ ul_TimerValue = ul_TimingInterval - 2; } // if (b_PCIInputClock != APCI1710_GATE_INPUT) /****************************/ /* Save the PCI input clock */ /****************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_TorCounterModuleInfo. b_PCIInputClock = b_PCIInputClock; /************************/ /* Save the timing unit */ /************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_TorCounterModuleInfo. s_TorCounterInfo [b_TorCounter]. b_TimingUnit = b_TimingUnit; /************************/ /* Save the base timing */ /************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_TorCounterModuleInfo. s_TorCounterInfo [b_TorCounter]. d_TimingInterval = d_RealTimingInterval; devpriv->s_ModuleInfo [b_ModulNbr]. s_TorCounterModuleInfo. s_TorCounterInfo [b_TorCounter]. ul_RealTimingInterval = ul_RealTimingInterval; /*******************/ /* Get the command */ /*******************/ dw_Command = inl(devpriv->s_BoardInfos.ui_Address + 4 + (16 * b_TorCounter) + (64 * b_ModulNbr)); dw_Command = (dw_Command >> 4) & 0xF; /******************/ /* Test if 40 MHz */ /******************/ if (b_PCIInputClock == APCI1710_40MHZ) { /****************************/ /* Set the 40 MHz selection */ /****************************/ dw_Command = dw_Command | 0x10; } /*****************************/ /* Test if extern clock used */ /*****************************/ if (b_PCIInputClock == APCI1710_GATE_INPUT) { /****************************/ /* Set the 40 MHz selection */ /****************************/ dw_Command = dw_Command | 0x20; } /*************************/ /* Write the new command */ /*************************/ outl(dw_Command,devpriv->s_BoardInfos.ui_Address + 4 + (16 * b_TorCounter) + (64 * b_ModulNbr)); /*******************/ /* Disable the tor */ /*******************/ outl(0,devpriv->s_BoardInfos. ui_Address + 8 + (16 * b_TorCounter) + (64 * b_ModulNbr)); /*************************/ /* Set the timer 1 value */ /*************************/ outl(ul_TimerValue,devpriv->s_BoardInfos.ui_Address + 0 + (16 * b_TorCounter) + (64 * b_ModulNbr)); /*********************/ /* Tor counter init. */ /*********************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_TorCounterModuleInfo. s_TorCounterInfo [b_TorCounter]. b_TorCounterInit = 1; } else { /***********************************************/ /* TOR version error for 40MHz clock selection */ /***********************************************/ DPRINTK("TOR version error for 40MHz clock selection\n"); i_ReturnValue = -9; } } else { /**************************************************************/ /* You can not used the 40MHz clock selection wich this board */ /**************************************************************/ DPRINTK("You can not used the 40MHz clock selection wich this board\n"); i_ReturnValue = -8; } } else { /**********************************/ /* Base timing selection is wrong */ /**********************************/ DPRINTK("Base timing selection is wrong\n"); i_ReturnValue = -7; } } // if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4)) else { /**********************************/ /* Timing unit selection is wrong */ /**********************************/ DPRINTK("Timing unit selection is wrong\n"); i_ReturnValue = -6; } // if ((b_TimingUnit >= 0) && (b_TimingUnit <= 4)) } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) else { /*****************************************/ /* The selected PCI input clock is wrong */ /*****************************************/ DPRINTK("The selected PCI input clock is wrong\n"); i_ReturnValue = -5; } // if ((b_PCIInputClock == APCI1710_30MHZ) || (b_PCIInputClock == APCI1710_33MHZ)) } // if (b_TorCounterMode >= 0 && b_TorCounterMode <= 7) else { /**********************************/ /* Tor Counter selection is wrong */ /**********************************/ DPRINTK("Tor Counter selection is wrong\n"); i_ReturnValue = -4; } // if (b_TorCounterMode >= 0 && b_TorCounterMode <= 7) } else { /******************************************/ /* The module is not a tor counter module */ /******************************************/ DPRINTK("The module is not a tor counter module\n"); i_ReturnValue = -3; } } else { /***********************/ /* Module number error */ /***********************/ DPRINTK("Module number error\n"); i_ReturnValue = -2; } data[0] = (UINT) ul_RealTimingInterval; return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function Name : _INT_ i_APCI1710_EnableTorCounter || (BYTE_ b_BoardHandle, || BYTE_ b_ModulNbr, || BYTE_ b_TorCounter, || BYTE_ b_InputMode, || BYTE_ b_ExternGate, || BYTE_ b_CycleMode, || BYTE_ b_InterruptEnable) |+----------------------------------------------------------------------------+| Task : Enable the tor counter (b_TorCounter) from selected || module (b_ModulNbr). You must calling the || "i_APCI1710_InitTorCounter" function be for you call || this function. || If you enable the tor counter interrupt, the || tor counter generate a interrupt after the timing cycle|| See function "i_APCI1710_SetBoardIntRoutineX" and the || Interrupt mask description chapter from this manual. || The b_CycleMode parameter determine if you will || measured a single or more cycle. |+----------------------------------------------------------------------------+| Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 || BYTE_ b_ModulNbr : Selected module number (0 to 3) || BYTE_ b_TorCounter : Tor counter selection (0 or 1). || BYTE_ b_InputMode : Input signal level selection || 0 : Tor count each low level || 1 : Tor count each high level|| BYTE_ b_ExternGate : Extern gate action selection || 0 : Extern gate signal not || used || 1 : Extern gate signal used. || If you selected the || single mode, each high || level signal start the || counter. || If you selected the || continuous mode, the || first high level signal || start the tor counter || || APCI1710_TOR_QUADRUPLE _MODE : || In the quadruple mode, the edge|| analysis circuit generates a || counting pulse from each edge || of 2 signals which are phase || shifted in relation to each || other. || The gate input is used for the || signal B || || APCI1710_TOR_DOUBLE_MODE: || Functions in the same way as || the quadruple mode, except that|| only two of the four edges are || analysed per period. || The gate input is used for the || signal B || || APCI1710_TOR_SIMPLE_MODE: |
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -