[Dprglist] Arduino Code Troubles

markus markus at bibi.ca
Fri Dec 17 09:08:18 PST 2021


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
> >
> >
> >  



More information about the DPRGlist mailing list