Dear NI forum members,
I am using NIDAQmx C API to implement a behavioural driving program. I would like to monitor a digital input port for an event, and every time a trigger exist I would like to generate a discrete digital pulse of some define width (e.g. 0.1 sec). The PCIe card is named NI PCIe 6321 from the X-series. And the connector block is called NI BNC-2110. Here how far I am now:
/* configure read port task */
DAQmxErrChk(DAQmxCreateTask("ReadPort", &readPort));
DAQmxErrChk(DAQmxCreateDIChan(readPort, "Dev1/port0/line0:7", "", DAQmx_Val_ChanPerLine));
DAQmxErrChk(DAQmxCfgChangeDetectionTiming(readPort, "Dev1/port0/line0", "", DAQmx_Val_ContSamps, 1));
DAQmxErrChk(DAQmxRegisterSignalEvent(readPort, DAQmx_Val_ChangeDetectionEvent, 0, ChangeDetectionCallback, state));
/* configure write port task */
DAQmxErrChk(DAQmxCreateTask("WritePort", &writePort));
DAQmxErrChk(DAQmxCreateDOChan(writePort, "Dev1/port1/line0:7", "", DAQmx_Val_ChanForAllLines)); # in the Callback function write to digital line
/* change detection callback function */
int32 CVICALLBACK ChangeDetectionCallback(TaskHandle taskHandle, int32 signalID, void *callbackData)
{
uInt8 data[8] = {0};
int32 numRead;
unsigned char lineBits = 0x01;
/* read port at event */
if (taskHandle)
{
DAQmxErrChk(DAQmxReadDigitalLines(taskHandle, 1, 10.0, DAQmx_Val_GroupByScanNumber, data, 8, &numRead, NULL, NULL));
/* if any bits changed trigger a pulse */
if (numRead)
{
DAQmxErrChk(DAQmxStartTask(writePort));
DAQmxErrChk(DAQmxWriteDigitalU8(writePort, 1, 1, 10.0, DAQmx_Val_GroupByChannel, &lineBits, NULL, NULL));
/* somewhere here update lineBits to ground (0) level and write after some time */
# pulse width time delay ??? also I do not want to use a delay command inside the callback function
# will it keep it blocked if event arrived while it is being delayed
lineBits = 0x02;
DAQmxErrChk(DAQmxWriteDigitalU8(writePort, 1, 1, 10.0, DAQmx_Val_GroupByChannel, &lineBits, NULL, NULL));
DAQmxErrChk(DAQmxStopTask(writePort));
}
}
return 0;
}
Any help or direction will be helpful! Thank you in advance!
Best,
Georgi