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?
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.
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?
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
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?
@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.
<<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.
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.