{"id":171,"date":"2014-04-03T11:56:09","date_gmt":"2014-04-03T09:56:09","guid":{"rendered":"http:\/\/romantrapp.at\/?page_id=171"},"modified":"2014-05-06T11:19:03","modified_gmt":"2014-05-06T09:19:03","slug":"timer","status":"publish","type":"page","link":"https:\/\/www.romantrapp.at\/?page_id=171","title":{"rendered":"Timer"},"content":{"rendered":"<p>Timer sind Hardware-Bausteine in einem Mikrocontroller, die unabh\u00e4ngig vom sonstigen Programmablauf von 0 bis zu einem Maximalwert z\u00e4hlen k\u00f6nnen. In einem AVR-Mikrocontroller gibt es 8-Bit-Timer, die von 0 bis 255 z\u00e4hlen k\u00f6nnen, und 16-Bit Timer, die von 0 bis 65.535 z\u00e4hlen k\u00f6nnen. Bei einem ATmega8 gibt es Timer1 als sehr m\u00e4chtigen 16-Bit-Timer sowie Timer0 und Timer2 als 8-Bit-Timer. Timer k\u00f6nnen daf\u00fcr benutzt werden, regelm\u00e4\u00dfig Aktionen auszuf\u00fchren, Zeiten exakt zu messen, unterschiedliche Arten von Signalen zu erzeugen oder externe Impulse zu z\u00e4hlen. Im Datenblatt des jeweiligen Mikrocontrollers sind die Timer-Register und die Einstellungsm\u00f6glichkeiten im Detail beschrieben.<\/p>\n<h2>Timer im normalen Timer-Modus<\/h2>\n<p>Im normalen Timer-Modus z\u00e4hlt ein Timer von 0 bis 255 (beim 8-Bit-Timer0\/-Timer2) bzw. bis 65.535 (beim 16-Bit-Timer1). Wenn der Maximalwert erreicht ist, springt der Wert des Timers auf 0, und der Timer f\u00e4ngt von vorne an zu z\u00e4hlen.<\/p>\n<p>Beim \u00dcbergang vom Maximalwert zu 0 kann man einen Timer-Interrupt ausl\u00f6sen und infolgedessen eine Interrupt-Service-Routine anspringen lassen. Da es nicht immer passend ist, den Timer im Takt des Systemtaktes z\u00e4hlen zu lassen, kann man durch Vorschalten eines Vorteilers (Prescaler) den Prozessortakt des AVR fAVR in gewissen Stufen verlangsamen. Bei einem ATmega8 kann man den Systemtakt (= Prozessortakt) direkt oder um den Faktor 8, 64, 256, 1024 verlangsamt an den\u00a0 Timer0 bzw. Timer1 geben. F\u00fcr den Timer2 gibt es zus\u00e4tzlich noch die Vorteiler-Werte 32 und 128. In Bild 1 ist dargestellt, wie der Systemtakt durch den Prescaler vorgeteilt wird, der Timer in diesem geteilten Takt fTimer immer wieder von 0 bis zum Maximalwert z\u00e4hlt und beim Sprung auf 0 jeweils ein Timer-Interrupt ausgel\u00f6st wird.<\/p>\n<h2 align=\"LEFT\">Timer mit Interrupt<\/h2>\n<p align=\"LEFT\">Im folgenden Programm wird \u2013 unabhangig vom normalen\u00a0 Programmablauf \u2013 durch den Timer ein Interrupt ausgel\u00f6st, in dessen Interrupt-Service-Routine zwei LEDs getoggelt, also ein- und ausgeschalten werden.<\/p>\n<p align=\"LEFT\">[file lang=&#8220;c&#8220;]wp-content\/plugins\/file-inliner\/snippets\/Timer1-Interrupt.c[\/file]<\/p>\n<h2 align=\"LEFT\">Timer\u00a0mit Startwert \u2013 Sekundentakt<\/h2>\n<p>Durch die Wahl des Timers (8 Bit oder 16 Bit) und des Prescalers kann man einen Timer grob konfigurieren. M\u00f6chte man genaue Frequenzen bzw. Zeiten einstellen, dann kann man dies erreichen, indem man den Timer nicht von 0, sondern von einem Startwert z\u00e4hlen l\u00e4sst, wie in Bild 2 zu sehen. Die Zeit zwischen den Timer-Interrupts wird dadurch verk\u00fcrzt bzw. die Frequenz vergr\u00f6\u00dfert.<\/p>\n<p>Zum Toggeln einer LED im Sekundenrhythmus stellt man folgende \u00dcberlegungen an:<\/p>\n<p>Die Systemfrequenz fAVR ist 16 MHz. Die Periodendauer TAVR betr\u00e4gt 1 \/ 16 MHz = 62,5 ns. Der Prescaler wird auf 1024 gestellt, wodurch sich die Periodendauer, mit der der Timer getaktet wird, auf 64 \u03bcs verl\u00e4ngert. Alle 64 \u03bcs z\u00e4hlt also der Timer um 1 weiter. Anders gesagt: Ein \u201eTick\u201c des Timers dauert 64 \u03bcs. Die gew\u00fcnschte Zeit ist 1 s = 1000000 \u03bcs. Es werden also 1000000 \u03bcs \/ 64 \u03bcs = 15625 Ticks ben\u00f6tigt und nicht die vollen 65.536 Ticks, die der Timer insgesamt bis zum \u00dcberlauf machen kann. Deshalb wird mit dem Z\u00e4hlen nicht bei 0 angefangen, sondern bei 65536 \u2013 15625 = 49911. Der Timer z\u00e4hlt von 49911 bis 65535 und springt dann auf 0, wobei der Timer-Interrupt ausgel\u00f6st wird.<\/p>\n<h2 align=\"LEFT\">Timer im CTC-Modus<\/h2>\n<p>Man kann den Timer eines AVR-Mikrocontrollers so konfigurieren, dass er nicht bis zu seinem maximalen Wert z\u00e4hlt, sondern nur bis zu einem Vergleichswert, dem Compare-Wert (engl. CTC = clear timer on compare match). Dadurch wird die Zeit eines Durchlaufs entsprechend verk\u00fcrzt, und es lassen sich unterschiedliche Frequenzen &#8211; z. B. zur Tonerzeugung &#8211; im Hintergrund erzeugen, ohne das Hauptprogramm durch Spr\u00fcnge in eine Interrupt-Routine und Startwertzuweisungen unterbrechen zu m\u00fcssen (Bild 1 und 2). Das Ausgabesignal am zugeordneten Ausgabepin beh\u00e4lt seine Frequenz bei, bis ein neuer Compare-Wert zugewiesen wird.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Timer sind Hardware-Bausteine in einem Mikrocontroller, die unabh\u00e4ngig vom sonstigen Programmablauf von 0 bis zu einem Maximalwert z\u00e4hlen k\u00f6nnen. In einem AVR-Mikrocontroller gibt es 8-Bit-Timer, die von 0 bis 255 z\u00e4hlen k\u00f6nnen, und 16-Bit Timer, die von 0 bis 65.535 z\u00e4hlen k\u00f6nnen. Bei einem ATmega8 gibt es Timer1 als sehr m\u00e4chtigen 16-Bit-Timer sowie Timer0 und [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":169,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"page-templates\/full-width.php","meta":{"footnotes":""},"class_list":["post-171","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.romantrapp.at\/index.php?rest_route=\/wp\/v2\/pages\/171","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.romantrapp.at\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.romantrapp.at\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.romantrapp.at\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.romantrapp.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=171"}],"version-history":[{"count":7,"href":"https:\/\/www.romantrapp.at\/index.php?rest_route=\/wp\/v2\/pages\/171\/revisions"}],"predecessor-version":[{"id":881,"href":"https:\/\/www.romantrapp.at\/index.php?rest_route=\/wp\/v2\/pages\/171\/revisions\/881"}],"up":[{"embeddable":true,"href":"https:\/\/www.romantrapp.at\/index.php?rest_route=\/wp\/v2\/pages\/169"}],"wp:attachment":[{"href":"https:\/\/www.romantrapp.at\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}