<div dir="ltr">You're sending output to the serial port inside your loop, and the serial port is running at a synchronous 9600 baud. Much of your overhead and variation is coming from this.<div><br></div><div>In practice, if you need a fixed repetition, you either want to drive it by a clock-based interrupt, or else by using a much smaller delay/sleep call and checking often - but the moment you introduce other activity in that loop you're going to cause yourself pain.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 29 May 2023 at 16:50, Rhys Sage via Swlug <<a href="mailto:swlug@mailman.lug.org.uk">swlug@mailman.lug.org.uk</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Those are excellent points Colin. I did modify the C++ code to produce an average, high, low and maximum range between the high and low. When I stopped the code I had got up to a range of almost 300 microseconds.<br>
<br>
As far as I know, nothing else was running on the Arduino. I certainly didn't have anything bar that piece of test code. There is no actual clock on an Arduino. What it processes is some kind of system ticker. micros() seems to be built into micro c++. <br>
<br>
The suggestion to use an oscilloscope is a good one. Sadly I have almost no contacts here in the USA where I could borrow one and buying one for one project seems a bit excessive. I'm also not 100% sure what I'm looking for. I know they do have ways of making Arduinos and Picos into oscilloscopes but I'm not sure where the accuracy comes in or whether perhaps their accuracy is extremely limited. I just looked at this DIY version (<a href="http://instructables.com/Raspberry-Pi-Pico-200Khz-Digital-Oscilloscope/" rel="noreferrer" target="_blank">instructables.com/Raspberry-Pi-Pico-200Khz-Digital-Oscilloscope/</a>) and it just does not look like it's really accurate to the claimed 5 microseconds when I have already ascertained there seems to be a variation of at least 100 microseconds. It could be that the microsecond clock stalls while processes go and and is then updated by large chunks. <br>
<br>
I tried disabling interrupts and it had little effect.<br>
//#include <string.h><br>
unsigned long time; <br>
unsigned long time2; <br>
unsigned long time3;<br>
unsigned long calcu; <br>
unsigned long maximum;<br>
unsigned long minimum;<br>
unsigned long average; <br>
unsigned long range; <br>
unsigned long iterations; <br>
void setup() { <br>
   Serial.begin(9600); <br>
   maximum = 0;<br>
   minimum = 10000000;<br>
   average = 0;<br>
   iterations = 0;<br>
} <br>
<br>
<br>
void loop() { <br>
  noInterrupts();<br>
  iterations++;<br>
   Serial.println("Time:");<br>
   time = micros(); //prints time since program started<br>
   Serial.println(time); // wait a second so as not to send massive amounts of data<br>
   calcu = (time * 2);<br>
   time2 = micros();<br>
   time3 = (time2 - time);<br>
   if (time3 > maximum) maximum = time3;<br>
   if (time3 < minimum) minimum = time3;<br>
   average = ((minimum + maximum)/2);<br>
   range = maximum - minimum;<br>
   Serial.print("Minimum ");<br>
   Serial.println(minimum);<br>
   Serial.print("Maximum ");<br>
   Serial.println(maximum);<br>
   Serial.print("Average ");<br>
   Serial.println(average);<br>
   Serial.print("Range ");<br>
   Serial.println(range);<br>
   Serial.print("Iterations ");<br>
   Serial.println(iterations);<br>
   interrupts();<br>
   delay(1000); <br>
}<br>
<br>
Actual output.<br>
<br>
178186272<br>
Minimum 164<br>
Maximum 436<br>
Average 300<br>
Range 272<br>
Iterations 179<br>
<br>
It doesn't seem that disabling interrupts has had any noticeable effect.<br>
<br>
-- <br>
Swlug mailing list<br>
<a href="mailto:Swlug@mailman.lug.org.uk" target="_blank">Swlug@mailman.lug.org.uk</a><br>
<a href="https://mailman.lug.org.uk/mailman/listinfo/swlug" rel="noreferrer" target="_blank">https://mailman.lug.org.uk/mailman/listinfo/swlug</a><br>
</blockquote></div>