Hallo zusammen, ich versuche mich gerade in das Thema Timer einzuarbeiten. Ich habe bisher alles nur mit Schleifen und Unterprogrammen gemacht. Nun möchte ich doch langsam mal voran kommen. Das Tutorial für den Timer ist ja sehr gut beschrieben. Soweit habe ich auch alles verstanden. Leider bekomme ich das bei mir in der Praxis nicht richtig zum laufen. Ich benutze einen Attiny 2313. Also habe ich erstmal die .include Datei verändert. Den Stack habe ich auch angepaßt. Der µC arbeitet auch mit 4 MHz. Trotzdem kann ich keinerlei Veränderung sehen - ich verwende das STK500. Den Vorverteiler habe ich auf 1024 gestellt. Also habe ich es mit dem 16 Bit Timer Versucht. Leider auch hier ohne Erfolg. Woran könnte das liegen ? Vielen Dank im Voraus ! Viele Grüße Sven P.S. Entschuldigt bitte diese Anfängerfragen.
Was konkret möchtest Du mit dem Timer realisieren? Ich frage deshalb, weil es viele Möglichkeiten gibt, mit einem Timer zu arbeiten. Eine oft anzutreffende Anwendung ist das Erzeugen eines regelmäßigen Taktes zur Synchronisation verschiedener Aufgaben wie Tastenentprellung, Drehgeberauswertung, Zeitzählung, Impulserzeugung, usw... Dazu ist - der Vorteiler einzustellen, - Betriebsart und ggf. Zählumfang einzustellen, - der zu benutzende Interrupt freizugeben, - das I-Flag im SREG zu setzen, um Interrupts global freizugeben, - der Interrupt-Vektor auf die Adresse der ISR einzutragen, - die ISR zu schreiben. Je nach Betriebsart ist in der ISR. ggf noch der nächste Timer-Interrupt-Termin zu setzen. Braucht man von einem Timer nur einen Interrupt, so bietet sich der CTC-Modus an, das erspart das Setzen des nächsten Termins in der ISR. Braucht man mehrere Interrupts, bietet sich das Nutzen beider Compare-Einheiten an, wobei in der ISR der Compare-Wert um das Intervall erhöht wird. Oftmals sieht man noch die Nutzung des Überlauf-Interrupts mit Vorladen des Timers in der ISR. Dies ist bei neueren AVRs aufgrund der Compare-Einheiten auch bei den 8-Bit-Timern nicht mehr zeitgemäß. Der 16-Bit-Timer ist auch noch mit ICP ausgestattet, das ist ein spezieller externer Interrupt, der beim Pegelwechsel (in Hardware) den aktuellen Zählerstand des Timrs in die ICP-Register kopiert, wodurch auch bei verzögertem ISR-Aufruf (bedingt z.B. durch andere Interrupts) recht genaue Messungen von Impulsen (Periodendauer, Impulsdauer) möglich sind. Neben dem Auslösen von Interrupts können die Timer mittels der Compare-Einheiten auch direkt an einem (leider fest verdrahtetem) Pin wackeln, was zur Erzeugung von festen oder variablen Frequenzen genutzt werden kann (Toggle-Mode) oder zum Erzeugen von PWM mit festem oder variablen Tastgrad. Im Normalfall (als Timer ) zählt der Timer Controllertakte (direkt oder über Vorteiler), es lassen sich aber auch externe Impulse über die Zähleingänge (T0, T1) zählen. Längere Verzögerungen erreicht man durch Software-Timer. Dies sind Variablen, die (nebenbei, also neben der normalen Aufgabe eines Timers) durch einen Timer-Interrupt (direkt oder über Jobflag) hoch oder runter gezählt werden und beim Erreichen des vorgesehenen Wertes ein Ereignis auslösen. Ein Timer kann oftmals mehrere zyklische Jobs verwalten, indem man im Timer die Aufgaben anhand der Zählerstände von Nachteilern (Zählvariablen) verteilt. Du siehst also, das Thema Timer ist recht komplex und vielseitig. Um den richtigen Timer und die richtige Betriebsart zu finden, muss die zu erledigende Aufgabe schon recht genau formuliert werden. ~
Erstmal vielen Dank für die ausführliche Erläuterung ! Also eigentlich möchte ich erstmal ganz einfach nur eine LED zum Blinken bekommen. Damit ich überhaupt erstmal den Umgang mit dem Timer verstehe. Das Beispiel im AVR Tutorial ist ja eigentlich genau das.
Vieleicht zeigst du uns mal deinen Code dann kann man evntuell mehr dazu sagen warum es nicht funktioniert gruß Thommy
Hallo zusammen, ist ist nun der Quellcode für den Tiny2313 mit Timer0 und 1024 Teiler. Der Tiny steckt im STK500 Board. Er arbeitet mit 4 Mhz.
>Er arbeitet mit 4 Mhz
4 000 000 Hz / 1024 = 3906,25 Hz
3906,25 Hz / 256 = 15Hz -> da mußt Du aber schnell kucken!
schalte mal die Taktfreq auf 1MZ
Wie bekomme ich denn die Frequenz auf 1 Mhz ? Über die Fuse bits geht das ja nicht. Vielleicht mit der Zeile: .equ XTAL = 1000000
Sven Löffler wrote: > Wie bekomme ich denn die Frequenz auf 1 Mhz ? Über die Fuse bits geht > das ja nicht. Vielleicht mit der Zeile: > > .equ XTAL = 1000000 Nein. Diese Zeile informiert den Assembler darüber, welche Taktfreuquenz herrscht. Aber Einstellen kann man damit gar nichts. Mach mal folgendes timer0_overflow: ; Timer 0 Overflow Handler out PORTB, leds inc leds ; <<---- hier geändert reti damit sollten am PORT B die Leds mit unterschiedlicher Geschwindigkeit toggeln. Irgendeine oder mehrere der Leds müsste damit eigentlich schon blinken, so schnell kannst du deinen Tiny gar nicht getaktet haben :-)
ok, vielen Dank ! :) Habe es versucht, aber leider ohne Erfolg. Die LEDs leuchten alle immer noch dauernd.
Beim Wechsel vom Atmega8 auf den Attiny2323 musst du auch die Bits beim TIMSK anpassen. Besser ist es hier die symbolische Schreibweise (s.u.) zu benutzen als absolute Werte (alte Source). Bei den Symbolen zieht sich der Assembler das richtige Bit aus dem Includefile.
1 | .include "tn2313def.inc" |
2 | |
3 | .def temp = r16 |
4 | .def leds = r17 |
5 | |
6 | .org 0x0000 |
7 | rjmp main ; Reset Handler |
8 | .org OVF0addr |
9 | rjmp timer0_overflow ; Timer Overflow Handler |
10 | |
11 | main: |
12 | ldi temp, LOW(RAMEND) ; Stackpointer initialisieren |
13 | out SPL, temp |
14 | |
15 | |
16 | ldi temp, 0xFF ; Port B auf Ausgang |
17 | out DDRB, temp |
18 | |
19 | ldi leds, 0xFF |
20 | out PORTB, leds ; STK500: Alle LED aus |
21 | |
22 | ldi temp, ((1<<CS02)|(1<<CS00)) ; Teiler = 1024 |
23 | out TCCR0, temp |
24 | |
25 | ldi temp, (1<<TOIE0) ; TOIE0: Interrupt bei Timer Overflow |
26 | out TIMSK, temp |
27 | |
28 | sei |
29 | |
30 | loop: rjmp loop |
31 | |
32 | timer0_overflow: ; Timer 0 Overflow Handler |
33 | out PORTB, leds |
34 | inc leds |
35 | reti |
>... 15Hz -> da mußt Du aber schnell kucken!
Wieso? Das ist hektisches Blinken. Kann man Null Prob gucken.
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.