📄 apci1710_chrono.c
字号:
/* Calculate the real timing */ /*****************************/ ul_RealTimingInterval = (ULONG) (ul_TimerValue / (1000.0 * (double) b_PCIInputClock)); d_RealTimingInterval = (double) ul_TimerValue / (1000.0 * (double) b_PCIInputClock); if ((double) ((double) ul_TimerValue / (1000.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) * 0.99392); } break; /*****/ /* s */ /*****/ case 3: /******************/ /* Timer 0 factor */ /******************/ ul_TimerValue = (ULONG) (ul_TimingInterval * (1000000.0 * b_PCIInputClock)); /*******************/ /* Round the value */ /*******************/ if ((double) ((double) ul_TimingInterval * (1000000.0 * (double) b_PCIInputClock)) >= ((double) ((double) ul_TimerValue + 0.5))) { ul_TimerValue = ul_TimerValue + 1; } /*****************************/ /* Calculate the real timing */ /*****************************/ ul_RealTimingInterval = (ULONG) (ul_TimerValue / (1000000.0 * (double) b_PCIInputClock)); d_RealTimingInterval = (double) ul_TimerValue / (1000000.0 * (double) b_PCIInputClock); if ((double) ((double) ul_TimerValue / (1000000.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) * 0.99392); } break; /******/ /* mn */ /******/ case 4: /******************/ /* Timer 0 factor */ /******************/ ul_TimerValue = (ULONG) ((ul_TimingInterval * 60) * (1000000.0 * b_PCIInputClock)); /*******************/ /* Round the value */ /*******************/ if ((double) ((double) (ul_TimingInterval * 60.0) * (1000000.0 * (double) b_PCIInputClock)) >= ((double) ((double) ul_TimerValue + 0.5))) { ul_TimerValue = ul_TimerValue + 1; } /*****************************/ /* Calculate the real timing */ /*****************************/ ul_RealTimingInterval = (ULONG) (ul_TimerValue / (1000000.0 * (double) b_PCIInputClock)) / 60; d_RealTimingInterval = ((double) ul_TimerValue / (0.001 * (double) b_PCIInputClock)) / 60.0; if ((double) (((double) ul_TimerValue / (1000000.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) * 0.99392); } break; } fpu_end (); /****************************/ /* Save the PCI input clock */ /****************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. b_PCIInputClock = b_PCIInputClock; /*************************/ /* Save the timing unity */ /*************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. b_TimingUnit = b_TimingUnit; /************************/ /* Save the base timing */ /************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. d_TimingInterval = d_RealTimingInterval; /****************************/ /* Set the chronometer mode */ /****************************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. dw_ConfigReg = dw_ModeArray [b_ChronoMode]; /***********************/ /* Test if 40 MHz used */ /***********************/ if (b_PCIInputClock == APCI1710_40MHZ) { devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. dw_ConfigReg = devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. dw_ConfigReg | 0x80; } outl(devpriv->s_ModuleInfo [b_ModulNbr].s_ChronoModuleInfo. dw_ConfigReg,devpriv->s_BoardInfos. ui_Address + 16 + (64 * b_ModulNbr)); /***********************/ /* Write timer 0 value */ /***********************/ outl(ul_TimerValue,devpriv->s_BoardInfos. ui_Address + (64 * b_ModulNbr)); /*********************/ /* Chronometer init. */ /*********************/ devpriv->s_ModuleInfo [b_ModulNbr]. s_ChronoModuleInfo. b_ChronoInit = 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 unity selection is wrong */ /***********************************/ DPRINTK("Timing unity 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_ChronoMode >= 0 && b_ChronoMode <= 7) else { /***************************************/ /* Chronometer mode selection is wrong */ /***************************************/ DPRINTK("Chronometer mode selection is wrong\n"); i_ReturnValue = -4; } // if (b_ChronoMode >= 0 && b_ChronoMode <= 7) } else { /******************************************/ /* The module is not a Chronometer module */ /******************************************/ DPRINTK("The module is not a Chronometer module\n"); i_ReturnValue = -3; } } else { /***********************/ /* Module number error */ /***********************/ DPRINTK("Module number error\n"); i_ReturnValue = -2; } data[0] = ul_RealTimingInterval; return (i_ReturnValue); }/*+----------------------------------------------------------------------------+| Function Name : _INT_ i_APCI1710_EnableChrono || (BYTE_ b_BoardHandle, || BYTE_ b_ModulNbr, || BYTE_ b_CycleMode, || BYTE_ b_InterruptEnable)INT i_APCI1710_InsnWriteEnableDisableChrono(comedi_device *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) |+----------------------------------------------------------------------------+| Task : Enable the chronometer from selected module || (b_ModulNbr). You must calling the || "i_APCI1710_InitChrono" function be for you call this || function. || If you enable the chronometer interrupt, the || chronometer generate a interrupt after the stop signal.|| 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. | Disable the chronometer from selected module || (b_ModulNbr). If you disable the chronometer after a || start signal occur and you restart the chronometer || witch the " i_APCI1710_EnableChrono" function, if no || stop signal occur this start signal is ignored. +----------------------------------------------------------------------------+| Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 || BYTE_ b_ModulNbr CR_AREF(chanspec) : Selected module number (0 to 3) | data[0] ENABle/Disable chrono| BYTE_ b_CycleMode : Selected the chronometer || data[1] acquisition mode || BYTE_ b_InterruptEnable : Enable or disable the || data[2] chronometer interrupt. || APCI1710_ENABLE: || Enable the chronometer || interrupt || APCI1710_DISABLE: || Disable the chronometer || interrupt |+----------------------------------------------------------------------------+| Output Parameters : - |+----------------------------------------------------------------------------+| Return Value : 0: No error || -1: The handle parameter of the board is wrong || -2: Module selection wrong || -3: The module is not a Chronometer module || -4: Chronometer not initialised see function || "i_APCI1710_InitChrono" || -5: Chronometer acquisition mode cycle is wrong || -6: Interrupt parameter is wrong || -7: Interrupt function not initialised. || See function "i_APCI1710_SetBoardIntRoutineX" -8: data[0] wrong input |+----------------------------------------------------------------------------+*/INT i_APCI1710_InsnWriteEnableDisableChrono(comedi_device *dev,comedi_subdevice *s, comedi_insn *insn,lsampl_t *data) { INT i_ReturnValue = 0; BYTE b_ModulNbr,b_CycleMode,b_InterruptEnable,b_Action; b_ModulNbr = CR_AREF(insn->chanspec); b_Action =(BYTE) data[0]; b_CycleMode =(BYTE) data[1]; b_InterruptEnable =(BYTE) data[2]; i_ReturnValue = insn->n; /**************************/ /* Test the module number */ /**************************/ if (b_ModulNbr < 4) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -