Forum: Mikrocontroller und Digitale Elektronik Timer als Stopuhr geeignet Atmega?


von Sina A. (sinapse)


Lesenswert?

Hallo,

ist der Timer1 auf dem Atmega328P überhaupt als Stopuhr geeignet.

wollte den timer mit setzen der CSC bits starten (Auswahl der clock 
source). und dann beim Interrupt im CTC mode (compare match OCR1A 
Register) wieder stoppen (CSC bits alle wieder auf null).

aber irgendwie sind die Timings versaut... sprich beim ersten Interrupt 
nach dem start braucht der timer irgendwie mehr zeit zum hochfahren?

wenn ich den timer laufen lasse (ohne stop wird der Interrupt immer 
wieder getriggert) kommen die Interrupts alle sauber im richtigen 
Timing. Nur direkt nach dem start braucht der irgendwie länger???


stimmt das? steht dazu irgendwo mehr im datenblatt wegen hochfahrzeiten? 
womit baue ich dann eine saubere stopuhr?

lg

von Wolfgang (Gast)


Lesenswert?

Sina A. schrieb:
> stimmt das? steht dazu irgendwo mehr im datenblatt wegen hochfahrzeiten?
> womit baue ich dann eine saubere stopuhr?

Das kommt drauf an, wie lange Zeiten du messen möchtest, welche 
Auflösung du brauchst und wie genau die Zeitmessung sein soll.

von Thomas E. (thomase)


Lesenswert?

Sina A. schrieb:
> nach dem start braucht der timer irgendwie mehr zeit zum hochfahren?

Irgendwie? Also gefühlt oder wie hast du das gemessen?

Sina A. schrieb:
> stimmt das? steht dazu irgendwo mehr im datenblatt wegen hochfahrzeiten?
> womit baue ich dann eine saubere stopuhr?

Nein, nein, so nicht.

Lass den Timer laufen und zähle im CTC-Int die Millisekunden. Was willst 
du denn überhaupt messen?

von Sina A. (sinapse)


Lesenswert?

Hallo,

muss ein pin auf high/low setzen und dann nach 5-500us wieder den pin 
togglen bzw. ein bit einlesen.

wollte das so machen:
-pin setzen
-timer counter TCNT=0 und OCRA=n setzen (n entspricht einem wert 
zwischen 5-500us)
-starten des timers per CSC bits setzen
-im compare match interrupt den timer stoppen und den pin togglen bzw. 
ein bit einlesen

gemessen hab ich das pin togglen mit dem oszi... die gemessenen zeiten 
haben immer einen unererwarteten wert. etwa 9 bis 16us zu lange.

wenn ich den timer nicht stoppe, sondern den interrupt immer wieder 
kommen lasse, ist die erste zeitperiode nach dem timerstart länger als 
die folgenden pin toggles.

von Thomas E. (thomase)


Lesenswert?

Sina A. schrieb:
> wollte das so machen:

Nein!

Dein Freund heißt ICP. Das ist ein Eingangspin, der genau dafür da ist.

- Timer1 läuft dauerhaft im Normal Mode
- ICP auf steigende Flanke
- Im ersten Interrupt ICR Register merken und auf fallende Flanke 
umschalten
- Im zweiten Interrupt liefert dir ICR - Merkwert die exakte Anzahl der 
Takte, die du dann nur noch umrechnen musst.

- Zurück nach steigende Flanke für die nächste Messung.

Wenn es noch ein wenig schneller gehen soll, kannst du das Interrupt 
Flag auch in der Main pollen. Dann sparst du die Zeit für die 
IRQ-Aufrufe. Darfst natürlich währenddessen nichts anderes machen, also 
keine Interrupts.
Oder als Mittelding in der (ersten) IRQ auf das zweite Flag warten.

5µs ist zwar recht sportlich aber auch nicht unmöglich. Und zwar exakt 
und reproduzierbar.

Daß der Controller mit min. 16MHz, besser noch mit 20MHz läuft, sollte 
klar sein.

: Bearbeitet durch User
von Sina A. (sinapse)


Lesenswert?

hallo,

es handelt sich um ein 1wire bus... ich muss also nicht zeiten messen 
zwischen flanken, sondern im richtigen takt flanken generieren. oder im 
richtigen moment den 1wire lesen.

dazu ist der icp doch nicht geeignet?

nichts desto trotz war es mir neu, dass der timer beim start anscheinend 
ein bissl braucht um loszurennen. wär davon ausgegangen, dass die 
taktung mit setzen der CSC bits sofort loslegt und somit der timer 
keinen verzug haben duerfte

von Einer K. (Gast)


Lesenswert?

Sina A. schrieb:
> nichts desto trotz war es mir neu, dass der timer beim start anscheinend
> ein bissl braucht um loszurennen.
Warum möchtest du im Irrtum verharren?
Ich, an deiner Stelle, würde mir dabei reichlich ***** vorkommen.

Tipp:
> Wer in die falsche Richtung läuft,
> muss sich nicht beeilen.

von m.n. (Gast)


Lesenswert?

Sina A. schrieb:
> dass der timer beim start anscheinend
> ein bissl braucht um loszurennen.

Das ist jetzt aber keine Entdeckung von Dir, sondern eine reine 
Erfindung.

Sina A. schrieb:
> ich muss also nicht zeiten messen
> zwischen flanken, sondern im richtigen takt flanken generieren.

Das macht man dann mit der Output-Compare Funktion.
Sofern das bei Dir nicht klappt, liegt es sicherlich an Zeile 42.

von Thomas E. (thomase)


Lesenswert?

Sina A. schrieb:
> dazu ist der icp doch nicht geeignet?

Sicherlich nicht. Aber bis eben wolltest du noch eine Stoppuhr bauen.

Sina A. schrieb:
> nichts desto trotz war es mir neu

Das ist mir auch neu. Und jedem anderen auch. Wie du das hinkriegst, 
erschließt sich mir allerdings nicht. Aber da bin ich wohl auch nicht 
der einzige.

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.