micros() Timer auf Null stellen (Arduino)

Gast #5760706
Lesenswert?

micros schrieb:
> Das würde mir in einem speziellen Fall, laufende
> Differenzzeitbestimmung eines Prozesses, die Arbeit etwas erleichtern.
Das glaube ich nicht!

Warum sollte das so sein?



micros schrieb:
> Gibt es eine sichere Methode ohne Nebeneffekte, den micros() Timer auf
> Null zu stellen?
Ein solcher Eingriff hat Nebenwirkungen (auf alles was micros() und 
millis() nutzt). Selbst die PWM Ausgabe bekommt Hackler.
Sollte man also möglichst unterlassen.
#5760733
Lesenswert?

micros schrieb:
> Gibt es eine sichere Methode ohne Nebeneffekte, den micros() Timer auf
> Null zu stellen?

Nein. Vieles basiert auf timer0_millis.

> Das würde mir in einem speziellen Fall, laufende
> Differenzzeitbestimmung eines Prozesses, die Arbeit etwas erleichtern.

Echt

while(1)
{
  start=millis();
  :
  time=millis()-start;
}

möchtest du durch

void resetmillis(void)
{
  timer0_millis=timer0_fract=0;
}

while(1)
{
  resetmillis();
  :
  time=millis();
}

ersetzen. Klingt aufwändiger.

Das passiert normalerweise in einer Schleife und geht sowieso einfacher

stop=millis();
while(1)
{
  start=stop;
  :
  stop=millis();
  time=stop-start;
}
Gast #5760798
Lesenswert?

An den Überlauf nach ~ 70 Sekunden dachtet ihr gar nicht?

Gut, in meinem Fall neutralisierte er sich. Wie so oft. Wußte ich aber 
eben noch nicht.

Die Routine ist zeitkritisch, ISR. Wollte die int32-Arithmetik etwas 
verkürzen. Aber es läuft (natürlich) auch so noch schnell genug.

OK. Danke an alle :-)


Frage noch:
timer0_millis hatte ich vorher schon ergoogelt. War aber irgendwie nicht 
ansprechbar, so dass ich dann das Posting hier abgesetzt habe.

Was ist timer0_millis für ein Konstrukt ?
1
void setup() {
2
  Serial.begin(9600);
3
  Serial.println(timer0_millis);
4
}
5

6
void loop() {
7
}
Gast #5760825
Lesenswert?

micros schrieb:
> timer0_millis hatte ich vorher schon ergoogelt. War aber irgendwie nicht
> ansprechbar, so dass ich dann das Posting hier abgesetzt habe.
>
> Was ist timer0_millis für ein Konstrukt ?
1
extern unsigned long timer0_millis;
2

3
void setup() 
4
{
5
  Serial.begin(9600);
6
  Serial.println(timer0_millis);
7
}
8

9
void loop() 
10
{
11
 Serial.println(timer0_millis);
12
 delay(500);
13
}

Vorsicht!
Das auslesen und beschreiben von timer0_millis sollte (anders, als hier 
gezeigt) atomar erfolgen!



micros schrieb:
> An den Überlauf nach ~ 70 Sekunden dachtet ihr gar nicht?
Warum?
Der ist doch unabwendbar.

micros schrieb:
> Gut, in meinem Fall neutralisierte er sich. Wie so oft. Wußte ich aber
> eben noch nicht.
Siehst du, so schlimm ist der Überlauf doch gar nicht... :-)
Gast #5761042
Lesenswert?

micros schrieb:
> An den Überlauf nach ~ 70 Sekunden dachtet ihr gar nicht?

Doch. Der Trick liegt in der Subtraktion, denn sie liefert nach einem 
Überlauf immer noch ein korrektes Ergebnis. Nur bei mehr als einem 
Überlauf klappt das nicht mehr, aber dann wäre die Zählvariable so oder 
so zu klein.

Manche Leute versuchen es anders herum mit einer Addition, das klappt 
aber nicht:
1
uint32t timeout=millis()+10000;
2
while (millis()<timeout)
3
{
4
    doSomething();
5
}

Bitte nicht nachmachen!
Gast #5761851
Lesenswert?

> extern unsigned long timer0_millis;

>>extern teilt dem Compiler mit, dass sich die Variable in einer anderen
Übersetzungseinheit befindet.


und zwar genau in:
wiring.c
deklariert als
volatile unsigned long timer0_millis = 0;

gefunden über:
1
arduino$ grep -r 'timer0_millis' *
2
hardware/arduino/avr/cores/arduino/wiring.c:  unsigned long m = timer0_millis;
(Linux Bash)(aber über CygwinKannManJaAuch)
#5761864
Lesenswert?

extern schrieb:
>> extern unsigned long timer0_millis;
>
>>>extern teilt dem Compiler mit, dass sich die Variable in einer anderen
> Übersetzungseinheit befindet.
>
>
> und zwar genau in:
> wiring.c
> deklariert als
> volatile unsigned long timer0_millis = 0;
>
> gefunden über:
>
1
> arduino$ grep -r 'timer0_millis' *
2
> hardware/arduino/avr/cores/arduino/wiring.c:  unsigned long m = 
3
> timer0_millis;
4
>
> (Linux Bash)(aber über CygwinKannManJaAuch)

Wow, in Eclipse drücke ich F3 wenn der Cursor auf dem Variablennamen ist 
und springe direkt zur Definition. Aber klar, man kann auch über bash 
Befehle gehen....

Aber woher sollen Arduinos auch eine ordentliche Entwicklungsumgebung 
kennen. Armselig.
#5762021
Lesenswert?

Stefanus F. schrieb:
> Cyblord -. schrieb:
>> Aber woher sollen Arduinos auch eine ordentliche Entwicklungsumgebung
>> kennen. Armselig.
>
> Eclipse ist allerdings auch nicht gerade ein leuchtendes Vorbild. Diese
> IDE akzeptiere ich so wie sie ist nur, weil sie kostenlos ist.

Egal. IntellIJ und Konsorten können das alle auch. Eclipse war nur ein 
Beispiel. Ist sowieso eine Glaubensfrage. Aber ich mag es.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren