Forum: Mikrocontroller und Digitale Elektronik rollover save repetition timer


von chris_ (Gast)


Lesenswert?

Hier gibt es einen Beitrag für einen Timer mit konstanter Verzögerung.

Beitrag "Re: rollover save timer in c"

Ich möchte aber in einer Polling-Schleife einen Periodischen Event mit 
einer bestimmten Wiederholrate auslösen.

Dazu hier der erste Code-Vorschlag
1
uint16_t NextTime;
2
3
// place this line in setup
4
NextTime = micros();
5
6
// place this code in the loop
7
uint16_t   rate_us=100;
8
9
if( (uint16_t) (micros() - nextTime) < rate_us)
10
{
11
  nextTime += rate_us;
12
  /* place here the repetion code 
13
   * ....
14
   */
15
}

Welche Vor- und Nachteile seht Ihr?

von chris_ (Gast)


Lesenswert?

Tja, da waren wohl ein paar kleine Fehlerchen.

Hier der Testcode für einen Arduino:
1
uint32_t startTime;
2
uint32_t rate_us=1000000L;
3
4
uint16_t testCounter = 0;
5
6
7
void setup()
8
{
9
  startTime = micros();
10
  Serial.begin(9600);
11
}
12
13
void loop()
14
{
15
  if ( ((uint32_t) micros())-startTime  >= rate_us)
16
  {
17
    startTime += rate_us;
18
19
    // test code
20
    testCounter++;
21
    Serial.println(micros());
22
  }
23
}

Man kann am Serial.Print sehen, wie die Ausführungszeit um ein paar 
Mikrosekunden schwankt.

von beric (Gast)


Lesenswert?

chris_ schrieb:
> Man kann am Serial.Print sehen, wie die Ausführungszeit um ein paar
> Mikrosekunden schwankt.

Könnte das nicht an Serial.Println selber liegen (der u.U. vielleicht 
mal ein paar us mehr oder weniger braucht)?

von chris_ (Gast)


Lesenswert?

>Könnte das nicht an Serial.Println selber liegen (der u.U. vielleicht
>mal ein paar us mehr oder weniger braucht)?

Ich denke schon.
Serial.Println arbeitet mit einem StreamBuffer und die Zeichen werden in 
einer Interrupt-Routine gesendet.
Für bestimmte Anwendungsfälle kann ein minimaler Jitter ja zulässig 
sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.