PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Genaues Abstoppen mit Asuro Timern



thomasonfire
24.09.2008, 18:59
Hi,

ich habe wichtige Frage zu den Timern auf dem Asuro. Bin
fortgeschrittener Anfänger.

Ich will eine Zeit mit möglichst genauer Auflösung stoppen (Prescaler 1)
und die maximal zu messende Zeit liegt bei 318 ys (mikrosekunden), also
wenn er länge läuft und noch nicht gestoppt wurde, dann kann er auch mit
dem zählen aufhören oder so.

1. Frage:
Welchen Timer kann/darf ich hernehmen? ich würde gerne den 16-bit timer
(t1) hernehmen, weil der länger laufen kann und man so keine Variable
hochzählen muss (was wieder die zeit ungenauer macht).

(Weiß soviel, dass T1 zur Motoransteuerung benutzt wird und T2 für die Infrarot Schnittstelle, möglich wär aber auch ein zweites mal zurück auf PWM zu initialisieren)

2. Frage:
Warum kommen scheinbar zufällige Werte (zwischen 8 und 45) hier als
Ergebnis raus?


TCCR0 &= ~(1<<CS02 | 1<<CS01 | 1<<CS00); //Timer0 stoppen (vorsichtshalber)
TCNT0=0; //Timer0 zurücksetzen
TCCR0 |= (1<<CS00); //Starte Timer0
Sleep(123); //Irgendeine Zeit warten
TCCR0 &= ~(1<<CS00); //Stoppe Timer

jetzt müsste man am besten noch einstellen, dass das Programm einen
Interrupt macht, wo eine Variable bei jedem Timerüberlauf hochgezählt
wird. Weiß leider nicht wie Interrupt Service Routinen bei AVR
funktionieren.


zeit = TCNT0; (Zeit auslesen)

Naja falls jemand einen Fehler findet oder mir irgendwie weiterhelfen
kann. Würd mich über Antworten freuen.

Gruß Thomas

PS: Datenblatt ist hier:
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf falls es
sich jemand anschauen mag.

Besserwessi
24.09.2008, 21:09
Für eine wirklich genaue Zeitmessung gibts die ICP funktion, allerdings nur beim 16 Bit Timer (Timer1 beim Mega8). Da kann auch längere Zeiten zyklengenau messen. Im wissenbereich unter timer-avr ist da eine Beispiel code drin. Da ist auch gleich ein beispiel für den Interrupt der eine Variable hochzählt mit drin.

thomasonfire
24.09.2008, 21:25
danke für deine Antwort.

Schaut ja sehr umfangreich aus diese Funktion.

hab aber noch einige Bedenken:


// Code für Mega48 / Mega88 / Mega 168 / ...
// mit leichten Anpassungen auch für Tiny2313, Mega16, Mega32,...

geht der auch mit atmega8L ?

dauert des nicht irgendwie wenn der die CPU in den "IDLE" Mode setzt?

Ich wüsste jetzt auch garnicht wie ich mit dem Programm die Zeit starte/stoppe wenn ich den Code probieren würde.

Besserwessi
25.09.2008, 18:45
Auf den IDLE Mode könnte man auch verzichten. Beim Mega8L könnte die UART ein kleine wenig anders sein (anderer Name für High Byte). Auch bei irgendwelchen Falgs ist da glaube ich eine 1 zu viel dran am namen. Die Funktionen sind aber sonst gleich.

Der Code stopt die Zeit für eine Periode am ISP Pin.