[Dprglist] Arduino Code Troubles

Rud Merriam rudmerriam at gmail.com
Fri Dec 17 18:39:08 PST 2021


Good to hear. Glad you found the problem.


-73 -
*Rud Merriam K5RUD*
/Mystic Lake Software/ <http://mysticlakesoftware.com/>

On 12/17/21 7:42 PM, Pat Caron via DPRGlist wrote:
> Thanks everyone for the help.  This is now working as expected.
> maxDistance was being overwritten to 0 in what I thought was a 
> disabled function.
>
> if ((cm[x] == 0) or (cm[x] > maxDistance)) {
>       cm[x] = 999;
>     }
> Output:
> --- Miniterm on /dev/ttyUSB-sensors  115200,8,N,1 ---
> --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
> maxDistance = 200
> cm[0] = 0
> cm[1] = 92
> cm[2] = 91
> cm[3] = 90
> cm[4] = 249
> | us_Left = 999cm | us_Mid = 92cm | us_Right = 91cm | ir_Left = 90cm | 
> ir_Right = 999cm | Time = 46mS
> ...Pat C.
>
> On Fri, Dec 17, 2021 at 8:16 PM Pat Caron <patcaron at mail.com 
> <mailto:patcaron at mail.com>> wrote:
>
>     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
>     <mailto: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 <mailto: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
>>             <mailto:dprglist at lists.dprg.org>> wrote:
>>
>>
>>                 From: Rud Merriam via DPRGlist
>>                 <dprglist at lists.dprg.org
>>                 <mailto:dprglist at lists.dprg.org>>
>>                 To: dprglist at lists.dprg.org
>>                 <mailto:dprglist at lists.dprg.org>
>>                 Cc: Rud Merriam <rudmerriam at gmail.com
>>                 <mailto: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
>>                 <mailto: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 <mailto:paradug at gmail.com>
>>                     *Sent: *Thursday, December 16, 2021 11:46 PM
>>                     *To: *Chris Netter <mailto:netterchris at gmail.com>
>>                     *Cc: *Pat Caron <mailto:patcaron at mail.com>;
>>                     dprglist at lists.dprg.org
>>                     <mailto: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
>>                     <mailto: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
>>                         <mailto:dprglist at lists.dprg.org>
>>                         *Sent: *Thursday, December 16, 2021 9:04 PM
>>                         *To: *dprglist at lists.dprg.org
>>                         <mailto: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
>>                         <mailto: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
>>                             <mailto: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
>>                                 <mailto: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
>>                                     <mailto:DPRGlist at lists.dprg.org>
>>                                     >
>>                                     http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>                                     <http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org>
>>                                     >
>>
>>                                     -- 
>>
>>                                     .........................................................................
>>                                     Murray Altheim <murray18 at
>>                                     altheim dot com>  = =  ===
>>                                     http://www.altheim.com/murray/
>>                                     <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
>>                                     <mailto:DPRGlist at lists.dprg.org>
>>                                     http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>                                     <http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org>
>>
>>                         _______________________________________________
>>                         DPRGlist mailing list
>>                         DPRGlist at lists.dprg.org
>>                         <mailto:DPRGlist at lists.dprg.org>
>>                         http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>                         <http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org>
>>
>>                     _______________________________________________
>>                     DPRGlist mailing list
>>                     DPRGlist at lists.dprg.org
>>                     <mailto:DPRGlist at lists.dprg.org>
>>                     http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>                     <http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org>
>>
>>
>>                 _______________________________________________
>>                 DPRGlist mailing list
>>                 DPRGlist at lists.dprg.org  <mailto:DPRGlist at lists.dprg.org>
>>                 http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org  <http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org>
>>
>>                 _______________________________________________
>>                 DPRGlist mailing list
>>                 DPRGlist at lists.dprg.org <mailto:DPRGlist at lists.dprg.org>
>>                 http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>                 <http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org>
>>                 _______________________________________________
>>                 DPRGlist mailing list
>>                 DPRGlist at lists.dprg.org <mailto:DPRGlist at lists.dprg.org>
>>                 http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>>                 <http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org>
>>
>>
>>             _______________________________________________
>>             DPRGlist mailing list
>>             DPRGlist at lists.dprg.org  <mailto:DPRGlist at lists.dprg.org>
>>             http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org  <http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org>
>             _______________________________________________
>             DPRGlist mailing list
>             DPRGlist at lists.dprg.org <mailto:DPRGlist at lists.dprg.org>
>             http://lists.dprg.org/listinfo.cgi/dprglist-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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dprg.org/pipermail/dprglist-dprg.org/attachments/20211217/53473c15/attachment.html>


More information about the DPRGlist mailing list