Timer Interrupts - Arduino Tutorial (German)

แชร์
ฝัง
  • เผยแพร่เมื่อ 13 ต.ค. 2024
  • Timer Interrupt Calculator: timer-interrupt...
    Code und Tabellen: www.simsso.de/?...
    Kontakt: timodenk.com/
    In diesem Video erkläre ich, wie man mit Timer Interrupts arbeitet.
    Datum: 23. Dezember 2014

ความคิดเห็น • 54

  • @highfish6762
    @highfish6762 4 ปีที่แล้ว +5

    Mit Abstand die beste deutschsprachige Erklärung zu diesem Thema! Vielen Dank!

    • @Simsso
      @Simsso  4 ปีที่แล้ว +2

      Freut mich total, das zu hören. Ich habe das Video jetzt selbst schon seit ein paar Jahren nicht mehr geschaut und es mir gerade mal wieder gegönnt. Lustig, sich als "Kind" reden zu hören 😁.

  • @Marshall0293
    @Marshall0293 4 ปีที่แล้ว +5

    Vielen Dank für das Video. Sehr verständlich erklärt! Beim "Sie" habe ich mich leicht in ein Seminar versetzt gefühlt, aber auch das war nach dem ersten Schrecken in Ordnung :D

  • @loel2312
    @loel2312 6 ปีที่แล้ว +8

    danke für das super Video, für mich als Maschinenbauer mit begrenzten Programmierkenntnissen sehr verständlich!

  • @sshenko2499
    @sshenko2499 5 ปีที่แล้ว +12

    Fantastische Erklärung!
    Du hast mir sehr geholfen,
    Vielen Dank dafür.

  • @dl8cy
    @dl8cy 8 ปีที่แล้ว +18

    Das mit dem "Sie" ist sehr gewöhnungsbedürftig :-)

  • @tk0014
    @tk0014 2 ปีที่แล้ว +1

    Genau das was mein Lehrer nicht erklären kann. Vielen Dank für das super verständliche Video👍

  • @timr.8885
    @timr.8885 9 ปีที่แล้ว +6

    Sehr gut erklärt, besonders bei diesem komlexen Thema ;)

    • @Simsso
      @Simsso  9 ปีที่แล้ว +1

      Danke, freut mich sehr, das zu hören! Während man das Video macht ist man dann immer bisschen unsicher ob es verständlich ist und so....

  • @TimKstnr
    @TimKstnr 3 ปีที่แล้ว +2

    Super Video, besser erklärt als von unserem Professor 👍

  • @AsifIqbal-st1dx
    @AsifIqbal-st1dx 8 ปีที่แล้ว +1

    danke schoen fuer die hilfe.ich bin einen international student in Paderborn.ich kann nicht so gut deutsch und studiere auch in englisch aber trotzdem habe ich gut einverstanden du hast es ordentlisch praesentiert. alle probleme sind wegEin hoch auf dich :)

    • @Simsso
      @Simsso  8 ปีที่แล้ว +1

      Thanks man! I appreciate that :-)

  • @norberthuemmer3243
    @norberthuemmer3243 9 ปีที่แล้ว +1

    Gut erklärt finde ich auch ! Ist das 1:1 umsetzbar in der Arduinoprogrammierung oder gibt es da Unterschiede zu beachten ?

    • @Simsso
      @Simsso  9 ปีที่แล้ว

      Norbert Huemmer Das Video gilt auch 1:1 für die Arduino IDE!

  • @thomasengelhardt7940
    @thomasengelhardt7940 5 ปีที่แล้ว +1

    Gut erklärt. Hat mir sehr geholfen. Die "Sie" Form ist tatsächlich ein wenig gewöhnungsbedürftig.

    • @Simsso
      @Simsso  5 ปีที่แล้ว

      Ja, ich glaube dann wechsele ich in Zukunft auf "Du", wenn das jetzt wiederholt angemerkt wird. :-)

  • @TonySwitzerland
    @TonySwitzerland 6 ปีที่แล้ว +2

    Vielen Dank, hilft mir auf die Sprünge!

  • @niklasausbtown
    @niklasausbtown 9 ปีที่แล้ว +7

    Gutes Video, vielen Dank.

  • @tormann3
    @tormann3 8 ปีที่แล้ว +1

    Echt super erklärt!
    Hab nur das Problem, dass ich weitere Probleme beim Programmieren habe, wie zum Beispiel ADC. Wäre cool wenn du auf deinem Kanal mehr solche Videos hättest.

    • @Simsso
      @Simsso  8 ปีที่แล้ว

      Danke! Was für ein Problem hast du denn konkret?

    • @tormann3
      @tormann3 8 ปีที่แล้ว

      +Timo Denk zum Beispiel wie ein ADC funktioniert oder für was man einen ADC benötigt

  • @ThePGloor
    @ThePGloor 8 ปีที่แล้ว +1

    Tolles Tutorial, besser geht's nicht. Ich hab's gleich in die Praxis umgesetzt. Danke!

    • @Simsso
      @Simsso  8 ปีที่แล้ว

      Freut mich, vielen Dank!

    • @ThePGloor
      @ThePGloor 8 ปีที่แล้ว

      Drei kleine Fragen habe ich noch:
      1) in den Beispielen und im Interrupt Calculator werden die Werte für das Compare Match Register anscheinend nach folgender Formel berechnet: compare match register = [ clock speed / (prescaler * interrupt frequency) ] - 1. Auf arduino-info.wikispaces.com/Timers-Arduino und an anderen Orten habe ich jetzt Beispiele gesehen, welche den Wert ohne -1 einsetzen. Warum ist -1 richtig?
      2) In vielen Fällen ist das Resultat für das Compare Match Register kein Integer. Ich kann den Wert problemlos und ohne Fehler im Code verwenden. Da ich immer nur Code-Beispiele mit ganzzahligen Werten sehe, frage ich mich ob es von Vorteil ist einen andern Prescaler zu verwenden, der einen Integer zurückliefert?
      3) Gemäss Datenblatt teilen sich Timer 0 und Timer 1 den Prescaler, während Timer 2 einen eigenen Prescaler hat. Spielt das in der Praxis irgendeine Rolle? Soweit ich das verstanden habe, kann ich ja trotzdem verschiedene Werte setzen.
      Im konkreten Fall habe ich einen 8-bit Timer 0 mit 500 Hz. Bei einem Prescaler von 1024 ergibt das für OCR0A einen Wert von 30.25. Bei einem Prescaler von 256 wäre der Wert für OCR0A = 124. Wäre das evtl. besser? Timer 1 kann ich nicht verwenden, da er zwingend anderweitig belegt ist. Es stellt sich für mich höchstens noch die Frage ob es wegen dem Prescaler von Vorteil wäre, anstelle von Timer 0, Timer 2 zu verwenden.

    • @ThePGloor
      @ThePGloor 8 ปีที่แล้ว

      Ich denke ich hab die Antworten bereits selber gefunden:
      zu 1): compare match register = [ clock speed / (prescaler * interrupt frequency) ] - 1 ist richtig, weil der Interrupt erst im nächsten Zyklus nach dem Match ausgelöst wird.
      zu 2): der im Code eingetragene Wert wird auf den Integer vor dem Punkt abgerundet. In der Regel wird das keine grosse Rolle spielen, wenn es aber ganz genau sein sollte, würde ich einen Prescaler verwenden, der in einem Integer resultiert.
      zu 3): Ich sehe keinen Grund weshalb ich wegen dem gemeinsamen Prescaler von Timer 0 und 1 den Timer 2 verwenden sollte. Für den Timer 2 spricht ggf., dass der Timer 0 im Arduino anscheinend für die Funktion millis() verwendet wird.
      Ich hoffe, dass meine Schlüsse nicht ganz falsch sind.

    • @Simsso
      @Simsso  8 ปีที่แล้ว

      Hi Peter,
      danke für deine ausführlichen Beitrage. Ich hatte leider bis jetzt keine Zeit zu antworten, aber du hast ja in der Zwischenzeit schon einiges herausgefunden.
      zu 1): Stimmt genau, das war auch mein Gedanke. Ob das Aufrufen eines Interrupts tatsächlich nur einen Taktzyklus braucht ist mal dahingestellt.
      zu 2): Stimmt exakt. Deshalb bietet der Timer Interrupt Calculator (timer-interrupt-calculator.simsso.de/) auch die Möglichkeit, den Prescaler manuell anzupassen. Mit Integer-Werten läuft der Timer exakt.
      zu 3): Deine Aussage "Gemäss Datenblatt teilen sich Timer 0 und Timer 1 den Prescaler, während Timer 2 einen eigenen Prescaler hat." kann ich so nicht nachvollziehen. Meines Wissens nach sind die Prescaler-Register so aufgeteilt:
      TCCR0B Timer 0
      TCCR1B Timer 1
      TCCR2B Timer 2
      Kannst du mir, falls das nicht stimmt die Seite nennen? (www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf)

    • @ThePGloor
      @ThePGloor 8 ปีที่แล้ว +1

      Seite 138: 17. Timer/Counter0 and Timer/Counter1 Prescalers
      ”8-bit Timer/Counter0 with PWM” on page 93 and ”16-bit Timer/Counter1 with PWM” on page 111 share the same prescaler module, but the Timer/Counters can have different prescaler settings. The description below applies to both Timer/Counter1 and Timer/Counter0.Wie auch immer, ich habe dank deinem Tutorial sehr schnell den richtigen Einstieg gefunden. Nochmals vielen Dank.

  • @linushoegger10
    @linushoegger10 2 ปีที่แล้ว

    Welche library muss ich herunterladen?

  • @robin888official
    @robin888official 8 ปีที่แล้ว +1

    Hm. Bei den Belegungen des Prescalers sind externe Taktgeber erwähnt.
    Ich weiß nicht, ob das eine gute Idee wäre, aber könnte man, wenn man den Vergleichswert eines Timers auf 1 setzt, einen externen Sensor (zum Beispiel eine Lichtschranke) als Interrupter missbrauchen?
    Also wenn ein Eingangssignal anliegt Code mit höherer Priorität als die loop() ausführen?

    • @Simsso
      @Simsso  8 ปีที่แล้ว

      +Robin Koch Ich verstehe nicht genau, wie du das meinst. Vergleichswert eines Timer Registers auf 1 stellen ist jedenfalls keine gute Idee, da der Mikrocontroller dann einen Interrupt auslösen wird, während er noch in der Interrupt Service Routine ist. Dann gibt es nach kurzer Zeit einen Stack overflow.

  • @enricoincognito8595
    @enricoincognito8595 7 ปีที่แล้ว +1

    Bei einem beispiel programm welches ich kopiert habe (blinklicht per timer) haben die den timer bei jedem ausführen neu mit dem eigendlich schon im setup voreingesteltem überlaufswert neu belegt.
    Ich frage mich warum .
    Das interval ist ohne neubelegung ein anderes ...
    Kann ea sein das sich der timer nach ablauf der isr selber neu belegt wenn man es nicht jedes mal per hand macht?

    • @Simsso
      @Simsso  7 ปีที่แล้ว +1

      Es gibt da die Möglichkeiten (1) einen Interrupt per Overflow oder per (2) Compare Match Register auszulösen. Dein Beispiel verwendet vermutlich (1) und setzt das Register daher auf einen höheren Wert, damit der Overflow nach der gewünschten Zeit passiert. Bei (2), das verwenden wir hier, wird der Count Register Wert automatisch auf 0 gesetzt und der nächste Interrupt findet beim Erreichen des Compare Match Register Wertes statt. Ich hoffe, das klärt deine Frage.

    • @enricoincognito8595
      @enricoincognito8595 7 ปีที่แล้ว +1

      Timo Denk ja das erklärt einiges :)
      Danke

  • @Marini232
    @Marini232 6 ปีที่แล้ว

    wird der Timer auch weiterhin hochgezählt, während ich in der Interrupt funktion bin?
    Wenn beispielsweise meine Interruptfunktion selbst 23 Ticks benötigt und ich mein Compare-Match-Register auf 50 eingestellt ist, sollte das doch bedeuten, dass der nächste Interrupt nur 27 Ticks vom Letzten entfernt ist, oder? Oder ist es so, dass der Timer erst nach beenden der Interruptfunktion weitergezählt wird. So würde der Abstand zwischen den Aufrufen 73 Ticks sein.

    • @dirklaubusch5659
      @dirklaubusch5659 6 ปีที่แล้ว

      Hallo Marini : Deine erste Annahme ist die Richtige. Die ganzen Timer beziehen sich immer letztendlich auf den Systemtakt, und der ist erbarmungslos auf den ( meist mit Quarz von aussen ) erzeugten Takt festgenagelt. Der läuft mit zB 16 Mhz, da gibts nichts dran zu rütteln, der ist sozusagen unabwendbar von aussen eingebrannt. Und darauf beziehen sich die ganzen Timer; die zählen praktisch nur wann sie denn endlich mal wieder dran sind. ( egal was sonst so im Prozessor passiert, die zählen nur die Takte ). Jetzt merkt zB. der Timer 1: " Huch, meine 100 Takte Wartezeit sind vorbei" und daraufhin führt nun der Prozessor die dem Timer1 zugeordnete ISR_1 ( Interrupt_Service_Routine 1 ) aus. Und nun zur Pointe, oder warum ich deine Frage sehr gut und wichtig finde: Wenn du deine Timer-Intervalle sehr kurz eingestellt hast, aber das "normale" Hauptprogramm sehr viel abzuarbeiten hat ( zB Temperatur lesen, Display ansteuern, AD-Wandler abfragen ... usw) dann bekommst du da dann dort natürlich Probleme, weil plötzlich für die langweiligen Standardaufgaben keine Zeit mehr übrig ist, oder dessen Protokolle auch ein gewisses Timing benötigen. DAHER: ISR immer so kurz wie nur irgend geht, am Besten einfach nur in der ISR eine Variable auf 1 setzen und die Auswertung dann im Hauptprogramm abarbeiten. .... omg jetzt hab ich dich zugetextet, meine Unterbrechungs-Service-Routine ist echt zu lang geworden .. :=)

  • @pdrmueller
    @pdrmueller 8 ปีที่แล้ว

    schön erklärt, Sachsen/Thüringen eben.

  • @blauezukunft4042
    @blauezukunft4042 7 ปีที่แล้ว

    Vielen Dank für Ihre Tipps! Zurzeit versuche ich mit Arduino die Ausführung in einer bestimmten Periode durchführen.(Wie in der SPS) Es darf ich gar nicht durch "delay" bewerkstelligen. Meine Idee ist, am Anfang des Programms setze ich die TCNT2 als 0 zurück, durch das Laufen steigt TCNT2 sich auf, am Ende des Programms nutze ich "while (TCNT2

    • @Simsso
      @Simsso  7 ปีที่แล้ว

      Der Vergleich in der while-Schleife dauert vermutlich 1 oder 2 Taktzyklen (0,125 Mikrosekunden; www.atmel.com/webdoc/avrassembler/avrassembler.wb_instructions.branch_instructions.html). Das Grundprinzip ist stimmig: Das Zählerregister kann verwendet werden, ohne wirklich einen Interrupt einzusetzen. Verschnellern kann man den Vergleichsprozess ansonsten meines Wissens nach nicht. Ein Interrupt wäre aber definitiv schneller und vermutlich auch akkurater.

    • @blauezukunft4042
      @blauezukunft4042 7 ปีที่แล้ว

      Durch einen Versuch habe ich die tatsächtliche Berechnensfähigkeit von 328P bemerkt. Bei Berechnung der Trigonometrie mit Float-Parameter ist Atmel sehr langsam, es lässt die Verzögerung schon sinnlos sein (ca. 2300 Periode pro Sekunde). Aber für normale Anwendung ist es schon genug. Endlich ist das Geschwindigkeitsproblem durch Feld-Vorrechnung gelöst. Bei Trigonometrieberechung sucht der MCU den Wert aus dem Feld. Danach funktioniert die "while (TCNT2

  • @sowd9903
    @sowd9903 3 ปีที่แล้ว +1

    bessere Erklärung als mein Dozent :')

  • @grummhd3020
    @grummhd3020 8 ปีที่แล้ว +1

    DAAANNKEE meine fräse wird sie lieben. denn dann kann ich endlich in "Echtzeit" rechnen und multithreading betreiben

    • @Simsso
      @Simsso  8 ปีที่แล้ว

      Das klingt gut! :-)

  • @byteattack1437
    @byteattack1437 5 ปีที่แล้ว

    Dieser 'Interrupt Calculator' arbeitet falsch - er schlägt einen Prescaler von 1024 vor obwohl sich dadurch 7811,5 ergibt.
    Das kann so nicht eingestellt werden. Ein Programm sollte dies erkennen und 256 vorschlagen.
    Dann ist das erledigt. Bitte um Nachbesserung :)

    • @Simsso
      @Simsso  5 ปีที่แล้ว

      Bei welchen Eingabewerten tritt das Problem auf?

    • @byteattack1437
      @byteattack1437 5 ปีที่แล้ว

      @@Simsso Bei 6:00 im Video, 16MHz, 2 Hz, Prescaler wird vom Programm 1024 vorgeschlagen, Compare Match Register 7811,5. Hier müsste man dann runden.
      Besser wäre Prescaler 256 und dann 31250 (16000000/256/2), oder? Wäre ein Vorschlag.

    • @byteattack1437
      @byteattack1437 5 ปีที่แล้ว

      Aber trotzdem das Thema sehr schön veranschaulicht - vielen Dank für das Video!

    • @Simsso
      @Simsso  5 ปีที่แล้ว

      @@byteattack1437 der Grund ist, dass der Prescaler vom Tool eher höher gewählt wird, um die Verwendung von mehreren Timern zu ermöglichen. In diesem Fall wäre eine bessere Wahl tatsächlich der Vorschlag von dir. Da man den Prescaler auch manuell wählen kann, würde ich das als verkraftbar sehen. Danke aber für den Hinweis.

  • @nicoxxl26
    @nicoxxl26 6 ปีที่แล้ว +1

    Super Video

  • @EXMattix
    @EXMattix 4 ปีที่แล้ว

    Einfach nur danke

  • @MyTest4u
    @MyTest4u 4 ปีที่แล้ว

    Ist das wirklich Sicher? Ich habe mir extra ein HW Hund zugelegt th-cam.com/video/kxOzvKOhn2E/w-d-xo.html
    Ich will auf keinen Fall dass das System sich aufhängt z.B. weil der Takt fehlt.

  • @van-nhantran1915
    @van-nhantran1915 8 ปีที่แล้ว +2

    if only this was in English :(

  • @michaelrotter5143
    @michaelrotter5143 4 ปีที่แล้ว

    Verstehe nicht, warum er uns als "Sie" bezeichnet. Hey Junge !!! Was bist du denn für Einer ?? Ausserdem kriegst du ein dickes "Daumen runter" dafür, dass du uns den Code nicht vorgeführt hast. TH-cam ist nix für "Dich" !!! Lass es sein.

    • @daBAAAAM
      @daBAAAAM 4 ปีที่แล้ว +2

      Könnte man als Höflichkeit bezeichnen, aber wundert mich nicht, dass du damit total überfordert bist. Er erklärt prinzipiell den ganzen Code und du beschwerst dich, dass er ihn nicht "vorführt"? Was für ein schwachsinniges Kommentar ist das denn..