www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Welcher Timer für Timer?


Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute.
Ich habe jetzt wohl zum dritten Mal die Bedienungsanleitung vom
mega128, Kapitel Timer gelesen, aber verstehe nur Bahnhof. Ich will
einen einfachen Timer programmieren, autoreload, der mit einen Zeittakt
von 10 ms oder auch mehr, wenn 10 nicht geht, macht.
Ich weiß dass ich einen Timer im Autoreload - verfahren Programmieren
muss. Es muss ein Register geben, wo der Reloadwert reingeschrieben
wird. Irgendwo muss man einen Interrupt freigeben. Ich finds nicht. Da
steht so viel Zeugs dass ich nicht verstehe mit Pins aktivieren und
deaktivieren ...
Kann es mir jemand mal ganz einfach für Blöde erklären?

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Autoreload sagt mir nichts, und den Mega128 habe ich auch nicht. Aber
beim Mega8 ist es ganz einfach.

Du mußt wissen, welchen CPU Takt Du hast. Nehmen wir einfach mal 4 MHz
an.

Zuerst mußt Du die Clock-Options setzen, TCCR0 für Timer 0. Nehmen wir
mal einen Teiler von 8. Dann gibt's alle 256 * 8 = 4096 Takte einen
Overflow, den Du als Interrupt behandeln kannst.

4096 Takte entsprechen in etwa 1 ms bei 4 MHz (4000000 Hz hat eine
Periodendauer von 1/4000000 = 0.00000025 s = 0.00025 ms, * 4096 ergibt
1.024 ms), wenn Du also im Interrupt-Handler einen Zähler mitführst,
und bei 10 eine Aktion ausführst, hast Du einen 10 ms Takt.

In C wäre das dann sowas in der Art:

void init_timer(void)
{
    TCCR0 = 1 << CS01;
    TIMSK = 1 << TOIE0;
}

SIGNAL(SIG_OVERFLOW0)
{
    static char cnt;

    if (++cnt % 10 == 0)
    {
        cnt = 0;
        func();
    }
}

wobei func() dann alle 10 ms aufgerufen wird.

Falls Du nicht weiter kommt, sag doch etwas genauer wo es hängt,
damit wir nicht bei Adam und Eva anfangen müssen.

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. Ich glaube, damit komme ich gut weiter. Das Problem sind die die
zig Modis und das jedes Register irgendwie drei Mal da rumschwirrt. Das
scheint aber eine Besonderheit vom Mega128 zu sein. Ich werde Dein Demo
mal ausprobieren.
Ich hätte jetzt statt "static char" ein "unsigned int" verwendet.
Macht das einen Unterschied?

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variable muss static sein, char reicht hier. Wenn sie nicht static wäre,
würde sie bei jedem Interrupt lokal neu angelegt und hätte ihren alten
Wert vergessen. Static ist so wie eine globale Variable, sichtbar ist
sie jedoch nur in dem Kontext, in dem sie definiert wurde.
Allerdings würde ich doch einen 10ms Interrupt vorziehen...

Uwe

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und nein. Du kannst natürlich auch mit unsigned int zählen. Das ist
allerdings ein bißchen verschwenderisch (2 Byte statt 1 Byte für eine
Variable, die eh nur bis 10 zählen soll). Allerdings muß es static
sein, weil sonst von einem zum anderen Funktionsaufruf der Wert
"vergessen" wird.

Variablen, die in Funktionen als static deklariert sind, werden am
Anfang auf 0 initialisiert, und behalten immer den Wert, den sie
zuletzt hatten. Bei Variablen in Funktionen, die nicht static sind, ist
der Wert vor dem expliziten Setzen undefiniert, kann also alles mögliche
sein, und mit hoher Wahrscheinlichkeit nicht das, das Du erwartest.

Alternativ hätte man die Variable auch global machen können.

Wenn die Register drei mal rumschwirren, dann möglicherweise deshalb,
weil es drei voneinander unabhängige Timer gibt?

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Uwe:

> Allerdings würde ich doch einen 10ms Interrupt vorziehen...

Zeig mal.

Wenn es der Timer-Overflow sein soll, dann gibt's bei 4 MHz Takt nur
die Möglichkeiten für 0.512 ms, 4.096 ms, 16.384 ms und 65.536 ms.

Oder weißt Du mehr als ich? Den Systemtakt krank anzupassen oder eine
externe Timer-Clock zu verwenden ist ja irgendwie keine Lösung, wenn es
nicht zwingend sein muß.

Es war übrigens ein Rechenfehler drin. Bei CLK/8 kommt man natürlich
bei 4 MHz auf 0.512 ms, die 4096 waren falsch im Kopf gerechnet, und
hätten 2048 sein müssen.

Autor: flyingwolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<<Wenn die Register drei mal rumschwirren, dann möglicherweise deshalb,
<<weil es drei voneinander unabhängige Timer gibt?
Genau das hab ich nicht mehr verstanden. Es schein nur ein Timer zu
sein, den man aber drei mal einstellen kann oder muss ?!?
Ist aber auch egal. Erst mal genz herzlichen Dank. Ihr habt mir sehr
geholfen.

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat der Mega128 nicht 4 Timer?
2 mal 8-Bit und 2 mal 16-Bit?

...

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.