Go Down

Topic: From linear to exponential PWM output (Read 19 times) previous topic - next topic

backbone

Mitch,

New Mega is in and running.
To make sure the lookuptable at the MEGA is the same we send it as string to the Serial.print
Unfortunenatly if the lookuptable is put in the serial.print the serial monitor shows only square blocks.
When I replace lookuptable for X it nicely fills the string with numbers from 0 to 255.
Am I running into limitations or did I (we) misused a string for this?
As long as the arduino side is not sending the right info I cant get it at the VB pc side not receive and decode propperly.
Any thoughts?

Code: [Select]
void fillLookupTable()
{

/* write lookupTable to stream so it can be used at the PC side to show the exact lookuptable curve used in the graph */
  Serial.print("Y,");
  for (int i=0; i<256; i++)
  {
    Serial.print(lookupTable[i]);
    //Serial.print(i); //test to see if string is filled with numbers from 0 to 255
    if (i<255)
    {
      Serial.print("|"); //delimiter
    }
  }       
  Serial.println();
}   


Paco
Never to old to learn and I learn every day

Techylah

Hi Paco,
Yes.  Use  Serial.print(lookupTable [ i ] , HEX)   or   Serial.print(lookupTable [ i ] , DEC);
The whole 256 set of 8-bit characters includes control characters and other unprintable ones.
In general you don't put binary data into a string since any 0 will terminate it at that point.
You can put a space or return after each 2-digit hex or decimal number to help you read each one
on the VB pc side and, with a loop, put that number into an array of chars again.
Best,
Mitch

Techylah

Actually, I think the problem is how you are interpreting the incoming bytes on the PC side.
They are not supposed to be printable or viewable; they are binary.

The better way to send the lookuptable is as an array of bytes.
Serial.write(buf, len)    or specifically,
Serial.write(lookupTable, 256);

This also will appear to be unprintable box characters; That is proper.
When your VB code is expecting a lookuptable it should read, not a string, but an array of bytes 256 long.
It should read them right into the array of 256 chars.
This link might help.
http://snipplr.com/view/2012/
Keep us posted!

backbone

Mitch,

Got it working at VB6 side. (with some help)
Final problem was
0 to255 = 256 values where 0 to 254 = 255 values.
And if you send only 255 and you tell it to expect 256 you have a problem.... :smiley-mr-green:

I am now able this code to be shown in VB6 in the graph.
Code: [Select]
if (i < switchpointXValue)
                lookupTable[i] = map(i, deadbandXvalue, switchpointXValue, speedstartValue, switchpointYValue);


But this curve code is not yet visible.
Have to check if Arduino sends this also in serial monitor first, as I forgot whether it does or not.
Code: [Select]
else
                lookupTable[i] = (int)(0.5 + switchpointYValue + (255-switchpointYValue) * ( 1.0 - pow( (255-x)/(255-switchpointXValue), endCurvePower) ));


Still busy to get the shield working properly and also redesigned the buttons for the MENUWIZ(ard)
So some large rewrite of the program too.

Keep you U all posted.

Paco
Never to old to learn and I learn every day

Techylah

That code works only for those X values greater or = to switchPointX value, so you can't make that the whole lookuptable.
You have to leave it as just the upper part, as in response #93.

VB6 should alway display the whole lookuptable as a connected set of points, i.e. a line graph, or if that's too may points,
then only every N of them.

Go Up