Forum: Mikrocontroller und Digitale Elektronik AVR Timer1 manuell zurücksetzen


von Dieterbln (Gast)


Lesenswert?

Hi,

Ich hab mich jetzt ca. eine Stunde durch Bücher und das www gefühlt. 
Erfolglos. Daher die Frage: gibt es beim Timer1 (und generll) die 
Möglichkeit den Zähler manuell im Programm auf 0 zurük zu bringen?

Ich möchte eine Stopuhrfunktion irgendwann zu einem beliebigen Zeitpunkt 
starten und auch anhalten (und dann eben den eventuell verbleibenden 
Rest im Timer löschen)

Grüße,
Dieter

von Niels H. (monarch35)


Lesenswert?

Ich nehme an, es handelt sich um AVR-Megas.

Es ist nicht sonderlich schön, aber die Timer können im Betrieb ganz 
normal beschrieben werden. Bei 16Bit Timern musst du nur auf die 
Reihenfolge High/Low beachten.

von Dieterbln (Gast)


Lesenswert?

Hi Niels,

Also ich meine nicht das OCR1AH/OCR1AL-Register (Vergleichsregister) 
sondern das Register im Zähler selber, also das, was der Timer 
hochzählt. Eben dafür brauche ich den Befehl bzw. den Namen des 
Registers. Ich nehme an, erst L-Byte schreiben, dann H-Byte. Danke :)

Gruß,
Dieter

von Niels H. (monarch35)


Lesenswert?

Um die erste Zeile meines Postings aufzugreifen um eine entscheidene 
Information zu erhalten, die für die Beantwortung der Frage absolt 
Elementar ist: _Um welchen Kontroller handelt es sich?_

von Karl H. (kbuchegg)


Lesenswert?

Dieterbln wrote:
> Hi Niels,
>
> Also ich meine nicht das OCR1AH/OCR1AL-Register (Vergleichsregister)
> sondern das Register im Zähler selber, also das, was der Timer
> hochzählt. Eben dafür brauche ich den Befehl bzw. den Namen des
> Registers. Ich nehme an, erst L-Byte schreiben, dann H-Byte. Danke :)
>

Das Register ist das TCCR1 Register und zumindest beim gcc
brauchst du dich nicht um die Reihefolge kümmern, die macht
der Compiler selber richtig.

   TCNT1 = 10835;


Hol dir von Atmel das zu deinem Prozessor gehörende Datenblatt.
Da sind alle Register drinnen. Im gcc heissen die entsprechenden
Register völlig gleich wie im Datenblatt, mit nur einem Unterschied:
Du brauchst dich nicht um High/Low Register (TCNT1H / TCNT1L)
kümmern, sondern tust so, als ob das Register 16 Bit breit wäre
(TCNT1)

von Dieterbln (Gast)


Lesenswert?

Hoppala, stimmt. Es handelt sich um einen atmega8. Mein vorhaben ist:

Zähler auf 0 zurücksetzen
Zähler über TIMSK Starten

Wenn Stopuhr fertig, dann Zähler über TIMSK stoppen und wieder auf die 
"zähler auf 0 setzen"-Funktion springen.

Soweit alles fertig, es fehlt nur der Befehl zum Register zurücksetzen 
:)

von Niels H. (monarch35)


Lesenswert?

Hast du denn kein Datenblatt von dem Mega8? Da ist der Name des 
Zählregisters mehr als einmal erwähnt.
1
TCCNT1 = 0;

sollte funktionieren.

von Johannes M. (johnny-m)


Lesenswert?

Dieterbln wrote:
> Zähler auf 0 zurücksetzen
Wie schon von anderen erwähnt: TCNT1 ist das Zauber-Register

> Zähler über TIMSK Starten
Mit TIMSK kannst Du keinen Zähler starten...

> Wenn Stopuhr fertig, dann Zähler über TIMSK stoppen und wieder auf die
...und auch nicht stoppen!

von Dieterbln (Gast)


Lesenswert?

Okay, TIMSK steuert die Interrupte. Ich ging davon aus, dss, wenn ich 
den Interrupt für den Timer abschalte, der Timer nicht weiter läuft. Wie 
wäre der richtige Weg, wenn ich den Timer abschalten will (oder 
anhalten)?

Danke für TCNT1! :)

von Niels H. (monarch35)


Lesenswert?

TCCR1B über die ClockSel-Flags (CSxx). Wenn die auf 0 stehen, stoppt der 
Zähler...

von Johannes M. (johnny-m)


Lesenswert?

Dieterbln wrote:
> Okay, TIMSK steuert die Interrupte. Ich ging davon aus, dss, wenn ich
> den Interrupt für den Timer abschalte, der Timer nicht weiter läuft. Wie
> wäre der richtige Weg, wenn ich den Timer abschalten will (oder
> anhalten)?
Schau doch BITTE ins Datenblatt und/oder ins AVR-Tutorial bzw. 
AVR-GCC-Tutorial!

von Peter D. (peda)


Lesenswert?

Dieterbln wrote:
> Okay, TIMSK steuert die Interrupte. Ich ging davon aus, dss, wenn ich
> den Interrupt für den Timer abschalte, der Timer nicht weiter läuft.

Glücklicher Weise ist das nicht der Fall.

Sonst müßte sich jeder PWM-Benutzer bei Dir bedanken, daß haufenweise 
unnütze Interrupts seine CPU zuballern.

Timer müssen immer unabhängig von Interrupts weiter laufen!

Nur so lassen sich auch auf den Zyklus genaue Zeitintervalle erzeugen 
(Frequenzmesser, RTC usw.).


Peter

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.