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