Forum: Compiler & IDEs Timer Zeit Berrechnen


von Turrican (Gast)


Lesenswert?

Hallo

Mal ne kurze Frage hab mir gerade eben das avr gcc Tutorial zum Thema 
Timer durchgelesen. Doch ich hab es noch nicht richtig verstanden.
Ich möchte Einen lm75 Temperatur Sensor auslesen und anscheinend muss 
man dem Sensor nach jedem Auslesevorgang gewisse Zeit lassen, damit er 
die nächste Wandlung starten kann.
Also habe ich mir gedacht, okay verwendest du den 16 Bit Timer des 
ATMEGA8 und konfigurierst ihn so das der Temperatur Sensor alle 10 
Sekunden ausgelesen wird. Da ich aber noch Anfänger hab ich da so meine 
Schwierigkeiten und wäre euch für jede Hilfe dankbar.

Zu meinem System ATMEGA8 mit 8Mhz interner RC Oszillator.
16 Bit Timer soll im CTC Modus laufen und einen compare Interrupt 
auslösen.
ich Möchte nun das ich alle 10 Sekunden den Sensor auslesen kann.
Wäre nett wenn jemand von euche einen Beispielcode hätte damit ich es 
mir anschauen kann wie mans richtig macht.

Noch was anderes das man den Prozessortakt durch den den Prescaler wert 
teilen muss um auf den Timer Takt zu kommen ist mir klar aber wie 
rechnet man den Wert aus der ins 16 Bit Timer Register geschrieben 
werden muss um die LED alle 10 Sekunden blinken zu lassen.

Danke für eure Hilfe

Gruß

Turrican

von Karl H. (kbuchegg)


Lesenswert?

Turrican schrieb:

> Noch was anderes das man den Prozessortakt durch den den Prescaler wert
> teilen muss um auf den Timer Takt zu kommen ist mir klar

Na, das ist doch schon die halbe Miete.

Dein Haupttakt ist 8Mhz
Du hast eine Vorteiler von sagen wir mal 1024

Das heißt dein Timer kriegt einen Takt von

   8000000 / 1024 = 7812.5 Hz

Das heist der Timer zählt in 1 Sekunde bis 7812.5

In 10 Sekunden würde er also bis 78125 zählen, in 100 Sekunden bis 
781250 etc.

Jetzt müsste der Timer bis 78125 zählen, kann er aber nicht. Als 16 Bit 
Timer kommt er nur bis 65535, danach gehts wieder bei 0 weiter.

Jetzt kommts drauf an, wie wichtig dir die 10 Sekunden sind. Für so 
einen Durchmarsch von 0 bis 65535 benötigt der Timer wie lange?
78125   ....  10 sec
65536    ....   x

  x = 10 * 65536 / 78125  = 8.3 sec

Wenn dir anstelle von 10 sekunden 8.3 Sekunden auch reichen, dann ist 
die einfachste Lösung: du läst den Timer einfach mit einem Vorteiler von 
1024 laufen und klemmst dich an den Overflow Interrupt, der alle 8.3 
Sekunden ausgelöst wird.

Wenn du die 10 Sekunden genauer einhalten willst, dann muss dein Timer 
was machen?
Da gibts jetzt mehrere Möglichkeiten. Was du willst ist auf jeden Fall 
78125 Takte abzählen. In einem Durchgang durch den Timer gehts nicht, 
also müssen die 78125 Takte auf 2mal aufgeteilt werden.

Wenn dein Timer zb bis 78125 / 2 = 39062 zählt und danach einen 
Interrupt auslöst und wieder bei 0 anfängt, dann sind bei jedem 2-ten 
Interrupt 78124 Takte vergangen. Und das ist wahrscheinlich genau genug 
für deine Zwecke.

Also: CTC Modus einschalten. Oberen Wert auf 39061 setzen. Dazu noch den 
Interrupt aktivieren und in der ISR eine globale Variable um 1 erhöhen. 
Wenn die Variable 1 ist, dann wieder auf 0 setzen und deine 10-Sekunden 
Aktion ausführen.

> aber wie rechnet man den Wert aus der ins 16 Bit Timer Register
> geschrieben werden muss um die LED alle 10 Sekunden blinken zu lassen.

Eigentlich ist das doch sehr simpel, wenn man einfach nur mal logisch 
überlegt, was so ein Timer macht und das die Anzahl der Pulse ein Mass 
für die Zeit ist. Für den Rest braucht man ausser dem 3-Satz und ein 
bischen Multiplizieren und Divideren nicht viel.

von iCarly (Gast)


Lesenswert?

Mann Karl Heinz, hast du eine Ausdauer.
Daumen hoch.

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.