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


von flyingwolf (Gast)


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?

von Zotteljedi (Gast)


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.

von flyingwolf (Gast)


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?

von Uwe Nagel (Gast)


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

von Zotteljedi (Gast)


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?

von Zotteljedi (Gast)


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.

von flyingwolf (Gast)


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.

von ...HanneS... (Gast)


Lesenswert?

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

...

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.