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...
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.
@ 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!
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.
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.
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).
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?
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...
@ 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.
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.
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?
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.
@ 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.
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?
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 ;)
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 ;)
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
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