Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
learn:instrumentation:tutorials:ad2-logic-analyzer:start [2017/01/16 21:22] – [Using the Logic Analyzer] kaitlyn Franz | learn:instrumentation:tutorials:ad2-logic-analyzer:start [2021/06/02 23:46] (current) – Arthur Brown | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Using the Logic Analyzer | + | ====== Using the Logic Analyzer (REDIRECT) ====== |
- | Logic analyzers are used to record and analyze digital communication signals. They work in a similar manner to an oscilloscope, | + | ~~REDIRECT>test-and-measurement/guides/ |
- | + | ~~NOSEMANTIC~~ | |
- | ---- | + | {{tag>redirect}} |
- | + | ||
- | ==== Inventory ==== | + | |
- | * A [[http:// | + | |
- | * [[https:// | + | |
- | * A Pmod with serial communication. This could be [[http:// | + | |
- | * A USB cable | + | |
- | * A Windows, Linux, or Mac computer with USB port to run the software | + | |
- | * [[http:// | + | |
- | * You may also use the original [[http:// | + | |
- | * [[http:// | + | |
- | + | ||
- | ---- | + | |
- | + | ||
- | ====== Step 1: The Logic Analyzer ====== | + | |
- | If you want some help getting your Analog Discovery 2 set up and calibrated, or installing WaveForms 2015, check out this [[http:// | + | |
- | + | ||
- | Once you have your Analog Discovery 2 and WaveForms 2015 all set up, open the Logic Analyzer by clicking on the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | This will open the Logic Analyzer window. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Along the top you'll see the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Under " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | You can add a new instance of the logic analyzer, either by cloning the current analyzer settings or opening an empty instance with default settings. You can also " | + | |
- | + | ||
- | Under " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Next, you'll see the logic analyzer controls. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | " | + | |
- | + | ||
- | The " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | The Logic Analyzer uses the computer memory to store past data acquisitions in a buffer. It keeps a running tally of which buffer you are currently using. Clicking on the green plus sign, displayed in Fig. 11, lets you save the currently shown acquisition data to a new tab. The name of the tab can be edited by double clicking the tab header. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | You can trigger the Logic analyzer several different ways by clicking the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | You can set the source of your trigger by clicking the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Clicking " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | The " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | The " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Each protocol has its own specific trigger wizard, which are covered in the steps relating to each protocol. Since the wizards will configure the advanced options as needed, it is recommended that the wizards are utilized to set advanced options. | + | |
- | + | ||
- | In order to adjust or apply an advanced option, you will need to have added a channel to the grid, which will be covered in the next step. Also, be sure that the Advanced box is checked. Clicking " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Click the "Reset Condition" | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Your choices will appear in the grid in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Click the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Your choices will appear in the grid in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | With "One wire" unchecked, " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | With "One wire" checked, " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Check " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | + | ||
- | ---- | + | |
- | + | ||
- | ====== Step 2: The Grid (Part I) ====== | + | |
- | The next section is the grid itself. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Click the green plus drop-down to open a menu where you can select which type of data protocol you would like to analyze. Details on each choice are a bit farther down in this step. For our example, we will be analyzing a UART signal. | + | |
- | + | ||
- | {{ : | + | |
- | {{ : | + | |
- | + | ||
- | Click on the red minus drop-down to delete a selected protocol, or click on the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | The button displayed in Fig. 49 opens the properties editor for whichever protocol channel is selected in the grid. This is the same window that opens when you first select a protocol to add to the grid. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | The " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Use the scroll bar, displayed in Fig. 52, above the plot window to move the data window left/right once the data has been captured. Click on the arrows to change the position by a base span and double click to set the leftmost or rightmost position. Double click on the scroll area to reset the time to show the entire acquisition. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Below the scroll bar and to the left is the acquisition state indicator labeled " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | To the far right of the screen you have two buttons, one for hot track and one to change plot window settings. Hot track is explained a bit later with the demonstration example. From the plot window settings, you can adjust the plot background color between " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Original UART data captured. Notice how the 8-bit data packets are clearly interpreted and displayed above as both hexidecimal (h1B, h5B, h6A, h1B, h5B) and ASCII characters (" | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Now telling the tool to adjust where to start reading the UART data, beginning where it " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ==== Signal ==== | + | |
- | Now let's add protocols to the grid. By clicking on the green plus drop-down, you can add several different protocols to the grid. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Be aware that you can assign DIO channels to multiple protocols, i.e., you can use DIO 0 to watch you UART data signal as well as your I2C SCL signal. Notice the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Whatever data is captured will be displayed wherever that particular DIO is assigned. Luckily, you have 16 DIO pins (32 with the Electronics Explorer Board), so you should have no problem spacing out your protocols across the pins. Tyr and avoid doubling up if you can help it. | + | |
- | + | ||
- | The first protocol in the list is Signal. Note that selecting any protocol will first open a small property editor window. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Select one or multiple signals using the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | You can edit each channel by double clicking it on the grid, or clicking either edit button in the grid next to the signal name or above the grid. For Signal, the only thing you can edit is the name of the channel. You can change the trigger condition from the grid by clicking on the symbol in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ==== Bus ==== | + | |
- | The next protocol option is " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Select the channels you want to use for your bus in the left table. Click on the white plus sign to add them to the table on the right. Remove any channel from the right hand side by selecting it and clicking on the white minus button. Clicking on the up or down green arrows with a channel selected allows you to change the order of the channels in the bus. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Click on " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | With this wizard, you can set the trigger condition to look for a specific set of bits, corresponding to the number entered in the box. You can also set the individual trigger for any of the bus channels simply by clicking on the trigger symbol in the " | + | |
- | + | ||
- | ==== SPI ==== | + | |
- | Next on the list of protocols is Serial Peripheral Interface, or SPI, which is used extensively in embedded applications for synchronous serial communication. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Assign a DIO to " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set a second DIO to watch the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set a third DIO to watch the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Using " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Once you have your SPI defined, click " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Open the SPI trigger wizard by clicking on the red " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | You can set it to " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ==== I2C ==== | + | |
- | The next protocol on the list is Inter-integrated Circuit, or I<sup>2</ | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | As the alternate name, TWI, implies, I< | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Once you have your I< | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Open the I< | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | The default " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | "Any ACK/ | + | |
- | + | ||
- | " | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set "Byte 1" and "Byte 2" to look for specific bytes in the data packet. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | All three " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | + | ||
- | ---- | + | |
- | + | ||
- | ====== Step 3: The Grid (Part II) ====== | + | |
- | ==== UART ==== | + | |
- | Next is Universal Asynchronous Receiver/ | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Add any name for the UART protocol in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set the Analog Discovery 2 DIO pin with " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Define how many bits are in your data packet with " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | The default baud rate is set at 9600, but set " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set a delay in data interpretation using " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Once you have your UART defined, click " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | To edit the UART protocol, double click the Data channel in the grid or click on either of the property editors. Make the appropriate edits, then click " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Click on the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | You can set the tool to trigger on Break, Idle, or a Value. If Value is chosen, enter the value of the data packet in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | + | ||
- | ==== CAN ==== | + | |
- | Next is the Controlled Area Network, or CAN, which is used in automotive and robotic applications to communicate with all of ther peripheral devices on one main bus. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Name the CAN protocol whatever you want in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set the Analog Discovery 2 DIO pin with " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Adjust " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set a delay in data interpretation using " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Once you have you CAN defined, click " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | To edit the CAN protocol, double click the Data channel in the grid or click on either of the property editor buttons. Make the appropriate edits, then click " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Click on the red " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | You can set the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Choose between 11-bit or 29-bit identifier in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Define the identifier value in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | In the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | In the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Once the CAN trigger is defined, click " | + | |
- | + | ||
- | ==== I2S ==== | + | |
- | The last defined protocol on the list is the Inter-IC Sound, or I< | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set the name of your protocol in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set the size, in bits, of the data packet in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Once you have your I< | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | To edit the I< | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Click on the red " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set a specific watch value in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Use " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Once the I< | + | |
- | + | ||
- | + | ||
- | ==== Custom ==== | + | |
- | The last protocol option is Custom, which lets you define your own protocol interpreter. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Waveforms is coded using JavaScript. Utilizing the SDK that downloads with Waveforms, custom applications can be built and included with your own installed version of the Waveforms application. For more on that, see the SDK PDF that downloads with [[http://store.digilentinc.com/waveforms-2015-download-only/ | + | |
- | + | ||
- | + | ||
- | ---- | + | |
- | + | ||
- | ====== Step 4: An Example ====== | + | |
- | We've talked about showing an example several times now, so let's get to that. The [[http:// | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | There are two 6-pin Pmod headers on the CLS, J1 and J2. The silkscreen on the bottom shows the different communication protocol connections. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Since we're using UART, we will need to use the RX pin on J2. We won't be expecting to receive data from the CLS, so the TX pin doesn' | + | |
- | + | ||
- | Using a [[http:// | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Be sure to connect the RX pin on the CLS to the TX pin (1) on the uC32. | + | |
- | + | ||
- | The CLS has a number of commands in the [[https:// | + | |
- | + | ||
- | < | + | |
- | // ASCII values are in HEX, but can be converted to chars by typing a single apostrophe (') | + | |
- | // before and after the char, e.g. ' | + | |
- | byte setup_display[] = {0x1B, 0x5B, 0x6A, 0x1B, 0x5B, 0x30, 0x68, 0x1B, 0x5B, 0x32, 0x63}; | + | |
- | // ESC, | + | |
- | byte clear_display[] = {0x1B, 0x5B, 0x6A}; | + | |
- | // ESC, | + | |
- | void setup() { | + | |
- | Serial.begin(9600); | + | |
- | while(!Serial){}; | + | |
- | Serial.write(setup_display, | + | |
- | Serial.write(" | + | |
- | delay(1000); | + | |
- | Serial.write(clear_display, | + | |
- | Serial.write(" | + | |
- | } | + | |
- | void loop() {} | + | |
- | + | ||
- | </ | + | |
- | + | ||
- | Download the code to the uC32 and the messages should display on the LCD. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Utilizing a [[http:// | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set up a UART protocol interpreter with the Logic Analyzer tool. The default property settings will work fine here. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Click on the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | The UART data line holds logic high when not in use. The start bit of the data frame is indicated by dropping the line to logic low, so we know that we are about to get a data packet when the line goes low and the tool will trigger on that first falling edge. | + | |
- | + | ||
- | In the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | At the top right of the plot window, enter 4.5 ms in the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Click " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | We can see that the analyzer correctly interpreted the data packets and the hex value along with the ASCII character is displayed along the top. | + | |
- | + | ||
- | The only problem is that we know that we sent a lot more bytes of data than the 9 we can see in the plot. Using the record function, we can capture the entire data stream. Let's look at that. | + | |
- | + | ||
- | Select Record from the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Click " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Our serial baud rate is set at 9600, which is essentially 9.6 kHz. We want the sample rate to be significantly higher than that in order to capture the data. The default " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Set the number of " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Use the " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Once everything is set, click " | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | It doesn' | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | Use the scroll bar above the plot window to move left or right through the recorded data plot. | + | |
- | + | ||
- | Notice that the data packets have been interpreted by the tool and both the hexadecimal and ASCII values are displayed at the top of the plot window. | + | |
- | + | ||
- | Click on the "Hot track" button at the top right of the plot window. Zoom in on the recorded data stream and hover the mouse over it. Measurements and associated labels will appear on the plot, showing information like the data pulse width, period, etc. | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | {{ : | + | |
- | + | ||
- | ---- | + | |
- | + | ||
- | ====== Step 5: That's It!====== | + | |
- | As you can see, the Logic Analyzer on the Analog Discovery 2 is a powerful tool for helping test and analyze digital communication protocols. | + | |
- | + | ||
- | + | ||
- | {{tag>learn instrumentation tutorial analog-discovery-2 ad2 waveforms-2015 logic-analyzer logic labforms labview chipkit-core chipkit pmodcls uc32 microcontroller}} | + |