Jump to content
  • 0

Data capture hangs during sync mode capture


TickTock

Question

I am debugging a Python test fixture using an AnalogDiscovery2.  The DUT is outputting 8 bits at approximately 1kHz along with a clock (bin width of an ADC) and I am using the sync trigger mode to capture this data for processing.  It appears to work most of the time but if I try to capture more than about 3000 samples, the acquisition freezes.  Scope confirms I am still getting clocks out of the DUT but the cAvailable.value is returning 0.  It is not indicating and lost or corrupt values.  When this happens is somewhat variable and seems to get worse the longer the AD2 is powered on.  Almost gets to all 4096 samples the first time I run it but freezes around 90%.

from random import random
from ctypes import *
from dwfconstants import *
import math
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
import sys
import numpy

if sys.platform.startswith("win"):
    dwf = cdll.dwf
elif sys.platform.startswith("darwin"):
    dwf = cdll.LoadLibrary("/Library/Frameworks/dwf.framework/dwf")
else:
    dwf = cdll.LoadLibrary("libdwf.so")

hdwf = c_int()
sts = c_byte()
channel = c_int(0)

version = create_string_buffer(16)
dwf.FDwfGetVersion(version)
print("DWF Version: "+str(version.value))

print("Opening first device")
dwf.FDwfDeviceOpen(c_int(-1), byref(hdwf))
##dwf.FDwfDeviceConfigOpen(c_int(-1), 0, byref(hdwf))

#if hdwf.value == 0:
if hdwf.value == hdwfNone.value:
    print("failed to open device")
    szerr = create_string_buffer(512)
    dwf.FDwfGetLastErrorMsg(szerr)
    print(str(szerr.value))
    quit()

##dwf.FDwfDeviceReset(hdwf)
##dwf.FDwfDeviceAutoConfigureSet(hdwf, c_int(0))# 0 = the device will be configured only when calling FDwf###Configure

print("Configuring Analog Out...")
# enable positive supply
dwf.FDwfAnalogIOChannelNodeSet(hdwf, c_int(0), c_int(0), c_double(True)) 
# set voltage to 5 V
dwf.FDwfAnalogIOChannelNodeSet(hdwf, c_int(0), c_int(1), c_double(5.0)) 
dwf.FDwfAnalogIOEnableSet(hdwf, c_int(True))

# set up ramp
dwf.FDwfAnalogOutNodeEnableSet(hdwf, channel, AnalogOutNodeCarrier, c_bool(True))
dwf.FDwfAnalogOutNodeFunctionSet(hdwf, channel, AnalogOutNodeCarrier, funcTriangle)
dwf.FDwfAnalogOutNodeFrequencySet(hdwf, channel, AnalogOutNodeCarrier, c_double(.05))
dwf.FDwfAnalogOutNodeAmplitudeSet(hdwf, channel, AnalogOutNodeCarrier, c_double(2.7))
dwf.FDwfAnalogOutNodeOffsetSet(hdwf, channel, AnalogOutNodeCarrier, c_double(2.5))

print("Generating wave...")
dwf.FDwfAnalogOutConfigure(hdwf, channel, c_bool(True))

print("Configuring Digital In...")
# record mode
dwf.FDwfDigitalInAcquisitionModeSet(hdwf, acqmodeRecord)
# for sync mode set divider to -1 
dwf.FDwfDigitalInDividerSet(hdwf, c_int(-1))
# 8bit per sample format
dwf.FDwfDigitalInSampleFormatSet(hdwf, c_int(8))
# number of samples 
dwf.FDwfDigitalInTriggerPositionSet(hdwf, c_int(4096))
# in sync mode the trigger is used for sampling condition
# trigger detector mask:          low &     hight & ( rising | falling )
dwf.FDwfDigitalInTriggerSet(hdwf, c_int(0), c_int(0), c_int(1<<6), c_int(0)) # CLK on DIO-6 rising edge

class myButtons:
    nSamples = 4096
    nStart = 0
    def go(self, event):
        # begin acquisition
        rgwSamples = (c_uint8*4096)()
        for i in range(self.nSamples):
            rgwSamples[i]=0
        cAvailable = c_int()
        cLost = c_int()
        cCorrupted = c_int()
        cSamples = 0
        fLost = 0
        fCorrupted = 0
        maxBufferSize = 0
        trycount = 0
        go = 0

        print("Searching for Start Signal")
        dwf.FDwfDigitalInConfigure(hdwf, c_bool(0), c_bool(1))

        while cSamples < (self.nStart+self.nSamples):
            #dwf.FDwfDigitalInConfigure(hdwf, c_bool(0), c_bool(1))
            dwf.FDwfDigitalInStatus(hdwf, c_int(1), byref(sts))
            if cSamples == 0 and (sts == DwfStateConfig or sts == DwfStatePrefill or sts == DwfStateArmed) :
                # acquisition not yet started.
                continue

            dwf.FDwfDigitalInStatusRecord(hdwf, byref(cAvailable), byref(cLost), byref(cCorrupted))

            cSamples += cLost.value
            
            if cLost.value :
                fLost = 1
                print("v",end='')
            if cCorrupted.value :
                fCorrupted = 1
                print(",",end='')
            if cAvailable.value==0 :
                # no new values
                trycount += 1
                if ((trycount%1000)==0) :
                    print(".",end='') #When it hangs it keeps printing this line indicating no values
                continue
            else :
                trycount = 0

            if cAvailable.value > 4096-cSamples :
                cAvailable = c_int(4096-cSamples)
            
            # get samples
            dwf.FDwfDigitalInStatusData(hdwf, byref(rgwSamples, cSamples), c_int(cAvailable.value))
            #print("\navailable :",cAvailable.value," Total :",cSamples+cAvailable.value," Last :",go," ",end='')

            #Search for START
            if (rgwSamples[0] < 0x80) : 
                go = 1
            if go==1 :
                cSamples += cAvailable.value
                print("%2.1f%s complete" % (100*cSamples/(self.nStart+self.nSamples), '%'))
                if (rgwSamples[cSamples-1] < 0x80) and (cSamples > 64):
                    break

        print("done")

I am outputting the available samples and the current index (cSamples) so I know I am not overrunning a register space.  I would appreciate any insights.

Here is the last few lines of the debug output:  It will keep printing the "." forever.

available : 2  Total : 3516  Last : 1  85.8% complete

available : 6  Total : 3522  Last : 1  86.0% complete

available : 1  Total : 3523  Last : 1  86.0% complete
...................................................................................................................................

 

Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...