Forum: Mikrocontroller und Digitale Elektronik PIC18F4550 timer starten und wieder stoppen


von Simon (Gast)


Lesenswert?

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
von Volker S. (vloki)


Lesenswert?

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

von Lästermaul (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von John (Gast)


Lesenswert?

Simon schrieb:
> Es geht darum, dass es verschiedene Zeit gemessen werden.

"verschiedene Zeiten"
In welchem Bereich: Nanosekunden oder Stunden?

von Peter D. (peda)


Lesenswert?

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.

von Dürüm (Gast)


Lesenswert?

Wer hier den Thread in die Länge zieht... Die Frage wurde ja schon mit 
der ersten Antwort beantwortet.

von Karl H. (kbuchegg)


Lesenswert?

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
von Volker S. (vloki)


Lesenswert?

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 
...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Simon (Gast)


Lesenswert?

@ 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;

von Volker S. (vloki)


Lesenswert?

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
von Simon (Gast)


Lesenswert?

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 ...

von Volker S. (vloki)


Lesenswert?

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
von Max H. (hartl192)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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;

von Volker S. (vloki)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

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
Noch kein Account? Hier anmelden.