I have been looking at this for hours and can't figure it out... Take the following code I ran on an Arduino Mega:
#define MINUTES 0
#define SECONDS 1
#define MILLIS 2
#define DEFAULT_SELECTED_TURN_DELAY 0, 45, 0
unsigned long calculate_ms(int , int , int );
int selected_turn_delay[3] = { DEFAULT_SELECTED_TURN_DELAY };
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("Values of selected_turn_delay:");
Serial.print("minutes: ");
Serial.println(selected_turn_delay[MINUTES]);
Serial.print("seconds: ");
Serial.println(selected_turn_delay[SECONDS]);
Serial.print("milliseconds: ");
Serial.println(selected_turn_delay[MILLIS]);
unsigned long result = calculate_ms(selected_turn_delay[MINUTES], selected_turn_delay[SECONDS], selected_turn_delay[MILLIS]);
unsigned long result1 = calculate_ms(selected_turn_delay[MINUTES], selected_turn_delay[SECONDS], selected_turn_delay[MILLIS]);
unsigned long result2 = calculate_ms(0,45,0);
unsigned long result3 = calculate_ms(0,30,0);
unsigned long result4 = calculate_ms(0,31,0);
unsigned long result5 = calculate_ms(0,32,0);
unsigned long result6 = calculate_ms(0,33,0);
unsigned long result7 = calculate_ms(0,34,0);
}
void loop() {
}
unsigned long calculate_ms(int minutes, int seconds, int milliseconds) {
Serial.println("------------");
Serial.println("In calculate_ms");
Serial.println("------------");
unsigned long calculated_total_milliseconds = 0;
unsigned long minute_to_seconds = 0;
unsigned long seconds_to_ms = 0;
Serial.println("Input:");
Serial.print("minutes: ");
Serial.println(minutes);
Serial.print("seconds: ");
Serial.println(seconds);
Serial.print("milliseconds: ");
Serial.println(milliseconds);
calculated_total_milliseconds = (milliseconds + (seconds * 1000) + ((minutes * 60) * 1000));
Serial.print("Calculates ms:");
Serial.println(calculated_total_milliseconds);
return(calculated_total_milliseconds);
}
It gives me the following results:
Values of selected_turn_delay:
minutes: 0
seconds: 45
milliseconds: 0
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 45
milliseconds: 0
Calculates ms:4294946760
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 45
milliseconds: 0
Calculates ms:4294946760
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 45
milliseconds: 0
Calculates ms:4294946760
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 30
milliseconds: 0
Calculates ms:30000
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 31
milliseconds: 0
Calculates ms:31000
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 32
milliseconds: 0
Calculates ms:32000
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 33
milliseconds: 0
Calculates ms:4294934760
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 34
milliseconds: 0
Calculates ms:4294935760
What am I missing why is the calculation for values above 32s out of wack ?
Tried the same code adapted for gcc:
#include <stdio.h>
#define MINUTES 0
#define SECONDS 1
#define MILLIS 2
#define DEFAULT_SELECTED_TURN_DELAY 0, 45, 0
unsigned long calculate_ms(int , int , int );
int selected_turn_delay[3] = { DEFAULT_SELECTED_TURN_DELAY };
int main(void) {
printf("Values of selected_turn_delay:\n");
printf("minutes: ");
printf("%d\n",selected_turn_delay[MINUTES]);
printf("seconds: ");
printf("%d\n",selected_turn_delay[SECONDS]);
printf("milliseconds: ");
printf("%d\n",selected_turn_delay[MILLIS]);
unsigned long result = calculate_ms(selected_turn_delay[MINUTES], selected_turn_delay[SECONDS], selected_turn_delay[MILLIS]);
unsigned long result1 = calculate_ms(selected_turn_delay[MINUTES], selected_turn_delay[SECONDS], selected_turn_delay[MILLIS]);
unsigned long result2 = calculate_ms(0,45,0);
unsigned long result3 = calculate_ms(0,30,0);
unsigned long result4 = calculate_ms(0,31,0);
unsigned long result5 = calculate_ms(0,32,0);
unsigned long result6 = calculate_ms(0,33,0);
unsigned long result7 = calculate_ms(0,34,0);
}
unsigned long calculate_ms(int minutes, int seconds, int milliseconds) {
printf("------------\n");
printf("In calculate_ms\n");
printf("------------\n");
unsigned long calculated_total_milliseconds = 0;
unsigned long minute_to_seconds = 0;
unsigned long seconds_to_ms = 0;
printf("Input:\n");
printf("minutes: ");
printf("%d\n",minutes);
printf("seconds: ");
printf("%d\n",seconds);
printf("milliseconds: ");
printf("%d\n",milliseconds);
calculated_total_milliseconds = (milliseconds + (seconds * 1000) + ((minutes * 60) * 1000));
printf("Calculates ms:");
printf("%lu\n",calculated_total_milliseconds);
return(calculated_total_milliseconds);
}
And it works great:
Values of selected_turn_delay:
minutes: 0
seconds: 45
milliseconds: 0
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 45
milliseconds: 0
Calculates ms:45000
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 45
milliseconds: 0
Calculates ms:45000
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 45
milliseconds: 0
Calculates ms:45000
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 30
milliseconds: 0
Calculates ms:30000
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 31
milliseconds: 0
Calculates ms:31000
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 32
milliseconds: 0
Calculates ms:32000
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 33
milliseconds: 0
Calculates ms:33000
------------
In calculate_ms
------------
Input:
minutes: 0
seconds: 34
milliseconds: 0
Calculates ms:34000
It has to be something obvious, but I can't find it...