Forum: Compiler & IDEs timerzählerwert


von anfänger (Gast)


Lesenswert?

TCNT0 = -2;
welchen zweck hat die -2 beim zählen vom timer. von wo nach wo wird
damit jetzt eigentlich gezählt.

mfg anfänger

von johnny.m (Gast)


Lesenswert?

Der Timer zählt immer nach oben. Beim Übergang von 0xff auf 0x00 gibts
nen Überlauf-Ereignis. Die obige Darstellung macht sich das zunutze,
indem sie einen Zweierkomplement-Wert als Startwert in das Zählregister
schreibt (-2 gibt in hex 0xfe). D.h. der Timer läuft alle zwei Takte
über. Normal schreibt man TCNT0 = 0xff - 2; Aber die andere Methode
geht bei Werten, die kleiner sind als die maximal im Zweierkomplement
darstellbare negative Zahl, auch.

Gruß

Johnny

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Normal schreibt man TCNT0 = 0xff - 2;

Nein, man müsste

TCNTO = 0x100 - 2;

schreiben für das Äquivalent.  Wenn man nun aber nur 8-bit-
Zahlen hat, ist 0x100 == 0x00, und man kann die -2 direkt
hinschreiben.

von anfänger (Gast)


Lesenswert?

TCNTO = 0x100 - 2;
TCNTO =  - 2;

also ist der anfangszählwert bei beiden gemäss oben "126", wenn ich
das richtig sehe?

von johnny.m (Gast)


Lesenswert?

@Jörg:
Sorry, hast natürlich recht. Habs oben ja noch korrekt hingeschrieben
(-2d = 0xfe) und dann nicht aufgepasst!

Aber wie gesagt: Mit 8 Bit lassen sich im Zweierkomplement nur die
Zahlen von -128 bis +127 darstellen. Die obige Schreibweise mit
funktioniert bei dem Timer also nur bei Startwerten bis -128 (Bei nem
16-Bit-Timer dementsprechend bis -32768). Bei größeren muss man dann
die andere Methode benutzen und an das denken, was Jörg geschrieben
hat!

Gruß

Johnny

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, es funktioniert, weil der Zählerwert (per definitionem)
ein 8bit unsigned ist, damit lässt sich der Wertebereich von
0..255 überstreichen.  Entsprechend wird die Zuweisung von -2
implizit durch die Hardware als eine Zuweisung von 254
angesehen.  Der Form halber sollte man eigentlich einen
typecast davor schreiben:

TCNT0 = (uint8_t)-2;

von anfänger (Gast)


Lesenswert?

TCNT0 = (uint8_t)-2; ist dann 255-2=253, warum wie oben 254.
ich dachte 8bit-gesetzt bedeutet "255".

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja, alle 8 bit gesetzt ist 255.  Aber darum ging es nicht,
sondern es ging ja darum, wie -2 denn in diesem Falle interpretiert
wird, und das ist 0x100 - 2, also 0xfe.

Der Überlauf(-interrupt) erfolgt ja nicht beim Erreichen der 255,
sondern beim Umschalten von 255 auf 0.

von anfänger (Gast)


Lesenswert?

TCNT0 = -2; // 2 * 256 = 512 cycle ???

warum heisst es in der rc5-routine aus diesem forum, dass es 512 cycle
sind?

von Peter D. (peda)


Lesenswert?

Weil der Prescaler auf 256 gesetzt wurde.


Peter

von Di P. (drpepper) Benutzerseite


Lesenswert?

und warum ist der timer dann noch benutzbar? wenn er nur von 254 über 
255 nach 0 zählt und dann wieder auf 254 gesetzt wird?

von Karl H. (kbuchegg)


Lesenswert?

Was meinst du mit benutzbar?

von Di P. (drpepper) Benutzerseite


Lesenswert?

hm, gute frage. ich meine einen timer, der 256 mal zählt, bis er einen 
overflow wirft. Z.b. eine ordentlich feine PWM ist mit einem Timer, der 
zwischen 3 verschiedenen Werten herumzählt nicht mehr so gut machbar 
(oder ich sehs zumindest nicht).

ich habe es jetzt letzlich so gelöst, dass ich auf 8MHz mit prescaler 
"1" jeden zweiten overflow (8bit) die rc5-routine von Peter laufen lasse 
(ohne die TCNT0-Zeile). Noch ists nicht getestet, aber ich sehe (bis 
jetzt) keinen grund, warum das nicht aufs gleiche herauskommen sollte.

von Karl H. (kbuchegg)


Lesenswert?

Deine Fragw läuft doch letztendlich darauf hinaus, dass du fragst:
Was ist 512?
Ist das jetzt 1*512
oder          2*256
oder          4*128
oder          8*64
....

Anscheinend hast du übersehen, dass Peter einen Vorteiler von 256 
gewählt hat. Wenn der 3 Timertakte abzählen soll, dann sind das 3*256 
CPU Takte. Da ist also noch jede Menge Zeit zwischen 2 Timeroverflows.

von Di P. (drpepper) Benutzerseite


Lesenswert?

das hatte ich nicht übersehen. ich habe mich nur an die beschreibung die 
dem codebeispiel beiliegt erinnert, wo der timer noch als für andere 
aufgaben benutzbar beschrieben wird.
Das ist er ja natürlich auch, aber weil ich vorhabe, die rc5-aufgabe auf 
einen timer zu legen, der eine 8-bit-pwm erzeugt möchte ich, dass der 
timer auch volle 8 bit durchzählt. in peters fall tut er das ja nicht.
Meine anfängliche Irritation über die TCNT0-Zeile rührte daher, dass ich 
noch einen versteckteren Nutzen des Eingriffs ins Zähler-Register 
vermutete. Wie du ja beschrieben hast, kann ich mir die 512 Zyklen auch 
auf andere Arten zusammenbauen...

Frohe Ostern :)

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.