Lesiastas

Members
  • Content Count

    51
  • Joined

  • Last visited

About Lesiastas

  • Rank
    Frequent Visitor

Recent Profile Visitors

272 profile views
  1. Hi @attila Thanks for being straightforward with your answer I have a few questions regarding the capabilities of Analog Discovery 2 and its features: 1). Are there other features of AD2 besides the Pattern Generator and Logic Analyzer that can be used to test RgLong to achieve a faster test time? 2). Just in case this is the limitation of AD2, are there other Digilent products that you would recommend to achieve a test time of 10 seconds or less? 3). Can you please explain what setup I need to use to do continuous capture and data processing for RgLong? Best regards, Lesiastas
  2. Hi @attila Thanks for the tweaks you've made with the code that I sent. I really appreciate it I have a few questions regarding the capabilities of Analog Discovery 2 and its features: 1). Is it possible to achieve a test time of 5 - 10 seconds using the Pattern Generator and Logic Analyzer features of AD2? Can you please explain what needs to be done to achieve this? 2). If not, are there other functions of AD2 that can be used to test RgLong for 744 iterations to achieve a test time of 5 - 10 seconds or is this the limit of Analog Discovery 2? Best regards, Lesiastas
  3. Hi @attila Thanks for the advice regarding the ConfigOpen. The buffer size of the Logic Analyzer can now handle up to 16384 samples. This is the setup that I'm working on. Please see the following code: - Selects the 4th configuration of AD2 which allocates 16k+ digital buffer - Uses the Pattern Generator to transmit the processed string data. - Uses the Logic Analyzer to receive and decode the transmitted data from the Pattern Generator. Module Module1 Function AD2_UARTCommRead(ByVal hdwf As Integer, ByRef rgData() As Byte, ByVal countOfDataBytes As Integer, ByVal hzRate As Integer, ByVal hzUart As Integer, ByVal pin As Integer, ByRef rgParsed As String, ByRef rgLength As Integer) As Integer 'Customized Uart Decoder Dim pData As Boolean Dim fData As Boolean : fData = True Dim cSamples As Integer : cSamples = rgData.Length Dim rgHex(cSamples) As Byte Dim cSamplePerBit As Integer : cSamplePerBit = hzRate / hzUart 'Decoding Raw Samples into Decimal For i = 0 To cSamples - 1 Dim s As Byte : s = rgData(i) pData = fData fData = 1 And (s >> pin) If pData <> 0 And fData = 0 Then Dim bValue As Integer : bValue = 0 For b = 0 To 7 Dim ii As Double : ii = Math.Round(i + (1.499 + b) * cSamplePerBit) ''''' If ii >= cSamples Then Exit For End If s = rgData(ii) fData = 1 And (s >> pin) If fData Then bValue = bValue + (1 << b) End If Next rgHex(i) = bValue i = i + cSamplePerBit * 9.499 - 1 '1 start + 8 bits + 0.5 stop -1 because For will increment End If Next 'Converting Decimal to ASCII Dim rgString As String For e = 0 To cSamples - 1 If rgHex(e) = 0 Then rgString = rgString Else rgString = rgString + Chr(rgHex(e)) End If Next e rgParsed = rgString rgLength = Len(rgParsed) End Function Function AD2_FDwfDigitalOutDataLong(ByVal Hdwf As Integer, ByVal IdxChannel As Integer, ByRef RgLong As String, ByVal LongBits As Integer) As Integer 'Post Processing Method 'Conversion of ASCII String to Binary Dim Text As String : Text = RgLong Dim n As Integer : n = Len(Text) Dim oReturn As New StringBuilder Dim StartBit As String : StartBit = "0" Dim StopBit As String : StopBit = "1" For Each Character As Byte In System.Text.ASCIIEncoding.ASCII.GetBytes(Text) oReturn.Append(StartBit) oReturn.Append(StrReverse(Convert.ToString(Character, 2).PadLeft(8, "0"))) oReturn.Append(StopBit) Next Dim Text2 As String : Text2 = (oReturn.ToString) 'Padding of Additional 1s Dim Counter As Integer : Counter = Len(Text2) Dim PadMod As Integer : PadMod = (Counter + (Counter + (Counter Mod 8))) Mod 8 Dim PadBin As String : PadBin = New String("1", PadMod) Text2 = Text2 + PadBin Dim PadResult As Integer : PadResult = Counter + PadMod 'Chunking of Bits into 8 Dim RevBytes(PadResult) As String For e As Integer = 0 To RevBytes.Length - 8 Step 8 RevBytes(e) = Text2.Substring(e, 8) Next e Dim backup As String Dim Extracted(PadResult) As String Dim TxBits(PadResult) As Byte Dim f As Integer, x As Integer Dim lTemp As Integer : lTemp = 0 Dim lngValue As Integer 'Inverting and Conversion of Bits For f = 0 To RevBytes.Length backup = StrReverse(RevBytes(8 * f)) If backup = "" Then Extracted(f) = "0" Extracted(f) = Extracted(f) & backup 'Conversion of Binary to Decimal lngValue = Convert.ToInt32(Extracted(f), 2) TxBits(f) = lngValue lngValue = 0 If TxBits(f) = 0 Then Exit For Next f Call FDwfDigitalOutDataSet(Hdwf, IdxChannel, TxBits, PadResult) End Function Sub Main() Dim hdwf As Long ' 3 = 4th device configuration of AD2 with 16k digital-in/out buffer If FDwfDeviceConfigOpen(-1, 3, hdwf) = False Then Dim szError As String FDwfGetLastErrorMsg(szError) System.Console.WriteLine("Device open failed" & vbCrLf & szError, vbExclamation + vbOKOnly) End End If ' UART channels: DIO-0 and DIO-1, h3 = (1 << 0)|(1 << 1) Const fsDio = &HFFFF Const hzUart = 230400 Const hzRate = hzUart * 1 ''''' Const cSamples = 10 * 510 'RgLong is 510 characters Dim cBuffer As Integer Dim RgLong As String : RgLong = "02FF0FFA001101F600030000000000EC0000000220500219D802010E2222021AFA22222222FF021A26FFFFFFFFFF021B08FFFFFFFFFF021ACFFFFFFFFFFF021B07FFFFFFFFFF021AF9E4F56BF569F56AF56C220220868E838F82EB6005EDF0A3DBFB2275A50002205085A53B75A502128D9A853BA522021B088F608D618A628B63E56345626054121E9E903275EEF0FCA3EFF0FD903275E0FEA3E0FF2404F582E43EF5837403F0EF2406FFE43EFE8F82F583E564F0AA06A9077B01900001E56012056C900002E56112056C900003E5628563F012062F7F07121E5A22000000000000000000000022D310AF01C3C0D0EFF5E9EDF5EDEEF5EAECF5EE74021400" Dim secRun As Double : secRun = (Len(RgLong) * 10) * (1 / hzUart) Dim phzFreq As Double 'PatGen Parameters - Initialized One Time FDwfDigitalOutInternalClockInfo(hdwf, phzFreq) FDwfDigitalOutRepeatSet(hdwf, 1) FDwfDigitalOutRunSet(hdwf, secRun) 'Enabling DIO-0 FDwfDigitalOutEnableSet(hdwf, 0, 1) FDwfDigitalOutTypeSet(hdwf, 0, 1) FDwfDigitalOutIdleSet(hdwf, 0, 2) FDwfDigitalOutDividerSet(hdwf, 0, (phzFreq / hzUart)) Dim hzDI As Double FDwfDigitalInInternalClockInfo(hdwf, hzDI) FDwfDigitalInTriggerSourceSet(hdwf, trigsrcDetectorDigitalIn) 'Falling Edge of any specified channel FDwfDigitalInTriggerSet(hdwf, 0, 0, 0, fsDio) FDwfDigitalInDividerSet(hdwf, hzDI / hzRate) FDwfDigitalInSampleFormatSet(hdwf, 8) FDwfDigitalInBufferSizeInfo(hdwf, cBuffer) If cSamples > cBuffer Then ' FDwfDigitalInAcquisitionModeSet(hdwf, acqmodeRecord) FDwfDigitalInTriggerPrefillSet(hdwf, 0) 'Number of samples after trigger FDwfDigitalInTriggerPositionSet(hdwf, cSamples) 'We are interested only on toggles of the specified channels FDwfDigitalInSampleSensibleSet(hdwf, fsDio) Else FDwfDigitalInBufferSizeSet(hdwf, cSamples) FDwfDigitalInTriggerPositionSet(hdwf, cSamples - 10) End If 'Data needs to be tested for 744 times Dim StartTime As Double Dim SecondsElapsed As Double 'Measuring Test Time StartTime = Timer '***************************** For i = 0 To 743 'Processing Data for Transmission AD2_FDwfDigitalOutDataLong(hdwf, 0, RgLong, 510) 'Triggering the Logic Analyzer first before transmitting data FDwfDigitalInConfigure(hdwf, 1, 1) FDwfDigitalOutConfigure(hdwf, 1) Dim rgData(cSamples) As Byte Dim sts As Byte Dim fOverflow As Boolean = False Dim iSample As Integer = 0 If cSamples > cBuffer Then ' record Dim cAvailable As Integer Dim cLost As Integer Dim cCorrupted As Integer While iSample < cSamples If FDwfDigitalInStatus(hdwf, 1, sts) = 0 Then Return End If If sts = DwfStateDone Or sts = DwfStateTriggered Then FDwfDigitalInStatusRecord(hdwf, cAvailable, cLost, cCorrupted) If cLost <> 0 Or cCorrupted <> 0 Then fOverflow = True End If cAvailable = Math.Min(cAvailable, cSamples - iSample) Dim rgTemp(cAvailable) As Byte ' in other programming languages use pass pointer to rgData[iSample] FDwfDigitalInStatusData(hdwf, rgTemp, 1 * cAvailable) For l = 0 To cAvailable - 1 rgData(iSample) = rgTemp(i) iSample += 1 Next End If If sts = DwfStateDone Then Exit While End If End While Else While True If FDwfDigitalInStatus(hdwf, 1, sts) = 0 Then Return End If If sts = DwfStateDone Then Exit While End If End While iSample = rgData.Length FDwfDigitalInStatusData(hdwf, rgData, 1 * rgData.Length) End If Dim DIO0Used As Long : DIO0Used = 2 'DIO #2 Dim DIO0Mesg As String : DIO0Mesg = "" Dim DIO0Length As Long AD2_UARTCommRead(hdwf, rgData, (1 * cSamples), hzRate, hzUart, DIO0Used, DIO0Mesg, DIO0Length) Next i '***************************** 'Determine how many seconds code took to run 'Notify user in seconds SecondsElapsed = Math.Round(Timer - StartTime, 6) MsgBox("This code ran successfully in " & SecondsElapsed & " seconds", vbInformation) FDwfDeviceCloseAll() End Sub End Module The data to be transmitted is RgLong which contains 510 characters. Each character is 10 bits long (1 start bit, 8 data bits, 1 stop bit). The contents of RgLong has 744 lines which will vary for each iteration of the For Loop but I decided to use just one line for this example. I used the AD2 Pattern Generator as the Transmitter and the AD2 Logic Analyzer as the Receiver to do a Loopback test using RgLong. Doing this test takes about 20.5 seconds which is too long. Is there a way to minimize the test time? Can you please check if the codes can be optimized? Best regards, Lesiastas
  4. Greetings! I'm working on a project involving the use of the AD2's Logic Analyzer Function. I need to receive 510 bytes of data in the shortest time possible. My questions are: 1). Can the Single/Repeated Acquisition Mode of the Logic Analyzer handle 510 bytes of data? - I observed that it can only handle up to 4096 samples and 1 byte of the data I'm handling is 10 bits (1 start bit, 8 data bits, 1 stop bit). So all in all, the Single/Repeated Acquisition Mode can only handle 409 bytes of data. Is there a way to make it capable of handling 510 bytes of data? 2). What is the fastest acquisition mode of the Logic Analyzer Function? - I observed that the Record Mode can handle thousands of data. The downside is it takes a very long time to receive data. Whenever I use the Record Mode, I receive all of the 510 bytes of data. The problem is I end up with 20.5 seconds before the results are displayed and that is too long. 3). What is the best acquisition mode if I want to receive 510 bytes of data as fast as possible? Any advice would really help. Best regards, Lesiastas
  5. Hi @attila Thank you for your support regarding the code I'm working on. I'm still getting a big execution time from this group of codes: Public Function AD2_RecordStart(ByVal hdwf As Integer, ByVal fReconfigure As Integer, ByVal fStart As Integer, ByVal fReadData As Integer, ByRef sts As Byte, ByVal cSamples As Integer, ByVal cBuffer As Integer, ByRef cAvailable As Integer, ByRef cLost As Integer, ByRef cCorrupted As Integer, ByRef rgData() As Byte) As Integer 'Record Parameters ReDim rgData(cSamples) Dim fOverflow As Boolean : fOverflow = False Dim iSample As Integer : iSample = 0 Dim cIdle As Integer = 0 Dim nIdle As Integer = 3 * 100 ''''' 100 bit long idle If cSamples > cBuffer Then ' record While iSample < cSamples If FDwfDigitalInStatus(hdwf, fReadData, sts) = 0 Then Return 0 End If If sts = DwfStateDone Or sts = DwfStateTriggered Then FDwfDigitalInStatusRecord(hdwf, cAvailable, cLost, cCorrupted) If cLost <> 0 Or cCorrupted <> 0 Then fOverflow = True End If cAvailable = Math.Min(cAvailable, cSamples - iSample) Dim rgTemp(cAvailable) As Byte ' in other programming languages use pass pointer to rgData[iSample] FDwfDigitalInStatusData(hdwf, rgTemp, 1 * cAvailable) For i = 0 To cAvailable - 1 rgData(iSample) = rgTemp(i) iSample = iSample + 1 If (rgTemp(i) & 3) = 3 Then cIdle += 1 Else cIdle = 0 End If Next If cIdle > nIdle Then Exit While End If End If If sts = DwfStateDone Then Exit While End If End While Else While True If FDwfDigitalInStatus(hdwf, 1, sts) = 0 Then Return 0 End If If sts = DwfStateDone Then Exit While End If End While iSample = rgData.Length FDwfDigitalInStatusData(hdwf, rgData, 1 * rgData.Length) End If End Function I transmitted 256 characters and it was done after 12 seconds. I also transmitted 510 characters but it took even longer to finish it. It took about 20.5 seconds before it could finish and the big contributor to this execution time is the snippet of code above. I think the code could be simplified but I'm having a hard time to determine which to change. Is there any way to work around this issue? Any advice would really help. Thanks in advance. Best regards, Lesiastas
  6. Hi @attila I'm having a hard time figuring out where to insert the snippet of code you've provided. I'd like to ask where should I place it in this VB Script I'm working on. Public Shared Function AD2_RecordStart(ByVal hdwf As Integer, ByVal fReconfigure As Integer, ByVal fStart As Integer, ByVal fReadData As Integer, ByRef sts As Byte, ByVal cSamples As Integer, ByVal cBuffer As Integer, ByRef cAvailable As Integer, ByRef cLost As Integer, ByRef cCorrupted As Integer, ByRef rgData() As Byte) As Integer 'Record Parameters ReDim rgData(cSamples) Dim fOverflow As Boolean : fOverflow = False Dim iSample As Integer : iSample = 0 If cSamples > cBuffer Then ' record While iSample < cSamples If FDwfDigitalInStatus(hdwf, fReadData, sts) = 0 Then Return 0 End If If sts = DwfStateDone Or sts = DwfStateTriggered Then FDwfDigitalInStatusRecord(hdwf, cAvailable, cLost, cCorrupted) If cLost <> 0 Or cCorrupted <> 0 Then fOverflow = True End If cAvailable = Math.Min(cAvailable, cSamples - iSample) Dim rgTemp(cAvailable) As Byte ' in other programming languages use pass pointer to rgData[iSample] FDwfDigitalInStatusData(hdwf, rgTemp, 1 * cAvailable) For i = 0 To cAvailable - 1 rgData(iSample) = rgTemp(i) iSample = iSample + 1 Next End If If sts = DwfStateDone Then Exit While End If End While Else While True If FDwfDigitalInStatus(hdwf, 1, sts) = 0 Then Return 0 End If If sts = DwfStateDone Then Exit While End If End While iSample = rgData.Length FDwfDigitalInStatusData(hdwf, rgData, 1 * rgData.Length) End If End Function Best regards, Lesiastas
  7. Hi @attila I'm really sorry for the confusion that I've caused you. What I'm doing is I'm observing the behavior of the AD2 in the WF application and I integrate those into the VB Script I'm working on. Then if I encounter a really hard showstopper, that's when I go and ask the forums for more details. Thanks for this advice! I'll try exploring the different settings of DwfParamOnClose I'm sorry to be a bother but can you please explain this quote further? Thank you in advance! Best regards, Lesiastas
  8. Hi @attila Thank you for clearing that one. I'll apply that concept to the code I'm working on. Does this mean I have to set the following APIs to these parameters: Dim cSamplesAfterTrigger As Long : cSamplesAfterTrigger = 18000 Dim cSamples As Long : cSamplesAfterTrigger = 18000 'Logic Parameters FDwfDigitalInTriggerSourceSet(phdwf, trigsrcDetectorDigitalIn) FDwfDigitalInTriggerSet(phdwf, 0, 0, 0, &HFFFF) FDwfDigitalInDividerSet(phdwf, (100000000.0 / 230400)) FDwfDigitalInSampleFormatSet(phdwf, 8) FDwfDigitalInBufferSizeInfo(phdwf, BufferSize) If cSamples > BufferSize Then FDwfDigitalInAcquisitionModeSet(phdwf, acqmodeRecord) FDwfDigitalInTriggerPrefillSet(phdwf, 0) FDwfDigitalInTriggerPositionSet(phdwf, cSamplesAfterTrigger) FDwfDigitalInSampleSensibleSet(phdwf, &HFFFF) Else FDwfDigitalInBufferSizeSet(phdwf, cSamples) FDwfDigitalInTriggerPositionSet(phdwf, cSamples - 10) End If Best regards, Lesiastas
  9. Hi @attila Thanks for reminding me about some information about my previous posts. I've determined why my VB Script is taking too long. It's not because of the Logic Analyzer's Record Mode, it's because of the Analog Discovery 2's FDwfDeviceConfigOpen. I've done 10 trials in measuring the Logic Analyzer Record Mode in the VB Script I'm working on: AD2_Time_Testing.rar The AD2_RecordStart first enables the trigger for the Logic Analyzer and then starts the transmission of the Pattern Generator. This ensures that data is received. It's average test time is 0.03 seconds, which is acceptable. The thing that I observed is regarding the FDwfDeviceConfigOpen's test time. I've done 10 trials to measure it and these are the results: I've measured all the other functions in the VB Script that I'm working on. The DeviceConfigOpen produces the longest time before opening. It takes about 325 milliseconds for the Analog Discovery 2 to open, which is too long. Can the time it takes for FDwfDeviceConfigOpen to finish be lessened or does it really take this long? Best regards, Lesiastas
  10. Hi @attila Does this mean I have to set FDwfDigitalInTriggerPrefillSet(hdwf, 0) to this values? Best regards, Lesiastas
  11. Hi @attila Thanks for pointing that out. I've tried it in the WaveForms GUI Application and the way I see it, the record mode fills the sample size set before returning results. This will take some additional test time in the application that I'm using it for. I've created a custom script for both the Pattern Generator and Logic Analyzer using VB6.(AD2_Time_Testing.rar) The setup that I am working on is this: 1). I'm using the Pattern Generator to transmit 256 characters. DIOs #0 and #1 are used as the Transmitter pins. 2). I'm using the Record Mode of the Logic Analyzer to receive a minimum of 9k characters. DIOs #2 and #3 are used as the Receiver pins. The Tx side is already working well, the only thing that concerns me is the way Record Mode behaves. I need it to stop recording once all of the 256 characters has been received. What I'm getting is it continues recording even though all of the 256 characters has been received already. To put it simply, I would like the record mode to behave like 'Single' mode in the WF Logic Analyzer app as well as receive a minimum of 9k characters. Is it possible to set the record mode in this manner? Please check the custom script that I've attached in this post. I'm open to any changes in order to improve it. Best regards, Lesiastas
  12. Greetings! i'm working on a project involving the use of the Logic Analyzer function of the Analog Discovery 2. I have observed that its Record Mode can be used to capture huge samples of data. The only problem that I'm having is it takes too long for the Record Mode to fill its memory before returning results even when the sample size used is 20k. I would like to know if it is possible to make the Record Mode of the Logic Analyzer intelligent in a way by making it stop filling its memory when the data to be transmitted has already been received. Because the application that I'm using Record Mode for should do so in order to return results faster. Any advice would help a lot. Best regards, Lesiastas
  13. Greetings! I'm working on a project using the Analog Discovery 2. I observed that the Pattern Generator can be used as a Transmitter and the Logic Analyzer can be used as a Receiver, if used properly. Here's the VB Script that I've been working on: AD2_Time_Testing.rar The VB Script does the following: 1). ASCII data is entered. 2). The algorithm in the code will convert it into binary to be transmitted by the Pattern Generator. 3). The Logic Analyzer will receive the bits in Record Mode. 4). The UART decoder algorithm will convert the bits received back into ASCII character. The result that I'm expecting is this: "U" ---> (Converted into Binary) ---> (Transmitted by the Pattern Generator) --> (Bits received in Record Mode) --->(BIts will be converted back in ASCII) ---> "U" The actual result that I'm getting is this: (DIO#0 (Tx) and DIO#2 (Rx) was used) Data that is to be transmitted: I connected DIO #0 to DIO #2 and a UART controller. Data was sucessfully transmitted and it was received by the UART controller: I also observed the bits returned by the FDwfDigitalInStatusData became like this: I think because of this change the UART Decoder algorithm cannot process it properly. That's why I'm getting this result: The output of DIO0Mesg should be "U" as well. Any advice regarding this? Best regards, Lesiastas AD2_Time_Testing.rar
  14. Hi @attila Thanks for the advice regarding the Analog Discovery 2's Device Configuration. I applied your advice and I can now transmit messages with more than 102 characters using the Pattern Generator Script I'm working on. I used DIO #0 and #1 to transmit several paragraphs from a piece I've found. Here is the result that I was able to receive using 2 UART Controller: It was able to transmit it perfectly! Thank you for your guidance! More power to you and Digilent! Best regards, Lesiastas
  15. Greetings, I'm working on a project utilizing the Pattern Generator function of Analog Discovery 2. I chose the Pattern Generator function based from the WaveForms GUI. In that interface, it can be used to transmit data in parallel. I created a VB Script consisting of Pattern Generator APIs, it was working fine. The problem that I encountered is its possible limitation: it can only transmit up to 102 characters. Each character consists of 10 bits (1 Start bit, 8 Data bits, and 1 Stop bit). Here are example of that scenarios: 1). Transmitted messages using DIOs #0 and #1 were received by 2 UART Controllers successfully. 1st message was exactly 102 characters. I added another character to the longer message and it became 103 characters. 2). The received results of the 2 UART Controllers is this: It was just blank for the other trials that I've done. My question is can the Pattern Generator be used to transmit data with a length more than 102 characters? If I want to transmit a minimum of 256 characters, can the Pattern Generator handle it? Any advice will surely help. Best regards, Lesiastas