Hallo zusammen, wie kann bitte der Timer1 starten und wieder stoppen. Es geht darum, dass es verschiedene Zeit gemessen werden. Danke in Voraus
:
Verschoben durch User
Da gebe ich mir jetzt mal soviel Mühe mit der Antwort, wie du mit der Frage ... bsf T1CON, TMR1ON, A ;starten bcf T1CON, TMR1ON, A ;stoppen
Das wäre doch mal ein Thema für unseren Josef G. Eine Sprache, die darauf optimiert ist, Timer1 zu starten. Alle anderen Anforderungen sind egal.
Simon schrieb: > Es geht darum, dass es verschiedene Zeit gemessen werden. Will man mehrere Zeiten messen, läßt man den Timer durchlaufen und zieht einfach die Start- und Stoppzeiten voneinander ab. Oftmals haben Timer dafür Captureinterrupts, dann kann man sogar zyklusgenau messen.
Simon schrieb: > Es geht darum, dass es verschiedene Zeit gemessen werden. "verschiedene Zeiten" In welchem Bereich: Nanosekunden oder Stunden?
John schrieb: > In welchem Bereich: Nanosekunden oder Stunden? Auflösung, Genauigkeit, Wertebereich einer Meßaufgabe festzulegen ist doch nur was für Weicheier. Wie soll man den einen Thread endlos in die Länge ziehen, wenn alles unbedingt Wichtige schon zu Anfang verraten wird.
Wer hier den Thread in die Länge zieht... Die Frage wurde ja schon mit der ersten Antwort beantwortet.
Dürüm schrieb: > Wer hier den Thread in die Länge zieht... Die Frage wurde ja schon mit > der ersten Antwort beantwortet. Fragt sich nur, wie sinnvoll die Antwort ist. Wenn jemand im Wasser treibt und ruft, dass er nicht schwimmen könne, ist es zwar formal korrekt, ihm ein Buch "Schwimmen lernen für Dummies" zuzuwerfen, aber so richtig hilfreich ist es nicht. Zumal wir ja unsere Pappenheimer kennen, die gerne mit Vollgas in die falsche Richtung fahren und dann fragen, wie man dafür die Handbremse löst.
:
Bearbeitet durch User
Karl H. schrieb: > Fragt sich nur, wie sinnvoll die Antwort ist. > > Wenn jemand im Wasser treibt und ruft, dass er nicht schwimmen könne, > ist es zwar formal korrekt, ihm ein Buch "Schwimmen lernen für Dummies" > zuzuwerfen, aber so richtig hilfreich ist es nicht. Die Antwort zielte nur darauf ab eine halbwegs vernünftig formulierte Frage zu bekommen. Das ganze andere Gelaber ist doch eigentlich sinnlos ...
Volker S. schrieb: > Die Antwort zielte nur darauf ab eine halbwegs vernünftig formulierte > Frage zu bekommen. Das ganze andere Gelaber ist doch eigentlich sinnlos > ... Das restliche Gelaber zielt genau in die gleiche Richtung: Dem TO klar zu machen, worin sein erster und gröbster Fehler besteht.
@ Danke an alle Ist so auch richtig? T1CONbits.TMR1ON = 1 // start T1CONbits.TMR1ON = 0 // stop Peter D. schrieb: > Will man mehrere Zeiten messen, läßt man den Timer durchlaufen und zieht > einfach die Start- und Stoppzeiten voneinander ab. So ?: register union Timers ut1; ut1.bt[0] = TMR1L; ut1.bt[1] = TMR1H;
Ne Simon schrieb: > @ Danke an alle > Ist so auch richtig? > > T1CONbits.TMR1ON = 1 // start > T1CONbits.TMR1ON = 0 // stop Da fehlen Semikola. Simon schrieb: > Peter D. schrieb: >> Will man mehrere Zeiten messen, läßt man den Timer durchlaufen und zieht >> einfach die Start- und Stoppzeiten voneinander ab. > > So ?: > register union Timers ut1; > > ut1.bt[0] = TMR1L; > ut1.bt[1] = TMR1H; Wo wird denn da was voneinander abgezogen ? BTW.: welchen Compiler verwendest du ? <edit> und sag mal was du für Zeiten (Signale) messen willst. Peter D. 's Hinweis mit dem Capture könnte da schon passen ...
:
Bearbeitet durch User
Volker S. schrieb: > Da fehlen Semikola. @ T1CONbits.TMR1ON = 1 ;// start T1CONbits.TMR1ON = 0 ; // stop Volker S. schrieb: > Wo wird denn da was voneinander abgezogen ? sei: [code] register union Timers ut1; unsigned long t1; ut1.bt[0] = TMR1L; ut1.bt[1] = TMR1H; ..... ut2.bt[0] = TMR1L; ut2.bt[1] = TMR1H; // t Value t1 = ... [\code] Ich Weiss es nicht :-( Volker S. schrieb: > BTW.: welchen Compiler verwendest du ? @ c18 Volker S. schrieb: > <edit> und sag mal was du für Zeiten (Signale) messen willst. > Peter D. 's Hinweis mit dem Capture könnte da schon passen ...
Wenn du bei [code] das "ode" weg lässt wird's besser. <edit> ach nee, der Backslash ist das Hauptproblem </edit> Und nochmal, sag erst was du eigentlich tun willst, sonst läuft das möglicherweise in die falsche Richtung ...
:
Bearbeitet durch User
Simon schrieb: > register union Timers ut1; > > ut1.bt[0] = TMR1L; > ut1.bt[1] = TMR1H; Abhängig davon, wie die union definiert ist und der Endianness kann das schiefgehen. Angenommen, du willst den Timerwert in eine 16bit Integer schreiben:
1 | uint16_t timer_1; |
2 | |
3 | timer_1 = TMR1L; |
4 | timer_1 |= (uint16_t)TMR1H << 8; |
geht sicher.
:
Bearbeitet durch User
Simon schrieb: >
1 | > register union Timers ut1; |
2 | > unsigned long t1; |
3 | > |
4 | > ut1.bt[0] = TMR1L; |
5 | > ut1.bt[1] = TMR1H; |
6 | > ..... |
7 | > |
8 | > ut2.bt[0] = TMR1L; |
9 | > ut2.bt[1] = TMR1H; |
10 | > |
11 | > // t Value |
12 | > t1 = ... |
13 | > |
14 | > |
> Ich Weiss es nicht :-(
Du brauchst 2(!) Zeiten.
Machst du doch aiuch nicht anders, wenn du deine Kinder beim Radfahren
mit einer Armbanduhr "stoppen" sollst.
Wenn Franz losfährt, merkst du dir 13 Uhr 30. Wenn Anna losfährt merkst
du dir 13 Uhr 34. Franz kommt um 13 Uhr 48 ins Ziel, war also 13:48 -
13:30 gleich 18 Minuten unterwegse. Wohingegen Anna um 13:56 ins Ziel
kommt und daher nur 13:56 - 13:34 = 22 Minuten unterwegs war.
Und genauso wie du dir im täglichen Leben das rumrechnenmit Stunden und
Minuten vereinfachen kannst, indem du erst mal alles auf Minuten
bringst, genauso kannst du dir am µC das Leben erleichtern, indem du
erst mal das Lowbyte und das Highbyte vom Timer in eine einzige Zahl
zusammenfasst, mit der sich dann einfacher rechnen lässt.
1 | unsigned int Zeit1, Zeit2; |
2 | |
3 | |
4 | Zeit1 = TMR1H << 8 + TMR1L; |
5 | |
6 | etwas später |
7 | |
8 | Zeit2 = TMR1H << 8 + TMR1L; |
9 | |
10 | die Zeit dazwischen ist daher |
11 | |
12 | unsigned int Laufzeit = Zeit2 - Zeit1; |
Karl H. schrieb: > Zeit1 = TMR1H << 8 + TMR1L; Lieber in zwei Zeilen lassen, weil wenn im 16Bit R/W Mode, dann muss zuerst TMR1L gelesen werden, da kein direkter Zugriff auf das eigentliche TMR1H möglich ist. TMR1H wird beim Lesezugriff auf TMR1L in ein Buffer Register geschrieben auf das dann zugegriffen wird ... (OK, Abarbeitung von rechts nach links, aber ich würde mich nicht darauf verlassen). Das Resultat von TMR1H << 8 wird vermutlich NULL sein.
:
Bearbeitet durch User
Volker S. schrieb: > (OK, Abarbeitung von rechts nach links, aber ich würde mich nicht darauf > verlassen). Hast schon recht. Mein Fehler. Die Reihenfolge der Auswertung ist NICHT garantiert. Das hat nichts mit der Precedence zu tun.
Karl H. schrieb: > Die Reihenfolge der Auswertung ist NICHT garantiert. Das hat nichts mit > der Precedence zu tun. Ja stimmt, war ich auch gerade falsch. Dachte an so was wie a = b = c = 0;
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.