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?
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? "
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
Ö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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.