Das geht am einfachsten über die Manipulation des TCCR1B Registers für Timer 1.Also mein Ziel ist es einen Timer mit einem Taster zu starten bzw. genau dann eine Variable hochzaehlen lassen. Wenn ich einen anderen Taster druecke moechte ich mir per UART den Zaehlerstand ausgeben lassen. Wie kann man denn so etwas machen ?
Zuerst setzt du bei einem Tastendruck der Starttaste das TCNT1 Register auf 0
TCNT1=0;
Danach Stellst du das TCCR1B auf den gewünschten Teilerfaktor ein.
TCCR1B=0b00000100; //für Prescaler :256
Der Timer 1 zählt nun hoch.
Bei Druck auf die Taste Stopp holst Du Dir den Wert aus dem TCNT1 Register
ui_zeit=TCNT1;
und stoppst den Counter 1
TCCR1B=0b00000000;
Eventuell brauchst Du noch eine Überlaufvariable, weil der TCNT1 nur 16 Bit breit ist.
Dann muß natürlich der TIMER1 Overflow Interrupt aktiviert werden.
Die Tastenabfrage kannst Du jeweils in einen Interrupt packen.
Start z.B. in den INT0 und Stopp in den ICP1 Interrupt, weil damit das ICR Register des Timers 1 mit dem aktuellen Zählerstand gefüllt wird, den man dann nur noch auszulesen braucht.
Den ermittelten Wert kannst Du dann mit itoa bzw. ltoa in einen String verwandeln und über die serielle Schnittstelle ausgeben.
Ich würd bei der Stopp Taste ( Interrupt ) ein Flag setzen , der Timerwert speichern und dann erst in der Hauptroutine den Sendestring generieren und an den USART ausgeben.
Dadurch wird die Interruptroutine auch sehr kurz.
Du hast natürlich bei der Aktivierung des TIMER 1 ein paar Prozessortakte verloren, weil natürlich zuerst die Interruptroutine aufgerufen und das TCCR1B Register beschrieben wird, bevor der Timer 1 zu zählen beginnt.
Kommt drauf an, wie genau die ermittelte Zeit sein muß und welchen Prescaler Du verwendest.
Ne andere Methode:
Ich persönlich verwende auch eine relative Zeitmessung mit freilaufendem Timer.
Der Zählerstand wird bei Druck auf die Starttaste ausgelesen und abgespeichert.
Bei Druck auf die Stopptaste wird der Zählerstand erneut ausgelesen und der vorher ermittelte Wert angezogen.
Wenn Du unsigned Variablen verwendest funktioniert das auch bei einem Überlauf des Timers, oder der Überlaufvariable.
Lesezeichen