Forum: Mikrocontroller und Digitale Elektronik Zeittakt mit Arduino statt "delay"!


von Wolfgang S. (Firma: Pensionär-Altes-Eisen) (stackpointer)


Lesenswert?

Hallo,
ich suche Tipss we ich in einem Arduino-sketch zeitmarken gewinnen kann, 
daher ein Programmabschnitt der ohne delay mit ungefähr alle sekunde 
oder alle 1/10 Sekunde ein Bit kippt.

Im Prinzip im loop einen 32-bit-Zähler inkremetieren, einige high bits 
ausmaskieren und wenn die gültigen bit 000000 habne das Taktbit 
invertieren. Bir wäre es egal ob 51ms oder 100ms, 510ms oder 1s 
letztendlich die Zeitmarke wäre.

Wie definiere ich 32-bit-worte, wie inkrimentiere ich, wie die Maske?

Gruß

PS.

16bit würde rechen wenn die Zykluszeit bei kurzen Programmen unter ca. 
16us wäre

von gogigo (Gast)


Lesenswert?

Intervallsteuerung

von Ardu freak (Gast)


Lesenswert?

sieh dir mal millis() an

von Falk B. (falk)


Lesenswert?

Wolfgang S. schrieb:
> Hallo,
> ich suche Tipss we ich in einem Arduino-sketch zeitmarken gewinnen kann,
> daher ein Programmabschnitt der ohne delay mit ungefähr alle sekunde
> oder alle 1/10 Sekunde ein Bit kippt.

Mit einem Timer-Interrupt.

> Im Prinzip im loop einen 32-bit-Zähler inkremetieren, einige high bits
> ausmaskieren und wenn die gültigen bit 000000 habne das Taktbit
> invertieren. Bir wäre es egal ob 51ms oder 100ms, 510ms oder 1s
> letztendlich die Zeitmarke wäre.
>
> Wie definiere ich 32-bit-worte,

uint32_t my32bits;

> wie inkrimentiere ich

my32bits++;

>, wie die Maske?

my32bits &= 0xFF;

> 16bit würde rechen wenn die Zykluszeit bei kurzen Programmen unter ca.
> 16us wäre

Komisch, oben war noch von 2stelligen Millisekunden die Rede.

P S Zum Programmieren in C braucht es noch ein "wenig" mehr.

von Einer K. (Gast)


Lesenswert?

Wolfgang S. schrieb:
> ich suche Tipss we ich in einem Arduino-sketch zeitmarken gewinnen kann,
Schon eingebaut!
wurde genannt: millis()

Wolfgang S. schrieb:
> einen 32-bit-Zähler inkremetieren,
Schon eingebaut.

Falk B. schrieb:
> Mit einem Timer-Interrupt.
Kann man machen, wenn einem die eine vorhandene Timer ISR nicht reichen 
tut.

von Falk B. (falk)


Lesenswert?

Arduino Fanboy D. schrieb:
> Wolfgang S. schrieb:
>> ich suche Tipss we ich in einem Arduino-sketch zeitmarken gewinnen kann,
> Schon eingebaut!
> wurde genannt: millis()

Nö. Das ist nur der tausendfach kopierte Würg-Around. Damit kann kann 
KEIN präzises Timing generieren, wie es eine gescheite Timer-ISR kann. 
Denn die kann mit deutlich besserer Zeitauflösung mit deutlich weniger 
Jitter deutlich besser arbeiten. War das jetzt deutlich genug? ;-)

von Einer K. (Gast)


Lesenswert?

Falk B. schrieb:
> War das jetzt deutlich genug? ;-)
Is klar....
Voll der Held...
Rum pääpen, aber  Anforderungen nicht gelesen:

Wolfgang S. schrieb:
> mit ungefähr alle sekunde
> oder alle 1/10 Sekunde ein Bit kippt.
> ...
> Bir wäre es egal ob 51ms oder 100ms, 510ms oder 1s
> letztendlich die Zeitmarke wäre.

Und jetzt du wieder!
Los, die nächste Blamage, nimm sie dir.

---
Ich vermute, dass Wolfgang S. erstmal lernen muss "nicht blockierende" 
Programme zu schreiben.

von Wolfgang S. (Firma: Pensionär-Altes-Eisen) (stackpointer)


Lesenswert?

Hallo,
nichtblockierend, genau deshalb, ich will mein Programm eben NICHT mit 
"delay" anhalten!

16us maximale Zykluszeit waren genannt damit nicht nach 65 000 
Durchläufen der Zähler überläuft bevor 1s vorbei wäre, deshalb evtl. 
32-bit-Schleifenzähler.

Gruß

von Arduino Frickler (Gast)


Lesenswert?

Wolfgang S. schrieb:
> Hallo,
> nichtblockierend, genau deshalb, ich will mein Programm eben NICHT mit
> "delay" anhalten!
>
> 16us maximale Zykluszeit waren genannt damit nicht nach 65 000
> Durchläufen der Zähler überläuft bevor 1s vorbei wäre, deshalb evtl.
> 32-bit-Schleifenzähler.
>
> Gruß

Guck mal hier:

https://www.google.ca/search?source=hp&ei=HtRVXIjxG8iA0wLuuaTgBA&q=how+to+use+arduino+timer+interrupt&oq=how+to+use+arduino+timer+&gs_l=mobile-gws-wiz-hp.1.1.0i22i30l5.2878.9365..11554...0.0..0.114.2022.23j2......0....1.......5..41j0i131j0j46i131j46i131i275.J88SDC0Mp_w

Aus diesen Unterlagen sollte sich Nützliches adoptieren lassen.

von Einer K. (Gast)


Lesenswert?

Wolfgang S. schrieb:
> Hallo,
> nichtblockierend, genau deshalb, ich will mein Programm eben NICHT mit
> "delay" anhalten!
Es dreht sich also nicht um wirklich exakte Zeiten, sondern eher darum 
Nebenläufigkeiten zu realisieren.

In Datei->Beispiele->Digital findet sich das "BlinkWithoutDelay" 
Bespiel.
Das solltest du dir anschauen.
Meist reicht das.

von Christoph M. (mchris)


Lesenswert?

Gerade wollte ich den Link posten:
https://www.arduino.cc/en/tutorial/BlinkWithoutDelay

von Falk B. (falk)


Lesenswert?

Wolfgang S. schrieb:

> Hallo,
> nichtblockierend, genau deshalb, ich will mein Programm eben NICHT mit
> "delay" anhalten!

Schon klar.

> 16us maximale Zykluszeit waren genannt damit nicht nach 65 000
> Durchläufen der Zähler überläuft bevor 1s vorbei wäre, deshalb evtl.
> 32-bit-Schleifenzähler.

Falsch. Es müssen 16us MINDESTzykluszeit her, damit ein 16 Bit Zähler in 
1s nicht überläuft. Aber wenn du sowieso nur eine Auflösung von 1ms 
brauchst, bist du davon meilenweit weg.

von Falk B. (falk)


Lesenswert?

Christoph M. schrieb:
> Gerade wollte ich den Link posten:
> https://www.arduino.cc/en/tutorial/BlinkWithoutDelay

Und du glaubst, das jemand der, ich zitiere

"Wie definiere ich 32-bit-worte, wie inkrimentiere ich, wie die Maske?"

nachfragt, damit klar kommt?

von Einer K. (Gast)


Lesenswert?

Naja...
Vielleicht nicht unmittelbar.
Aber wie immer: Kompetenz ist keine Konstante.
Kann also noch werden....

von Wolfgang (Gast)


Lesenswert?

Falk B. schrieb:
> Nö. Das ist nur der tausendfach kopierte Würg-Around. Damit kann kann
> KEIN präzises Timing generieren, wie es eine gescheite Timer-ISR kann.

Was meinst du denn, wie präzise es für "ungefähr alle sekunde oder alle 
1/10 Sekunde" sein müsste?

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.