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
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
> 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.
TCNTO = 0x100 - 2; TCNTO = - 2; also ist der anfangszählwert bei beiden gemäss oben "126", wenn ich das richtig sehe?
@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
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;
TCNT0 = (uint8_t)-2; ist dann 255-2=253, warum wie oben 254. ich dachte 8bit-gesetzt bedeutet "255".
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.
TCNT0 = -2; // 2 * 256 = 512 cycle ??? warum heisst es in der rc5-routine aus diesem forum, dass es 512 cycle sind?
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.