-         

Ergebnis 1 bis 9 von 9

Thema: Aktuellen Timer Wert auslesen + umwandeln zu Dezimal

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84

    Aktuellen Timer Wert auslesen + umwandeln zu Dezimal

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hi

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

    ich habe ihn so initialisiert...
    Code:
    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
    Code:
    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

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Was willst du mit dem dezimalen Wert anfangen?
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    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
    Only entropy comes easy. - Anton Checkhov

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84
    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? "

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hallo,
    Zitat Zitat von Ineedhelp
    ...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
    Only entropy comes easy. - Anton Checkhov

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Ö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

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    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.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84
    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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied Avatar von drew
    Registriert seit
    06.04.2005
    Beiträge
    150
    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


Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •