Verständnisfrage Timer und deren Befehle

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Verständnisfrage Timer und deren Befehle

      Hallo,
      ich habe da einige grundsätzliche Fragen zu den Timern und dessen Steuerung. Ich habe weder hier
      noch im Netz bisher die Antworten gefunden , die Licht in meine dunkle Fragenwelt bringen würden.

      Soweit ich es verstehe, sind Timer und Counter das gleiche Bauteil. Z.B. Timer 0
      Ein 8-Bit Zähler , mit einem Takteingang, 8 Preset -Eingängen und 8 Ausgängen. Umgeben von mehreren Registern
      die mit dem Zähler kooperieren.
      Ob der Zähler ein Timer oder ein Counter sein soll, wird mit "CONFIG TIMERx = " festgelegt.
      Ist der Zähler ein Counter. wird der Takteingang mit T0 verbunden. Der Zähler zählt dann von aussen kommende
      Ereignisse (L-H-Flanke , H-L-Flanke).
      Ist der Zähler ein Timer, zählt er den Systemtakt geteilt durch den Prescaler. Da der Systemtakt eine konstante Zeit
      ist, lassen sich durch das Zählen der Zeiteinheiten verschiedenlange Zeitabstände erzeugen.
      Ich hoffe, bis jetzt alles richtig verstanden zu haben.

      Was passiert mit Enable .?? Wird da Spannung auf den Zähler gegeben , damit er arbeiten kann, oder wird der Takt-
      eingang freigegeben ??
      START TIMER : gibt den Takteingang frei, damit gezählt werden kann ?? . Ist aber lt. Hilfe nicht zwingend erforderlich.
      STOP Timer : verriegelt den Takteingang , damit nicht weiter gezählt werden kann?? . Bleibt der Zählerstand erhalten ??
      und was passiert, wenn ich den Zähler wieder starte (START TIMER) ?? , zählt der Zähler dann weiter, oder löscht er vorher
      den Zählerstand und fängt wieder bei 0 an zu zählen ?? .

      Ich denke, das reicht erst mal an Fragen. Damit würde doch wieder etwas Licht in meine verbliebenen grauen kommen.
      Es klingt vielleicht banal für jemand ,der sich damit schon beschäftigt hat, aber mich treibt es um.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Alle Angaben ohne Gewähr!
      enable schaltet die interrupts ein, die vorher durch Angabe der Auslösungsart und Angabe der isr eingerichtet wurden.
      Start und Stop ist so, wie du vermutest. Den Zählerstand beeinflusst das nicht.

      8 Ausgänge??
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Habe ich das bis dahin richtig verstanden ?
      Beispiel : ich habe den Timer als Counter configuriert. Wenn ich ihn anhalten will, damit er
      nicht weiterzählt, befehle ich "STOP TIMER". dann behält der Counter den Zählwert, und ich kann
      ihn in aller Ruhe abfragen ( Zählerstand=Timer) ??
      Wenn ich den Zähler dann neu starten will, muss ich als erstes den Zählerstand auf 0 setzen.?
      TIMER=0 : START TIMER
      Wenn hierzu jemand nickt, stelle ich die nächste Frage. a_27_b277ca12

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Hallo Detlef,
      deine direkten Fragen wurden schon beantwortet.

      tschoeatsch schrieb:

      Alle Angaben ohne Gewähr!
      enable schaltet die interrupts ein, die vorher durch Angabe der Auslösungsart und Angabe der isr eingerichtet wurden.
      Start und Stop ist so, wie du vermutest. Den Zählerstand beeinflusst das nicht.

      Aber das gelbe vom Ei ist Timer1. Mit zusätzliche Vergleichsfunktion(Pulsabstandsmodulator oder die Capture- Funktion)
      Alle verfügbare Timer(je nach Typ) sind voneinander unabhängig und können sogar verknüpft werde ohne das dein Hauptprogramm ausgebremst wird.
      Einmal vor Do-Loop die Timer „sagen“ wann und was sie machen sollen dann rattern und rattern die im Hintergrund, solange kein Reset kommt und ausreichend Energie vorhanden ist.
      Betrachte und behandele die Timer als eigenständig. Wären sie auch, wenn sie nicht am Systemtakt hängen würden.
      Möchte nicht Thema verfehlen oder nerven aber deine Anfrage ist immer noch ein interessantes Thema bezüglich Laufzeiten, direkt Bit im Register setzen oder sogar Timer im MSR- Bereich zum Master zu machen usw.

      Bitte entschuldige meine Ausschweifung.
    • Ja, wieder was gelernt.
      Jetzt zum Thema Timer. Ich möchte, das der Timer , nachdem er gestartet ist, nach den eingestellten
      Abbruchbedingungen (Interrupt) stehen bleibt. Will sagen, läuft nur einmal durch.
      Kann ich in der Interrupt Routine den Timer einfach stoppen ?

      Timer_isr:
      STOP TIMER
      ..mach was
      Return

      Muss ich den Timer wieder nullen, oder fängt er nach START TIMER wieder automatisch von 0 an,
      wenn ich keinen Startwert vorgebe ??

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • @fredred
      habe deinen Beitrag gerade gelesen.

      fredred schrieb:

      Bitte entschuldige meine Ausschweifung.
      Ist doch alles recht interesssant, und wenn es mal nicht direkt den Kern trifft, haken wir das einfach
      als Wissen am Rande ab. Kann man ja auch immer gebrauchen.

      Ich weiss, Timer sind eine Wissenschaft für sich, richtig bedient, sind sie ganz schön mächtig.
      Ich tu mir aber oft mit den Registern schwer, drum versuch ich die Bascom-Befehle zu nutzen,
      soweit es möglich ist.
      PWM und so ist im Moment nicht das Thema.

      Ich lass mal die Katze aus den Sack.
      Das sind alles Vorüberlegungen, die in einem Frequenzzähler einfließen sollen.

      Nun kommt bestimmt der Einwand, da gibt es doch schon so viele Beispiele.
      Ja, aber ich möchte das selber machen und vor allem verstehen ,warum es wie funktioniert.
      Copy und Paste kann ich auch, und dann ein Fehler , wo suchen a_56_df238249 , wenn ich nicht weiß,
      wie es funktioniert. a_27_b277ca12

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Bitte beachte Enable (Interrupt) aktiviert das Unterprogramm. Kannst aber zu jeder Zeit in der Hauptschleife ein Disable Timer(x) setzen. Also nicht ansprechen.

      Hat aber alles nichts mit dem aktivierten Timer zu tun. „Er rattert und rattert“ schön so.

      Also:
      Timer_isr:
      STOP TIMER>>> ist wohl nicht durchdacht.
      ..mach was >>>> Ja setze was. z.B. eine Aktion wie Timer „Nullen“ oder "A = B".
      Return

      Dekaman schrieb:

      haken wir das einfach
      als Wissen am Rande ab.
      So soll es sein.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von fredred ()

    • fredred schrieb:

      „Er rattert und rattert“ schön so.
      sollte er in meinem Fall aber nicht.

      Ich möchte u.a. den Timer starten und nachdem er die ISR angesprungen hat ,
      nicht mehr "rattern". Er soll erst wieder starten, wenn ich es ihm sage.
      Der Timer soll ein Zeitfenster erzeugen, immer dann , wenn ich es will, und nicht
      kontinuierlich. Darum wollte ich den Timer stoppen, wenn er seine Arbeit getan hat.
      Nach meinem Kenntnisstand würde der Timer , wenn er in die ISR gesprungen ist, doch gleich
      das nächste Zeitfenster erzeugen. Oder ??

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Auf 0 gestellt, wird nur in Spezialfällen, bei Pwm zB. Wenn du eine 0 im timer möchtest, musst du den timer mit 0 laden.
      Der timer läuft auch während der isr, wenn er nicht gestoppt wird weiter.

      Du kannst aber auch bei config timer ein clear_timer=1 rein schreiben. Dann wird der timer bei Erreichen des compare-Werts auf 0 gesetzt.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • tschoeatsch schrieb:

      Der timer läuft auch während der isr, wenn er nicht gestoppt wird weiter.
      Das meinte ich ja. Soll er aber nicht !!!!! a_20_e8d7189d
      Darum der Versuch, den Timer in der ISR zu stoppen. wenn er wieder starten soll, kann
      ich ihn ja immer noch nullen.

      Timer_ISR:
      Stop Timer
      ... mach was
      return
      ... Jahre später
      Timer =0
      Start Timer

      oder so ?(

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Wäre eine Möglichkeit. Wenn dein timer schnell ist, dann zählt der natürlich bis zum Ausführen des stop noch paar Takte weiter. Also es gibt einen Zustand, mit dem der Interrupt ausgelöst wird, dieser timerstand ist dann kleiner als der Stand nach dem Stop. Die Zeit, bis die Register für den Sprung in die isr gerettet werden und der eigentliche Sprung dahin brauchen ja auch Takte, die der timer mehr oder weniger mit zählt.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Du kannst den Timer auch weiter laufen lassen. Du speicherst Dir einfach am Anfang Deiner ISR den Timerstand in eine Variable. Was der Timer dann macht, kann Dir egal sein - Du hast den Wert ja gesichert. Und irgendwann - wenn Du es für richtig hätst, dann setzt Du den Timer auf Null und - egal, wo er stand - zählt er dannvon Null. Starten und Stoppen wäre dann gar nicht unbedingt nötig.

      Quellcode

      1. Deine_ISR:
      2. Timerstand = Timer1
      3. ... mach was
      4. return
      5. ... Jahre später
      6. Timer1 =0
    • @tschoeatsch

      machen wir mal ein Beispiel, ob ich das richtig verinnerlicht habe.

      Timer1 =5536 --> Timer1 mit 5536 vorladen. (Startposition)
      START TIMER1 --> Timer1 zählt jetzt zum Ende durch (bei 65536 --> Interrupt)
      ... Timer fängt bei 0 wieder an zu zählen
      ... im Interrupt wird Timer1 angehalten (STOP TIMER1)
      ... Timer1 Zählwert ist jetzt eingefroren ??
      ... Jahte später
      Timer1=5536 --> Startzählwert
      Start TIMER1
      ... und alles von vorn.

      So stelle ich es mir vor, wenn ich den Timer bis 60000 zählen lassen will.

      oder Denkfehler :?:

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • Für Frequenzmessungen bietet sich die 'input capture unit' an. Eine Flanke am ICP-pin erzeugt eine Kopie vom laufenden timer1 und löst einen interrupt aus. In der isr kann man den Timerstand aus dem capture-Register lesen und mit einen vorherigen vergleichen und die Zeit zwischen den Flanken ausrechnen. Dabei fallen die Laufzeiten für den Sprung in die isr mit mehr in's Gewicht.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • stefanhamburg schrieb:

      Du kannst den Timer auch weiter laufen lassen. Du speicherst Dir einfach am Anfang Deiner ISR den Timerstand in eine Variable. Was der Timer dann macht, kann Dir egal sein - Du hast den Wert ja gesichert. Und irgendwann - wenn Du es für richtig hätst, dann setzt Du den Timer auf Null und - egal, wo er stand - zählt er dannvon Null. Starten und Stoppen wäre dann gar nicht unbedingt nötig.

      Quellcode

      1. Deine_ISR:
      2. Timerstand = Timer1
      3. ... mach was
      4. return
      5. ... Jahre später
      6. Timer1 =0
      Er löst halt wieder einen interrupt aus, wenn es gestoppt wird nicht.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Ich sehe zwei Möglichkeiten:
      1.) Man möchte durch den Timer feste Zeitintervalle haben: Normalerweise steht dann als erste Anweisung in der ISR wieder das Vorladen auf den von Dir (oder einem Tool) berechneten Wert. Da braucht man kein Stop/Start. So erzeugt man zum Beispiel einen Sekundentakt.
      2.) Man benötigt Teile eines Zeitintervalls. Dann kann das mit Stop/Start sinnvoll sein.
    • Mit stop timer1 wird der timer gestoppt und zählt nicht weiter=eingefroren. Er löst auch keinen overflow-interrupt mehr aus.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------