PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aktuellen Timer Wert auslesen + umwandeln zu Dezimal



Ineedhelp
03.09.2008, 19:39
Hi

ich versuche mich gerade daran den aktuellen Timer-Wert von Timer1 (Timer0 wird schon benutzt) auszulesen. (Tiny 2313)

ich habe ihn so initialisiert...


void initTimer1(void)
{
TCCR1B |= (1<<CS00)|(1<<CS01);
TCNT1 = 1;
TIMSK |= (1<<TOIE1);
}


nun zählt der Timer ja von 0 bis 64 und fängt wieder bei 0 an.
Ich habe keinen Interrupt definiert, ich will lediglich zu einem unbestimmten Zeitpunkt im programmverlauf die Zahl haben, die gerade im Timer steht.

diese finde ich ja im register TCNT1

also habe ich mir gedacht, ich definiere eine 2te variable und schreibe den Wert aus TCNT1 darein

das sieht so aus


volatile uint8_t ValueTimer=0;
...
ValueTimer = TCNT1;


der aktuelle Timer-Wert liegt jetzt doch binär in der ValueTimer Variable vor. Nun wollte ich die einzelnen Bits durchgehen (0/1 * 2^0 + 0/1 * 2^1+...) um einen dezimalen Wert davon zu machen.

Mein Problem ist nun, wie greife ich auf die einzelnen Bits in der ValueTimer Variable zu. Geht das überhaupt?

Oder gibt es vielleicht einen viel einfacheren Weg für mein Vorhaben?

Danke

Hubert.G
03.09.2008, 19:51
Was willst du mit dem dezimalen Wert anfangen?

fhs
03.09.2008, 20:00
Hallo,

TCCR1B |= (1<<CS00)|(1<<CS01);
schreibe besser TCCR1B |= (1<<CS10)|(1<<CS11);

nun zählt der Timer ja von 0 bis 64 und fängt wieder bei 0 an
Nein, er zählt bis zum Overflow! Die 64 beziehen sich nur auf die Zählfrequenz; und die hast Du auf F_CPU/64 gestellt. Wenn Du möchtest, dass nur bis 64 gezählt wird, müsstest Du den CTC Modus verwenden - siehe Datenblatt.

MfG

Fred

Ineedhelp
03.09.2008, 20:11
achja stimmt, war ja der vorteiler
danke

mhm, dann geht mein vorhaben eh nicht
dachte, ich kann so schnell im programm entscheidungen fällen (ähnlich wie zufallsfunktion) (zb if timer wert ist gerade dann)

ich denke nochmal drüber nach

allerdings wüsste ich noch gerne, wie es jetzt mit dieser frage aussieht
"Mein Problem ist nun, wie greife ich auf die einzelnen Bits in der ValueTimer Variable zu. Geht das überhaupt? "

fhs
03.09.2008, 20:20
Hallo,

...Problem ist nun, wie greife ich auf die einzelnen Bits in der ValueTimer Variable zu. Geht das überhaupt?
wie Du das am besten anstellst, hängt auch von Deinem Ziel ab. Ich schließe mich deshalb der Frage von Hubert.G an, was Du eigentlich erreichen willst. Maskieren wäre die Standardlösung; mit Assembler hast Du noch mehr Möglichkeiten.

Deine Frage nach einer Dezimalzahl ist mir nicht klar.

Gruß

Fred

markusj
03.09.2008, 21:23
Öhm, wenn ich das richtig verstanden habe, will er den Dezimalwert der Variable (sei es zum Bleistift 10111001) als Zahl (185) haben.
Dazu musst du nichts weiter tun, die Zahl wird zwar als binäre Repräsentataion gespeichert, wenn du damit rechnest, wird sie aber gemäß den allgemeingültigen (Rechen-)Regeln nach behandelt.

Willst du die einzelnen Bits dennoch haben, kannst du mit X = ValueTimer & (1 << Bit) auf das Bit zugreifen, von null an gezählt.
Kurze Erklärung: Du bastelst dir mit der Schiebeoperation eine Maske, die nur das Bit gesetzt hat, das du haben möchtest. "Verunded" mit dem zu untersuchenden Wert kommt genau dann eine Zahl größer Null heraus, wenn das Bit gesetzt war, ansonsten gibts ne glatte Null

mfg
Markus

thewulf00
03.09.2008, 22:00
Naja, ganz einfach:
Du musst nur dafür sorgen, dass sich der Timer autom. resetttet und keinen Interrupt auslöst. Dann kannst Du jederzeit im Hauptprogramm das Timer-Zählregister auslesen und in IF-Schleife benutzen (oder erst in eine Variable stecken). Dieser Wert ist bereits so, wie Du ihn brauchst.

Für Zufallsereignisse z.B. einfach if (REG % 2 == 0), REG steht für das Timerregister und ist natürlich nur ein Platzhalter.

Ineedhelp
03.09.2008, 23:26
okay, danke an euch alle

jetzt habe ich schon wieder was gelernt
allerdings muss ich erstmal überlegen, wie ich das nun in meinem code verbaue und ob ich das noch mache oder ich einen anderen weg gehe

werde ich morgen mal erledigen

drew
04.09.2008, 12:55
Hallo,
soweit ich weiß gibt es eine einfachere Methode um Zufallszahlen zu erzeugen:
Die Funktion int rand(void); in stdlib.h erzeugt Zufallszahlen.

Ich muss zugeben, dass ich das auf dem Atmel noch nicht probiert hab. Ich habs aber kurz mal eingegeben und zumindest beim Übersetzen keine Fehler bekommen.

Drew