Skip to content

value of elapsedMillis object not an unsigned long? #14

@paynterf

Description

@paynterf

I am having problems printing elapsedMillis object values to the serial port in Arduino avr code, and it appears that this is caused by the object not returning an unsigned long value. The following is a small program to illustrate the problem:

/*
    Name:       PrintEx_ElapsedMillis.ino
    Created:	8/14/2020 9:47:31 AM
    Author:     FRANKNEWXPS15\Frank
*/

#include <elapsedMillis.h>
#include <print.h> //allows printf-style printout syntax

elapsedMillis sinceLastCheckMsec = 0;

void setup()
{
  Serial.begin(115200);
  sinceLastCheckMsec = 0;

  Serial.printf("small program to demonstrate problems with modified Print.h\n");
  Serial.printf("Printing out value of an 'elapsedMillis' object sinceLastCheckMsec, with & without chaining\n");
  Serial.printf("Printing out return value from millis(), with & without chaining\n");
  Serial.println();

  Serial.printf("sinceLastCheckMsec no chaining, no cast: %lu\n", sinceLastCheckMsec);

  Serial.printf("sinceLastCheckMsec no chaining, cast to (unsigned long): %lu\n", (unsigned long)sinceLastCheckMsec);

  Serial.printf("chaining: millis = %lu\tsinceLastCheckMsec (cast to unsigned long): %lu\n", millis(), (unsigned long)sinceLastCheckMsec);

  Serial.printf("chaining: millis: %lu\tsinceLastCheckMsec (no cast): %lu\tsinceLastCheckMsec (cast to unsigned long): %lu\tsinceLastCheckMsec (cast to uint32_t): %lu\n",
    millis(), sinceLastCheckMsec, (unsigned long)sinceLastCheckMsec, (uint32_t)sinceLastCheckMsec);

  Serial.printf("chaining: millis: %lu\tsinceLastCheckMsec (cast to unsigned long): %lu\tsinceLastCheckMsec (no cast): %lu\tsinceLastCheckMsec (cast to uint32_t): %lu\n",
    millis(), (unsigned long)sinceLastCheckMsec, sinceLastCheckMsec, (uint32_t)sinceLastCheckMsec);

  Serial.printf("ms: %lu\tChk: %lu\tChk:: %lu\tChk: %lu\n",
    millis(), (unsigned long)sinceLastCheckMsec, sinceLastCheckMsec, (uint32_t)sinceLastCheckMsec);

  Serial.printf("chaining: millis: %lu\tsinceLastCheckMsec (cast to unsigned long): %lu\tmillis: %lu\tsinceLastCheckMsec (cast to unsigned long): %lu\n",
    millis(), (unsigned long)sinceLastCheckMsec, millis(), (unsigned long)sinceLastCheckMsec);
}

void loop()
{
}

When this is run on an Arduino Mega, I get the following output:

Opening port
Port open
small program to demonstrate problems with modified Print.h
Printing out value of an 'elapsedMillis' object sinceLastCheckMsec, with & without chaining
Printing out return value from millis(), with & without chaining

sinceLastCheckMsec no chaining, no cast: 92217847
sinceLastCheckMsec no chaining, cast to (unsigned long): 17
chaining: millis = 22	sinceLastCheckMsec (cast to unsigned long): 22
chaining: millis: 28	sinceLastCheckMsec (no cast): 1843703	sinceLastCheckMsec (cast to unsigned long): 1835008	sinceLastCheckMsec (cast to uint32_t): 0
chaining: millis: 41	sinceLastCheckMsec (cast to unsigned long): 41	sinceLastCheckMsec (no cast): 2695671	sinceLastCheckMsec (cast to uint32_t): 92209152
ms: 55	Chk: 55	Chk:: 3613175	Chk: 0
chaining: millis: 58	sinceLastCheckMsec (cast to unsigned long): 58	millis: 58	sinceLastCheckMsec (cast to unsigned long): 58

I looked at the ellapsedMillis code, but I can't for the life of me see why a reference to an elapsedMillis object doesnt return an 'unsigned long' object, but I'm pretty sure that's what is happening. I use elapsedMillis objects a lot, and it would be nice if I didn't have to remember to always explicitely cast references to 'unsigned long'.

TIA

Frank

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions