Microseconds()

The function Microseconds() returns the number of microseconds (1 million microseconds = 1 second) that have elapsed since the computer was turned on. By calling Microseconds() and comparing its result to the last time you called Microseconds(), you can determine how much time has elapsed.

Microseconds() returns its results in an UnsignedWide data structure. This data structure consists of two 32-bit unsigned integer values that the operating system treats as a 64-bit integer. The problem with using the UnsignedWide data structure to calculate the elapsed time is that you must subtract the previous call to Microseconds() from the most recent call. Subtracting two UnsignedWide values is difficult because the UnsignedWide value is split into two components. An easier way to calculate the elapsed time is convert the UnsignedWide value to a double value. To do the conversion take the upper 32 bits and multiply it by the value (2 ^ 32) and add the lower 32 bits.

double ConvertMicrosecondsToDouble(UnsignedWidePtr microsecondsValue)
{ 
	double twoPower32 = 4294967296.0; 
	double doubleValue; 

	double upperHalf = (double)microsecondsValue->hi; 
	double lowerHalf = (double)microsecondsValue->lo; 

	doubleValue = (upperHalf * twoPower32) + lowerHalf; 
	return doubleValue;
}

After converting the UnsignedWide data structure to a double value, the math becomes easier. Just subtract the two double values to find the elapsed time.

double previousTime; 

double CalculateElapsedTime(void)
{ 
	UnsignedWide currentTime; 
	double currentTimeAsDouble; 

	Microseconds(&currentTime); 
	currentTimeAsDouble = ConvertMicrosecondsToDouble(&currentTime); 

	double elapsedTime = currentTimeAsDouble – previousTime; 

	// Convert elapsed time to seconds. 
	double oneMicrosecond = .000001; 
	double elapsedTimeInSeconds = elapsedTime * oneMicrosecond; 

	previousTime = currentTimeAsDouble; 
	return elapsedTimeInSeconds; 
}

Looking at the code, you can see that I converted the elapsed time from microseconds to seconds. The reason I did this conversion is because I assumed the velocity for moving objects is expressed in units per second. If you want to express the velocity in units per microsecond, you can avoid doing the conversion.

Next (UpTime)
Previous (Introduction)