Arduino loop() Tid
loop() funktionen bruges til at gentage kode mange gange. Den er stort set uundværlig lige meget, hvilket program man laver, da det er den eneste funktion der bliver kaldt ud over setup().
Når man bruger den, skal man dog til tider tage højde for små forsinkelse der opstår når loop() når til bunden af funktionen og skal op i toppen af funktionen igen.
Tid
Dette program kan bruges til at tjekke, hvor lang tid det tager for loop() at komme fra slutningen af funktionen til starten igen. Det er svært hvis ikke umuligt at skrive denne værdi ud i den serielle monitor, da aduinosprogets(C/C++) micros() funktion, som bruges til at måle mikrosekunder siden programmet startede, ikke er præcis nok. Man kan i stedet sætte et oscilloskop til, og give programmet nogle opgaver der gør oscilloskopets graf læsbar, og det er præcis det dette program gør.
Det eneste det består af er, at der tændes og slukkes for to bit. Oscilloskopet giver udsving når dette sker og den resterende tid, hvor grafen ikke foretager sig noget, må derfor være tiden det tager for loop() at starte forfra.
void setup() {
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
}
void loop() {
PORTD |= 0xC0; //Tænder to bits
PORTD &= 0x3F; //Slukker to bits
}
Når man sætter oscilloskopet til, får man en graf der ser således ud:
På grafen er der to stiplede linjer sat ind. Tiden det tager for loop() at starte forfra er tiden mellem disse to linjer. Dette står der på målingen er 0.44 μs (mikrosekunder), hvilket svarer til 7 maskininstruktioner.
Det er en meget lille forsinkelse, og det vil tage rigtig lang tid før at disse 0.44 μs kommer til at give en samlet forsinkelse på et sekund. Dog vil det have en betydning for visse programmer over tid, hvis man for eksempel laver et ur eller andet der udnytter den samlede tid gennem koden, med mindre man også regner loopets genstartstid med i den samlede tid. Er det fx. et ur vil det resulterer i, at uret langsomt vil komme bagefter det rigtige klokkeslet.
Alternativt kan man køre tidsudmålingen vha. millis(), som baserer sig på timer-interruptet, så det er lige så præcist som arduinoens klock-frekvens.
Referencer