[Dprglist] Arduino Code Troubles

Pat Caron patcaron at mail.com
Fri Dec 17 12:20:49 PST 2021


Thanks Marcus, when I test the code in the function only, it works, but in
my program it fails as shown.
I am trying to get debugging working in Platformio on the nano.
...Pat C.

On Fri, Dec 17, 2021 at 12:08 PM markus <markus at bibi.ca> wrote:

> Hi Pat,
>
> looking at your code, whatever goes wrong doesn't seem to be in the
> code snippet you sent. In my experience there is either
> an ISR messing up the memory or you run into a stack corruption.
>
>  Can you check the memory usage, static and dynamic and see if
> you have a stack overrun?
>
> I would recommend running the program in the debugger and setting a
> breakpoint right on the "if" condition of the first loop where you
> assign the 999. Check the entire array on each iteration.
>
> If the array still looks correct on the last iteration, step through
> the second loop and check the values.
>
> Interesting problem, please keep us posted with any findings.
>
> On Fri, 17 Dec 2021 11:13:47 -0500
> Pat Caron via DPRGlist <dprglist at lists.dprg.org> 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
> > >
> > >
> > >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dprg.org/pipermail/dprglist-dprg.org/attachments/20211217/c98de0df/attachment.html>


More information about the DPRGlist mailing list