mikrocontroller.net

Forum: Compiler & IDEs timerzählerwert


Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TCNTO = 0x100 - 2;
TCNTO =  - 2;

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: anfänger (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TCNT0 = -2; // 2 * 256 = 512 cycle ???

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil der Prescaler auf 256 gesetzt wurde.


Peter

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst du mit benutzbar?

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Di Pi (drpepper) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.