USB-CTR Series cbDaqInScan Timing Mode C++ example

The following example program demonstrates (using Microsoft C) how to continuously read a counter channel and the digital port simultaneously. The counter is set to Timing mode which means the count starts on the input and stops on the gate. The counts returned represent ticks of a clock, to convert to time the count was multiplied by the time indicated by the tick size constant in the cbCConfigScan function. The code is listed below with comments. The full project (MS Visual Studio 2008) attached below.

Also demonstrated is device discovery which doesn't require the user to run InstaCal. InstaCal must still be installed because doing so installs the device drivers. At the bottom of this article you will find a Zip file that contains the Visual Studio 2008 project.

Program Output

// VC-2008_USB_CTR_TimingMode_DaqInScan.cpp : Defines the entry point for the console application.

#include "stdafx.h"

/* Include files */
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "cbw.h"

#define MAXNUMDEVS 100 //used for device descovery
#define CHANCOUNT 8 //total number of config array channels that make up two unsigned long channels
#define CHANCOUNT64BIT 2 //total number of 64 bit channels

#define BUFFSIZE 1000 * CHANCOUNT // buffer size
#define RATE 50 //sample rate

#define COUNTER 0
#define OutTimerNum 0
#define DebounceTime CTR_DEBOUNCE_NONE
#define EdgeDetection CTR_RISING_EDGE
#define TickSize CTR_TICK20833PT3ns    // 0 equates to 20.833 uS ticksize
#define tick 0.000020833f

void main ()
   /* Variable Declarations */
   int BoardNum = -1; 
   int ULStat = 0;
   long rate = RATE;
   long Pre = 0;
   long count = BUFFSIZE;
   long curCount,curIndex;
   short Status;

   HGLOBAL MemHandle = 0;

   short ChanArray[CHANCOUNT];  // DaqInScan configuration arrays
   short ChanTypeArray[CHANCOUNT];
   short GainArray[CHANCOUNT];

   int numberOfDevices = MAXNUMDEVS;
   DaqDeviceDescriptor inventory[MAXNUMDEVS];
   DaqDeviceDescriptor DeviceDescriptor;

   float Rev = (float)CURRENTREVNUM;
   ULStat = cbDeclareRevision(&Rev);
   cbErrHandling(PRINTALL, STOPALL);

   printf ("Demonstration to read counter 0 using Timing mode and digital input port\n\n");
//Ignore InstaCal device discovery

//locate USB devices
ULStat = cbGetDaqDeviceInventory(USB_IFC, inventory, &numberOfDevices);
for(int i = 0; i < numberOfDevices; i++)
DeviceDescriptor = inventory[i];

//Product ID for USB-CTR04 = 0x12E
//Product ID for USB-CTR08 = 0x127

//Product IDs can be found in ULProps.txt located in 
// C:\Program Files (x86)\Measurement Computing\DAQ

if(DeviceDescriptor.ProductID == 0x127)
BoardNum = i;
ULStat = cbCreateDaqDevice(BoardNum, DeviceDescriptor);

   if(BoardNum < 0)
   printf("USB device not any key to exit\n");
   //put counter in TIMING mode and invert gate for stop on falling edge; use 20.83uS tick size
   if(cbCConfigScan( BoardNum,
CTR_TICK20833PT3ns ,
0)) printf("Error Code %d",ULStat);

//set Digital port to input mode
    if(cbDConfigPort( BoardNum,
DIGITALIN)) printf("Error Code %d",ULStat);

   //Channel configuration arrays for cbDaqInScan; the default is 64 bit; this means that each channel must
   //must have four pseudo channels.
   ChanArray[0] = 0;
   GainArray[0] = NOTUSED;
   ChanTypeArray[0] = CTRBANK0;

   ChanArray[1] = 0;
   GainArray[1] = NOTUSED;
   ChanTypeArray[1] = CTRBANK1;

   ChanArray[2] = 0;
   GainArray[2] = NOTUSED;
   ChanTypeArray[2] = CTRBANK2;

   ChanArray[3] = 0;
   GainArray[3] = NOTUSED;
   ChanTypeArray[3] = CTRBANK3;

   ChanArray[4] = AUXPORT;
   GainArray[4] = NOTUSED;
   ChanTypeArray[4] = DIGITAL8;

   ChanArray[5] =  AUXPORT;;
   GainArray[5] = NOTUSED;
   ChanTypeArray[5] = PADZERO; //Needed for 64 ULONGLONG arrary

   ChanArray[6] =  AUXPORT;
   GainArray[6] = NOTUSED;
   ChanTypeArray[6] = PADZERO; //Needed for 64 ULONGLONG arrary

   ChanArray[7] =  AUXPORT;
   GainArray[7] = NOTUSED;
   ChanTypeArray[7] = PADZERO; //Needed for 64 ULONGLONG arrary

   //Allocate data buffer for the driver
   MemHandle = cbWinBufAlloc64(BUFFSIZE); 
   //get access to the buffer using a pointer
   ADData = (ULONGLONG*)MemHandle;

   //use cbDaqInScan to simultaneously read both the counter and the digital port
   if(cbDaqInScan ( BoardNum, 
BACKGROUND + CONTINUOUS))printf("Error Code %d",ULStat);

printf("Error Code %d\n",ULStat);

if(curIndex != -1)
printf ("%2.4lf sec\t%llu\n", (double)(ADData[curIndex/4] * tick),ADData[(curIndex + 4)/4]);

   //stop task and free up memory
   printf(" any key to exit\n"); 

Posted 10/3/2017 4:40:01 AM by Administrator