[Dprglist] Arduino Code Troubles

Pat Caron patcaron at mail.com
Fri Dec 17 17:16:59 PST 2021


I did another quick test removing the cm[x] == 0 condition & leaving the >
200 instead of maxDistance.
if ((cm[x] > 200)) {
      cm[x] = 999;
    }
This also worked as expected.
Output:
--- Miniterm on /dev/ttyUSB-sensors  115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
cm[0] = 0
cm[1] = 92
cm[2] = 91
cm[3] = 90
cm[4] = 248
| us_Left = 0cm | us_Mid = 92cm | us_Right = 91cm | ir_Left = 90cm |
ir_Right = 999cm | Time = 46mS

I then put maxDistance back in without the cm[x] == 0 and it failed!
if ((cm[x] > maxDistance)) {
      cm[x] = 999;
    }
--- Miniterm on /dev/ttyUSB-sensors  115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
cm[0] = 0
cm[1] = 93
cm[2] = 91
cm[3] = 90
cm[4] = 250
| us_Left = 0cm | us_Mid = 999cm | us_Right = 999cm | ir_Left = 999cm |
ir_Right = 999cm | Time = 46mS

...Pat C.

On Fri, Dec 17, 2021 at 7:34 PM Pat Caron <patcaron at mail.com> wrote:

> So I did a quick test removing the second condition
>
> if ((cm[x] == 0)) { // or (cm[x] > maxDistance)) {
>       cm[x] = 999;
>     }
>
> This is working!  Now I need to find out why the > maxDistance condition
> is causing the failure.
> Output:
> --- Miniterm on /dev/ttyUSB-sensors  115200,8,N,1 ---
> --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
> cm[0] = 0
> cm[1] = 93
> cm[2] = 91
> cm[3] = 90
> cm[4] = 252
> | us_Left = 999cm | us_Mid = 93cm | us_Right = 91cm | ir_Left = 90cm |
> ir_Right = 252cm | Time = 46mS
>
> On Fri, Dec 17, 2021 at 5:35 PM Rud Merriam via DPRGlist <
> dprglist at lists.dprg.org> wrote:
>
>> Okay, so we know it is happening in the handling of the conditional. Run
>> it twice. Once with the test for maxDistance removed and once with the test
>> for equality removed. Also, add a print out of *maxDistance*. Need to
>> make sure it is not being changed although the test with '200' there should
>> show it isn't.
>>
>> If you get the same results I'm going to start drinking.
>>
>> Actually, I'll start wondering about the build process. I'm not familiar
>> with PlatformIO. The Arduino IDE takes all the files, rearranges them, and
>> then compiles the resulting file. That's unlike most C++ build systems. The
>> "rearranging" can lead to some strange issues.
>>
>> -73 -
>> *Rud Merriam K5RUD*
>> *Mystic Lake Software* <http://mysticlakesoftware.com/>
>>
>> On 12/17/21 3:18 PM, Pat Caron via DPRGlist wrote:
>>
>> Here is the output from Rud's changes:
>>
>> --- Miniterm on /dev/ttyUSB-sensors  115200,8,N,1 ---
>> --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
>> cm[0] = 0 0 999 999
>> cm[1] = 95 95 999 999
>> cm[2] = 91 91 999 999
>> cm[3] = 84 84 999 999
>> cm[4] = 251 251 999 999
>> cm[0] = 0 0 999 999
>> ...Pat C.
>>
>> On Fri, Dec 17, 2021 at 4:04 PM John Swindle via DPRGlist <
>> dprglist at lists.dprg.org> wrote:
>>
>>>
>>> From: Rud Merriam via DPRGlist <dprglist at lists.dprg.org>
>>> To: dprglist at lists.dprg.org
>>> Cc: Rud Merriam <rudmerriam at gmail.com>
>>> Sent: Fri, Dec 17, 2021 2:35 pm
>>> Subject: Re: [Dprglist] Arduino Code Troubles
>>>
>>> Obviously somethine strange happening. Grasping at a straw try replacing
>>> the 'or' in the conditional with '||'. It shouldn't make a difference
>>> but....
>>> Started to make othere suggestions to localize the problem but to much
>>> verbiage. Here is what I would try:
>>>
>>>   for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {
>>>     Serial.print("cm[");
>>>     Serial.print(x);
>>>     Serial.print("] = ");
>>>     Serial.print(cm[x]);
>>>     Serial.print(" ");
>>>
>>>     if ((cm[x] == 0) || (cm[x] > maxDistance)) {
>>>       Serial.print(cm[x]);	//
>>>       Serial.print(" ");
>>>
>>>       cm[x] = 999;
>>>
>>>       Serial.print(cm[x]);	//
>>>       Serial.print(" ");
>>>
>>>     }
>>>
>>>     Serial.println(cm[x]);
>>>   }
>>>
>>>
>>>
>>> -73 -
>>> *Rud Merriam K5RUD*
>>> *Mystic Lake Software* <http://mysticlakesoftware.com/>
>>>
>>> On 12/17/21 10:13 AM, Pat Caron via DPRGlist wrote:
>>>
>>>
>>> What I meant to say last night is the array size is cm[8].  The values
>>> for SONAR_NUM == 3 and IR_NUM == 2
>>> This should not be overrunning the array as it only loops through 5
>>> times.
>>> I have tried setting maxDistance as uint32_t without any difference.
>>> I have commented out the sendData() function and added some Serial.print
>>> statements prior to reassigning the values. (shown in output)
>>>
>>> #define SONAR_NUM 3
>>> #define IR_NUM 2
>>> uint32_t cm[8] = {0,0,0,0,0,0,0,0}; // Create array
>>> uint16_t maxDistance = 200; // Also used with NewPing.h libraray
>>> char *position[] = {"us_Left", "us_Mid", "us_Right", "ir_Left",
>>> "ir_Right", "cm[5]", "cm[6]", "cm[7]"};
>>> .
>>> . // Other code here
>>> .
>>>
>>> void oneSensorCycle() { // Sensor ping cycle complete, do something with
>>> the results.
>>>   for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {
>>>     Serial.print("cm[");
>>>     Serial.print(x);
>>>     Serial.print("] = ");
>>>     Serial.println(cm[x]);
>>>     if ((cm[x] == 0) or (cm[x] > maxDistance)) {
>>>       cm[x] = 999;
>>>     }
>>>   }
>>>   if (troubleshoot) {
>>>     for (uint8_t i = 0; i < (SONAR_NUM + IR_NUM); i++) {
>>>       Serial.print("| ");
>>>       Serial.print(position[i]);
>>>       Serial.print(" = ");
>>>       Serial.print(cm[i]);
>>>       Serial.print("cm ");
>>>     }
>>>     Serial.print("| ");
>>>     Serial.print("Time = ");
>>>     Serial.print(elapsedMillis);
>>>     Serial.print("mS");
>>>     Serial.println();
>>>   }
>>>   //else {
>>>   //  sendData();
>>>   //}
>>> }
>>>
>>>
>>> Loop() {
>>>   .// other code
>>>   oneSensorCycle()
>>>   . // more code
>>> }
>>>
>>> Serial output:
>>>
>>> -- Miniterm on /dev/ttyUSB-sensors  115200,8,N,1 ---
>>> --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
>>> cm[0] = 0
>>> cm[1] = 95
>>> cm[2] = 91
>>> cm[3] = 85
>>> cm[4] = 246
>>> | us_Left = 999cm | us_Mid = 999cm | us_Right = 999cm | ir_Left = 999cm
>>> | ir_Right = 999cm | Time = 44mS
>>>
>>> ...Pat C
>>>
>>>
>>> On Fri, Dec 17, 2021 at 10:07 AM Chris Netter <netterchris at gmail.com>
>>> wrote:
>>>
>>> The for loop stops at x < 8, so it won’t overrun.
>>>
>>> What if you remove the sendData() call?  Does that help?
>>>
>>> Also,  make sure you have declared any global variables which are
>>> modified by interrupts or other tasks as “volatile”, otherwise the compile
>>> may decide to optimize away parts of your code.
>>>
>>> Chris
>>>
>>> *From: *Doug Paradis <paradug at gmail.com>
>>> *Sent: *Thursday, December 16, 2021 11:46 PM
>>> *To: *Chris Netter <netterchris at gmail.com>
>>> *Cc: *Pat Caron <patcaron at mail.com>; dprglist at lists.dprg.org
>>> *Subject: *Re: [Dprglist] Arduino Code Troubles
>>>
>>> Pat,
>>>     for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {
>>>
>>>     If  SONAR_NUM _ IR_NUM = 8 then you are overrunning the array which
>>> goes 0 to 7.
>>>
>>> Regards,
>>> Doug P.
>>>
>>> On Thu, Dec 16, 2021 at 8:53 PM Chris Netter via DPRGlist <
>>> dprglist at lists.dprg.org> wrote:
>>>
>>> So Markus and Karim already pointed out that the original code snipped
>>> works as designed.
>>>
>>> It’s also been pointed out already that you are mixing data types. I
>>> don’t think that’s the issue, but worth trying to make both the array and
>>> maxDistance uint16_t
>>>
>>> As for this new code snippet:
>>>
>>> I don’t see any obvious issue with the for loop.  Are you positive that SONAR_NUM
>>> + IR_NUM == 8 ?   if not, you are overshooting the array and that can cause
>>> all kinds of non-obvious issues.
>>>
>>> Also, what does sendData() do?  Could it have some side-effects?   Maybe
>>> its causing a stack overflow, array bounds overflow, or similar, which in
>>> turn causes non-obvious issues?
>>>
>>>
>>>
>>> *From: *Pat Caron via DPRGlist <dprglist at lists.dprg.org>
>>> *Sent: *Thursday, December 16, 2021 9:04 PM
>>> *To: *dprglist at lists.dprg.org
>>> *Subject: *Re: [Dprglist] Arduino Code Troubles
>>>
>>> Hi guys, here is a better example to show what is happening taken from
>>> actual code:
>>>
>>> .... other code
>>>   for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {  // SONAR_NUM +
>>> IR_NUM = 8
>>>     if ((cm[x] == 0) || (cm[x] > maxDistance)) {
>>>       cm[x] = 999;
>>>     }
>>>   sendData();
>>>   }
>>>
>>> Printed values cm[0] to cm[5] (us_Left to ir_Right) without the above if
>>> statement
>>> | us_Left = 0cm | us_Mid = 95cm | us_Right = 51cm | ir_Left = 84cm |
>>> ir_Right = 252cm | Time = 45mS
>>>
>>> Printed values cm[0] to cm[5] with the above if statement
>>> \| us_Left = 999cm | us_Mid = 999cm | us_Right = 999cm | ir_Left = 999cm
>>> | ir_Right = 999cm | Time = 44mS
>>>
>>> ...Pat C
>>>
>>> On Thu, Dec 16, 2021 at 8:45 PM Karim Virani <pondersome64 at gmail.com>
>>> wrote:
>>>
>>> It's doing what it's coded to do
>>>
>>> On Thu, Dec 16, 2021 at 7:42 PM Pat Caron via DPRGlist <
>>> dprglist at lists.dprg.org> wrote:
>>>
>>> Hi Murray, I did try that with the same results.  NewPing.h library is
>>> looking for a uint16_t although it didn't complain when I tried that.
>>>
>>> ...Pat C
>>>
>>> On Thu, Dec 16, 2021 at 8:35 PM Murray Altheim via DPRGlist <
>>> dprglist at lists.dprg.org> wrote:
>>>
>>> Hi Pat,
>>>
>>> What if you define maxDistance as uint32_t?
>>>
>>> Cheers,
>>>
>>> Murray
>>>
>>> On 17/12/21 2:27 pm, Pat Caron via DPRGlist wrote:
>>> > Hi guys, I'm looking for help with the following Arduino code.
>>> >
>>> >      uint32_t cm[8] = {0,0,0,0,0,0,0,0}; // Create array
>>> >      uint16_t maxDistance = 200; // Also used with NewPing.h library
>>> >      .
>>> >      . // Other code here
>>> >      .
>>> >      irSensorL.read(); // Read IR sensor... This is working!
>>> >      cm[3] = irSensorL.ranging_data.range_mm/10; // This returns 268
>>> >      if (cm[3] > maxDistance) {
>>> >        cm[3] = 999;                 /
>>> >      }
>>> >      Serial.println(cm[3]);  / cm[3] value is always = 999
>>> >      sendData();
>>> >
>>> > The cm[3] value is always 999 when I run this.
>>> > If I comment out the if cm[3]... statement cm[3] value is then 268.
>>> >
>>> > ...Pat C
>>> >
>>> > _______________________________________________
>>> > DPRGlist mailing list
>>> > DPRGlist at lists.dprg.org
>>> > http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>> >
>>>
>>> --
>>>
>>> .........................................................................
>>> Murray Altheim <murray18 at altheim dot com>                       = =
>>> ===
>>> http://www.altheim.com/murray/                                     ===
>>> ===
>>>                                                                     = =
>>> ===
>>>      In the evening
>>>      The rice leaves in the garden
>>>      Rustle in the autumn wind
>>>      That blows through my reed hut.
>>>             -- Minamoto no Tsunenobu
>>>
>>> _______________________________________________
>>> DPRGlist mailing list
>>> DPRGlist at lists.dprg.org
>>> http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>>
>>> _______________________________________________
>>> DPRGlist mailing list
>>> DPRGlist at lists.dprg.org
>>> http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>>
>>>
>>> _______________________________________________
>>> DPRGlist mailing list
>>> DPRGlist at lists.dprg.org
>>> http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>>
>>>
>>>
>>> _______________________________________________
>>> DPRGlist mailing listDPRGlist at lists.dprg.orghttp://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>>
>>> _______________________________________________
>>> DPRGlist mailing list
>>> DPRGlist at lists.dprg.org
>>> http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>> _______________________________________________
>>> DPRGlist mailing list
>>> DPRGlist at lists.dprg.org
>>> http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>>
>>
>> _______________________________________________
>> DPRGlist mailing listDPRGlist at lists.dprg.orghttp://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>
>> _______________________________________________
>> DPRGlist mailing list
>> DPRGlist at lists.dprg.org
>> http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dprg.org/pipermail/dprglist-dprg.org/attachments/20211217/37569f5f/attachment.html>


More information about the DPRGlist mailing list