Arduino loop() Tid

Fra HTX Arduino
Spring til navigation Spring til søgning

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:

Osc.png

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


Arduino Elektrisk
Arduino Input Input - Input Høj-Lav - Input Strøm-Spænding - Input med intern Pull Up - Analogt - Analogt Input - Analog indgang - Arduino Reference Input - Input Tidsforhold - Specielle Input
Arduino Output Output - Output Høj-Lav - Output Strøm-Spænding - Analogt Output - Output Tidsforhold
Arduino Tidsforhold Arduino Reset Tid - Arduino setup() Tid - Arduino loop() Tid - Arduino Interrupt Tid - Arduino Tidsforhold Variabeltyper - Arduino Tidsforhold Sprogstrukturer - Input Tidsforhold - Output Tidsforhold - Serielle Tidsforhold