[Dprglist] Arduino Code Troubles

John Swindle swindle at compuserve.com
Fri Dec 17 13:04:48 PST 2021


Bitwise conditionals have different rules than conditionals that evaluate an expression prior to applying the logic depending on the language.
Rud may have nailed it. I've been bitten by that difference in Matlab, Octave and FreeBASIC.
John Swindle

-----Original Message-----
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  
 
   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
 Sent: Thursday, December 16, 2021 11:46 PM
 To: Chris Netter
 Cc: Pat Caron; 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
 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 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/3fdc1216/attachment.html>


More information about the DPRGlist mailing list