Forum: Mikrocontroller und Digitale Elektronik Timing Aufgaben wie lösen? Wann eignet sich welche Methode?


von StM (Gast)


Lesenswert?

Ich bin wieder mal dabei, mich mit dem Stm32f4(Discovery) vertrauter zu 
machen, und da hat sich (vlt weil ich aus der Arduino Ecke komme) mir 
die Frage gestellt, bei welchen Aufgaben man auf einem uC welche 
Delay/Timingmöglichkeiten wählt.
Für PWM würde man wohl einen Timer wählen, da es sich um eine 
periodische Aufgabe handelt.
Aber würde man für z.B. die delays für ein LCD oder einen Servo auch 
einen Timer starten, oder einfach eine kleine Funktion schreiben die 
Zeit verplempert?
Un etwas banales wie eine blinkende LED? Kann man vlt die SysTick da 
sinnvoll einsetzen?

Vielleicht könnt ihr mir da etwas weiterhelfen, weil ich - wie gesagt - 
aus der Arduino-Spiel-Ecke komme und man da ja fast ausschließlich mit 
delay() zu tun hat...

von Amateur (Gast)


Lesenswert?

Am einfachsten und übersichtlichsten ist immer noch ein delay.

... aber nur, wenn Du (der µP), sonst nichts zu tun hat.

Delay ist nämlich ein full-time-job.

Aus diesem Grunde hat diese Funktion bei mir Hausverbot.

Natürlich gibt es noch Sonderfälle wie, zum Bleistift exakte 
Verzögerungen, auf Assemblerebene, im Bereich von ein paar Nop's.

von Falk B. (falk)


Lesenswert?

@ StM (Gast)

>die Frage gestellt, bei welchen Aufgaben man auf einem uC welche
>Delay/Timingmöglichkeiten wählt.

Kurze bis sehr kurze Verzögerungen (us bis wenige Milliseksunden) macht 
man mit einfachen Warteschleifen ala _delay_us() oder _delay_ms() oder 
wie auch immer sie auf dem speziellen System heißen.

Wenn die CPU aber sowieso gerade nix besseres zu tun hat, sind auch 
sekundenlange Pausen OK, z.B. bei Initialisierungen etc.

>Für PWM würde man wohl einen Timer wählen, da es sich um eine
>periodische Aufgabe handelt.

PWM machen die meisten Controller komplett in Hardware. Nur für 
Soft-PWM braucht man die CPU und damit einen Timer-Interrupt.

>Aber würde man für z.B. die delays für ein LCD oder einen Servo auch
>einen Timer starten, oder einfach eine kleine Funktion schreiben die
>Zeit verplempert?

Für die Pulspause beim LCD für das Signal E von ~1us verplempert man 
einfach Zeit, weil ei Timer hier rein gar nichts spart. Die Pause 
zwischen einzelnen Zeichen (typisch 40us) ist schon fraglich. Einfache 
Libs warten auch hier einfach durch Zeitverplempern, und das ist in 
vielen einfachen Programmen auch OK. Fortgsschrittene Nutzen aber einen 
Timer, um periodisch Zeichen auszugeben, z.B. jede ms. Damit spart man 
sich das Warten nach der Zeichenausgabe und kann sinnvolle Dinge tun.

>Un etwas banales wie eine blinkende LED? Kann man vlt die SysTick da
>sinnvoll einsetzen?

Ja, siehe Multitasking.

>Vielleicht könnt ihr mir da etwas weiterhelfen, weil ich - wie gesagt -
>aus der Arduino-Spiel-Ecke komme und man da ja fast ausschließlich mit
>delay() zu tun hat...

Die Anfängerseuche ;-)
Ist am ANFANG auch OK, aber irgendwann muss man mal die Stützräder 
abbauen und ohne diese fahren (programmieren) lernen. Und wenn man das 
geschafft hat, ist man stolz wie Oskar! Zu recht!

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

StM schrieb:

> die Frage gestellt, bei welchen Aufgaben man auf einem uC welche
> Delay/Timingmöglichkeiten wählt.

Die Antwort ist ziemlich einfach und auch völlig unspezifisch bezüglich 
des Zielsystems. Irgendwelche Software-Delays benutzt man nur dann, wenn 
es mit der Benutzung der (Timer-) Hardware zu einem größeren negativen 
Einfluß auf die Performance des Gesamtsystems kommt als ohne. Dazu 
gehören naturgemäß auch all die Fälle, mit denen die gewünschte Zeit per 
Timerinterrupt entweder garnicht mehr darstellbar oder zumindest nicht 
mehr zuverlässig genug reproduzierbar ist.

Blöderweise ist es nur recht schwierig, eine genaue Grenze anzugeben, 
egal, ob man die in Takten oder Zeiteinheiten formulieren will.

Ich würde mal als Faustformel postulieren: Weniger als 20 Takte: 
höchstwahrscheinlich Software-Delay. Mehr als 100 Takte: 
höchstwahrscheinlich Timer-Interrupt. 20..100 Takte: kann man sicher nur 
am konkreten Objekt entscheiden.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

StM schrieb:
> Aber würde man für z.B. die delays für ein LCD oder einen Servo auch
> einen Timer starten, oder einfach eine kleine Funktion schreiben die
> Zeit verplempert?

Bei den vielen PWM Kanälen, die der STM32 hat, nehme ich für einen Servo 
oder auch die blinkende LED natürlich einen Timer. Durch die 
einstellbare Periode und die vielfältigen Prescaler ist da für jedes 
Intervall was bei.

von Peter D. (peda)


Lesenswert?

StM schrieb:
> Für PWM würde man wohl einen Timer wählen, da es sich um eine
> periodische Aufgabe handelt.

Nein.
Für PWM bevorzugt man eindeutig eine PWM-Unit. Da entsteht nur CPU-Last, 
wenn der Wert sich ändert.
Und das allerwichtigste, es entsteht kein Jitter durch andere 
Interrupts!
Deshalb haben ja auch viele MCs mehrere PWM-Units (Timer mit PWM-Mode).

von StM (Gast)


Lesenswert?

Habe ich euch richtig verstanden: Ihr sagt mehr oder weniger einstimmig, 
das bei längeren verzögerungszeiten (ca. > 10 Ticks) ein delay nichts 
mehr zu suchen hat und man einen Timer anwerfen sollte?

von StM (Gast)


Lesenswert?

Peter Dannegger schrieb:
> StM schrieb:
>> Für PWM würde man wohl einen Timer wählen, da es sich um eine
>> periodische Aufgabe handelt.
>
> Nein.
> Für PWM bevorzugt man eindeutig eine PWM-Unit. Da entsteht nur CPU-Last,
> wenn der Wert sich ändert.
> Und das allerwichtigste, es entsteht kein Jitter durch andere
> Interrupts!
> Deshalb haben ja auch viele MCs mehrere PWM-Units (Timer mit PWM-Mode).

Ja aber im Grunde wirfst du auch da einen Timer an...

von Falk B. (falk)


Lesenswert?

@ StM (Gast)

>Habe ich euch richtig verstanden:

Nein.

> Ihr sagt mehr oder weniger einstimmig,
>das bei längeren verzögerungszeiten (ca. > 10 Ticks) ein delay nichts
>mehr zu suchen hat und man einen Timer anwerfen sollte?

Nein. Wenn die CPU nix besseres zu tun hat, kann man auch 1 Million 
Takte mit Warten verbraten. Wenn man mehrere Dinge gleichzeitig 
bearbeiten will/muss, wird man meist einen Timer nutzen, siehe 
Multitasking.

von ?!? (Gast)


Lesenswert?

StM schrieb:
> Ja aber im Grunde wirfst du auch da einen Timer an...

Stimmt, aber dieser Timer startet dann keine ISR(*), die Software 
beinhaltet, die deine PWM-Pins toggelt. Der Timer wird lediglich 
konfiguriert und macht die PWM dann zu 100% in Hardware.

(*)Natürlich kann mit dem Timer, da er sowieso läuft, auch eine ISR 
gestartet werden, um periodische Aufgaben zu erfüllen.

von StM (Gast)


Lesenswert?

Falk Brunner schrieb:
> Nein. Wenn die CPU nix besseres zu tun hat, kann man auch 1 Million
> Takte mit Warten verbraten. Wenn man mehrere Dinge gleichzeitig
> bearbeiten will/muss, wird man meist einen Timer nutzen, siehe
> Multitasking.

Ja aber in den meisten Fällen hat die CPU was besseres zu tun und es 
spricht ja außer des Stromverbrauchs nichts dagegen einen Timer zu 
nutzen...

Und noch eine weitere Frage: Wenn ich einen Pin als PWM Pin einsetze, 
muss ich den auch auf PWM-Modus lassen und kann nur über CCRx den Wert 
ändern aber nicht mehr über BSRRL/H an und ausschalten?

von Schaulus Tiger (Gast)


Lesenswert?

StM schrieb:

> Wenn ich einen Pin als PWM Pin einsetze, muss ich den auch
> auf PWM-Modus lassen und kann nur über CCRx den Wert
> ändern aber nicht mehr über BSRRL/H an und ausschalten?

Beides ist möglich, du kannst jederzeit per AFR wieder auf "Output" 
schalten. Aber über CCRx sprichst du auch nur genau einen Pin an und es 
ist auch nur ein Schreibzugriff. Das BSRR bietet in dem speziellen Fall 
keinen Vorteil.

von Falk B. (falk)


Lesenswert?

@ StM (Gast)

>Und noch eine weitere Frage: Wenn ich einen Pin als PWM Pin einsetze,
>muss ich den auch auf PWM-Modus lassen und kann nur über CCRx den Wert
>ändern aber nicht mehr über BSRRL/H an und ausschalten?

Sieht so aus. Entweder wird das Pin vom PWM-Modul kontrolliert oder von 
der CPU. Beide gleichzeitig geht meistens nicht. Es gibt aber Ausnahmen. 
RTFM.

von StM (Gast)


Lesenswert?

Und frage ich mich mal weiter durch ;)
Ich habe bis jetzt immer mit dem CCRx im Zusammenhang mit Timern 
gearbeitet, aber ich weiß außer das ich weiß was man damit macht, noch 
sehr wenig drüber. Befrage also mal den Definitive Guide und stelle 
fest, CCR = Configuration Control Register im System Control Block. Ich 
kann mir aber wegen mehren Gründen nicht vorstellen, das das o.g. 
Register dies ist:
Ich schreibe ja einen Wert in dieses Register, der dann in eine 
Pulsweite umgerechnet wird. Das CC Register aber wird für ganz andere 
Dinge eingesetzt.
Außerdem müsste ein Register, das beim PWM verwendet wird um Werte 
einzustellen eher im PWM Block sitzen als mitten drin im SCB?

Vlielleicht kann mich da jemad drüber aufklären?

von Schaulus Tiger (Gast)


Lesenswert?

StM schrieb:

> Ich habe bis jetzt immer mit dem CCRx im Zusammenhang mit Timern
> gearbeitet, aber ich weiß außer das ich weiß was man damit macht, noch
> sehr wenig drüber. Befrage also mal den Definitive Guide und stelle
> fest, CCR = Configuration Control Register im System Control Block.

Befrage einfach das passende Reference Manual... Außerdem schreibst du 
selbst: CCRx, also CCR1, CCR2 usw. Das sind die Capture/Compare Register 
der Timer. "CCR" ohne Ziffer ist etwas anderes. Diese Chips sind so 
komplex, dass uns schön langsam die Buchstaben ausgehen ;)

von StM (Gast)


Lesenswert?

Ah okay. Sie sind zwar anders aufgebaut, heißen aber immernoch so, weil 
der Wert, der da drin steht mit dem aktuellen Timerstand verglichen 
wird? wenn der Timerstand mit diesem übereinstimmt, dann wird ein 
Ereignis ausgelöst.

Schaulus Tiger schrieb:
> Befrage einfach das passende Reference Manual..

Da macht mein Pentium M nicht mehr mit... 1000 Seiten sind leider fast 
zu viele für ihn. Er pckt es irgendwann aber das dauert ;)

von Schaulus Tiger (Gast)


Lesenswert?

StM schrieb:

> der Wert, der da drin steht mit dem aktuellen Timerstand verglichen
> wird? wenn der Timerstand mit diesem übereinstimmt, dann wird ein
> Ereignis ausgelöst.

so, oder: solange der Timerstand kleiner ist, ist der PWM-Pin Low und 
umgekehrt.

> Da macht mein Pentium M nicht mehr mit... 1000 Seiten sind leider fast
> zu viele für ihn. Er pckt es irgendwann aber das dauert ;)

Acrobat Reader? Gönn' deinem Pentium doch mal einen PDF-Betrachter...


Dieser Beitrag wurde möglich durch einen
Intel(R) Pentium(R) M processor 1.20GHz

von StM (Gast)


Lesenswert?

Schaulus Tiger schrieb:
> Acrobat Reader? Gönn' deinem Pentium doch mal einen PDF-Betrachter...
>
> Dieser Beitrag wurde möglich durch einen
> Intel(R) Pentium(R) M processor 1.20GHz

Ja ich habe es dann auch geschafft...

>> Dieser Beitrag wurde möglich durch einen
>> Intel(R) Pentium(R) M processor 1.20GHz

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.