timerzählerwert

Gast #363859
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
Gast #363862
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
Moderator Persönliche Seite #363863
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;
Persönliche Seite #1225952
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.
#1226131
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.
Persönliche Seite #1226191
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren