Search code examples
microchipdspic

How to plot a float number in Microchip Data Visualizer


I am having a problem between sending a float trough the UART to be plotted in a graph on the Data Visualizer of Microchip.

I could plot int numbers without problem, but float ones are driving me crazy.

I made a sine wave with Laplace trnasform. After that put it on the 'z' plane with the bilineal z transform, then put the equation in the main routine of a dsPIC33FJ128GP802. It is working ok. In the terminal I can see the values and if I copy/paste those values on gnumeric and make a graph, it shows me my discrete sine wave.

The problem comes when I try to plot the float number 'yn' in the data visualizer of the MPLABX. There is something I am missing in the middle.

I am using MPLABX v5.45, XC16 v1.61 on Debian Bullseye. The communication with the microcontroller is transparent @9600-8N1.

Here is my main code:

int main(void)
{
    InitClock(); // This is the PLL settings
    Init_UART1();// This is the UART Init values for 9600-8-N-1
    float states[6] = {0,0,0,0,0,0};
    // states [xn-2 xn-1 xn yn yn-1 yn-2]
    xn = 1.0; //the initial value
    
    while (1)
    {
        yn = 1.9842*yn1-yn2+0.0013*xn1+0.0013*xn2; // equation for the sine wave
        yn2 = yn1;
        yn1 = yn;
        xn2 = xn1;
        xn1 = xn;
        
        putc(0x03,stdout);
        //Here I want to send the xn to plot in MDV
        putc(0xFC,stdout);
        
    }
}

The variables in the equation

yn = 1.9842*yn1-yn2+0.0013*xn1+0.0013*xn2;

are with #define like this

#define xn  states[2]
#define xn1 states[1]
#define xn2 states[0]
#define yn  states[3]
#define yn1 states[4]
#define yn2 states[5]

The WriteUART1(0x03); and the WriteUART1(0xFC); are for Data Visualizer to see the first byte and the last byte. It is like the example on the Microchip video.

The question is: How can I manage the float yn to be plot by the Microchip Data Visualizer.

Thanks in advance.


Solution

  • Ok, here is the answer.

    A float number it is 32 bits long but you can't manage them bit by bit like int ones. So the way is to manage like a char.

    You have to make a pointer to a char, assign the address of the float to the pointer (casting the address, because char pointer isn't the same as float pointer). Then just send 4 bytes incrementing the char pointer.

    Here is the code:

    while (1)
    {
        yn = 1.9842 * yn1 - yn2 + 0.0013 * xn1 + 0.0013 * xn2; // sine recursive equation
        yn2 = yn1;
        yn1 = yn;
        xn2 = xn1;
        xn1 = xn;
        ptr = (char *) & yn; // This is the char pointer ptr saving the address of yn by casting it to char*, because &yn is float*
        putc(0x03,stdout); // the start frame for MPLABX Data Visualizer
        for (x = 0; x < sizeof(yn) ; x++) // with the for we go around the four bytes of the float
            putc(*ptr++,stdout); // we send every byte to the UART
        putc(0xFC,stdout); // the end frame for MPLABX Data Visualizer.
    }
    

    With this working, you have to config the data visualizer, your baudrate, and then select new streaming variable. You select a name, then Framing Mode you select One's complement, the start frame in this case 0x03 and the end frame 0xFC. Just name the variable and then type float32, press next, plot variable, finish and you have the variable in the MPLABX time plotter.

    Here is the image of the plot

    Hope, this helps someone.

    Regards.-