Forum: Mikrocontroller und Digitale Elektronik Timer aus den AVR Tutorial


von Sven Löffler (Gast)


Lesenswert?

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.

von Sinusgeek (Gast)


Lesenswert?

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.

~

von Sven Löffler (Gast)


Lesenswert?

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.

von Thommy (Gast)


Lesenswert?

Vieleicht zeigst du uns mal deinen Code dann kann man evntuell mehr dazu 
sagen warum es nicht funktioniert
gruß Thommy

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Welches Beispiel? Poste mal deinen Quellcode und wie du die LED 
angeschlossen hast.

von Sven Löffler (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Gast (Gast)


Lesenswert?

>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

von Sven Löffler (Gast)


Lesenswert?

Wie bekomme ich denn die Frequenz auf 1 Mhz ? Über die Fuse bits geht 
das ja nicht. Vielleicht mit der Zeile:

.equ XTAL = 1000000

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Sven Löffler (Gast)


Lesenswert?

ok, vielen Dank ! :)

Habe es versucht, aber leider ohne Erfolg. Die LEDs leuchten alle immer 
noch dauernd.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Attiny2313 meine ich natürlich.

von Gast (Gast)


Lesenswert?

>... 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
Noch kein Account? Hier anmelden.