mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer aus den AVR Tutorial


Autor: Sven Löffler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sinusgeek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

~

Autor: Sven Löffler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thommy (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welches Beispiel? Poste mal deinen Quellcode und wie du die LED 
angeschlossen hast.

Autor: Sven Löffler (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven Löffler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Sven Löffler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, vielen Dank ! :)

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

.include "tn2313def.inc"

.def temp = r16
.def leds = r17
 
.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler
 
main:
        ldi     temp, LOW(RAMEND)     ; Stackpointer initialisieren
        out     SPL, temp
       
  
        ldi     temp, 0xFF            ; Port B auf Ausgang
        out     DDRB, temp
 
        ldi     leds, 0xFF
        out     PORTB, leds           ; STK500: Alle LED aus
 
        ldi     temp, ((1<<CS02)|(1<<CS00)) ; Teiler = 1024
        out     TCCR0, temp
 
        ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer Overflow
        out     TIMSK, temp
 
        sei
 
loop:   rjmp    loop
 
timer0_overflow:                      ; Timer 0 Overflow Handler
        out     PORTB, leds
        inc     leds
        reti


Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Attiny2313 meine ich natürlich.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>... 15Hz -> da mußt Du aber schnell kucken!

Wieso? Das ist hektisches Blinken. Kann man Null Prob gucken.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.