[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