Lesiastas

Members
  • Content Count

    54
  • Joined

  • Last visited

About Lesiastas

  • Rank
    Frequent Visitor

Recent Profile Visitors

384 profile views
  1. Hi @attilaI was able to reduce the time it takes for RgLong to be processed by putting the start and stop bit between the entire data, not between each character. I also customized several settings. Here's the latest code that I'm using: The test time that I've measured so far are: Can you please check if there are possible improvements to the latest code? I'm not confident that it is the best setup to use at the moment. Thank you for your guidance. Best regards, Lesiastas
  2. Update: I was able to transmit a binary sequence consisting of: 1 start bit + (32 inverted data bits of the word "UART") + 1 stop bit + 6 additional "1" bits (to fill in missing bits in extra byte) I enabled DIOs 0, 1, and 2. I transmitted the data using DIO 0 to DIO 2. The Logic Analyzer was able to receive these raw samples: I was able to parse it by detecting the start bit first then converting the bits of the word "UART" into decimal values. After that, I convert the decimal values into ASCII format. The problem I observed is that the received result is still not the same with that of the transmitted data. We transmitted the word "UART" but received an incorrect data. DIO0Mesg contains the received data. It has a few spaces after the received data. Can anyone explain why this keeps on occuring? It would be a big help.Here's the latest VB code that I'm using: Best regards, Lesiastas
  3. Greetings, I am working on a project using the Pattern Generator and Logic Analyzer functions of Analog Discovery 2. I'm trying to figure out the proper arrangements of bits to be assigned to the Pattern Generator so that the Logic Analyzer can receive it in UART format properly. Let's say I want to transmit the word "UART" using the Pattern Generator. Here's how I'm doing it using the Custom Signal setting in the Pattern Generator: The bits highlighted in green are the start and stop bits while those in yellow are the inverted data bits of the word "UART". I also adjusted the Run and Repeat time to only transmit it once. (40/9600 = 0.004166666) I transmitted it to the Logic Analyzer and it was able to receive it using the UART setting. The problem that I see with this is if you want to transmit a single character, you'll need 10 bits for it. For big data, it will take too long to be received by the Logic Analyzer. I was wondering if the Pattern Generator can be set up like this: 1 start bit + (32 Data bits of "UART") + 1 stop bit This reduces the no. of bits by only using the start and stop bits at the beginning and at the end of the data to be transmitted. I tried doing this by rearranging the bits, the run time and repeat settings in the Pattern Generator: The results that I got using the Logic Analyzer became incorrect for the next characters: I'm also trying to do it in VB. Here's the code for it: Imports System.Text 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" oReturn.Append(StartBit) For Each Character As Byte In System.Text.ASCIIEncoding.ASCII.GetBytes(Text) oReturn.Append(StrReverse(Convert.ToString(Character, 2).PadLeft(8, "0"))) 'oReturn.Append((Convert.ToString(Character, 2).PadLeft(8, "0"))) Next oReturn.Append(StopBit) 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 FDwfDeviceAutoConfigureSet(hdwf, 0) ' only the #Configure functions will apply settings ' UART channels: DIO-0 and DIO-1, h3 = (1 << 0)|(1 << 1) Const nLoop = 744 Const fsDio = &HFFFF Const hzUart = 230400 Const hzRate = hzUart * 1 ''''' Const cSamples = 8 * 4 'RgLong is 4 characters Dim cBuffer As Integer Dim RgLong As String : RgLong = "UART" Dim secRun As Double : secRun = (Len(RgLong) * 8) * (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 'Processing Data for Transmission AD2_FDwfDigitalOutDataLong(hdwf, 0, RgLong, 510) 'Data needs to be tested for 744 times Dim StartTime As Double Dim SecondsElapsed As Double 'Measuring Test Time StartTime = Timer If cSamples <= cBuffer Then ' prime for repeated captures FDwfDigitalInConfigure(hdwf, 1, 1) ' it will rearm for consecutive iterations FDwfDigitalOutConfigure(hdwf, 1) End If For i = 0 To nLoop - 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 FDwfDigitalInConfigure(hdwf, 1, 1) ' restart is only required for record FDwfDigitalOutConfigure(hdwf, 1) 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) If i < nLoop - 1 Then FDwfDigitalOutConfigure(hdwf, 1) ' start next while processing data below End If 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) Console.WriteLine("This code ran successfully in " & SecondsElapsed & " seconds.\n") Console.WriteLine((nLoop) & " x" & (1000 * SecondsElapsed / nLoop) & "ms loop latency:" & (1000 * (SecondsElapsed / nLoop - cSamples / hzRate)) & "ms") FDwfDeviceCloseAll() End Sub End Module Can anyone please explain why this is the case? Any advice will do. Best regards, Lesiastas
  4. 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
  5. 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
  6. 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. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. Hi @attila Does this mean I have to set FDwfDigitalInTriggerPrefillSet(hdwf, 0) to this values? Best regards, Lesiastas
  14. 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
  15. 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