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!
:
Bearbeitet durch User
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.