Forum: Mikrocontroller und Digitale Elektronik Zeitmessung zwischen High und Low


von Shaggy (Gast)


Lesenswert?

Hallo, ich hab mal folgende Frage und zwar habe ich am UC ein 
Eingangssignal, und möchte von diesem die Zeit zwischen High und Low 
Pegel messen, und wollte mal fragen wie ich dies am besten machen kann. 
Den Wert würde ich gerne in einer Variablen abspeichern und soll mit der 
nächsten Messung überschrieben werden.
Also Signal geht auf High-> Starte Timer Signal geht auf Low-> Timer 
ende wert speichern. das ganze in C.

: Verschoben durch User
von m.n. (Gast)


Lesenswert?

Du bist zwar im falschen Forum gelandet, aber hier steht auch die 
Lösung: Beitrag "Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88"
Ich hoffe, es ist Dir nicht zu kompliziert.

von Shaggy (Gast)


Lesenswert?

ups, das wusste ich nicht...

doch schon etwas kompliziert, wie müsste ich das den machen, wenn ich 
den Timer0 benutze, dort wird es ja mit nen 16bit Timer erklärt.

von Shaggy (Gast)


Lesenswert?

Also mein Ergebnis müsste irgendwo zwischen 0,1 und 10 ms liegen.

Also dachte ich an nen Prescaller von 64 bei 1MHZ.
 Also TCCR0 |= (1<<CS00)|(1<<CS01);
sind 1562,5 Hz ein Interrupt
ISR (TIMER0_OVF_vect)
{ ++zeit;}

float zeit;

nur wie kann ich es jetzt machen das der timer bei PC2 high startet und 
bei PC2 low stoppt.

von m.n. (Gast)


Lesenswert?

Shaggy schrieb:
> wie müsste ich das den machen, wenn ich
> den Timer0 benutze, dort wird es ja mit nen 16bit Timer erklär

Im Prinzip genauso, es kommen nur öfter Überläufe vor.
Den µC mit nur 1 MHz laufen zu lassen und/oder mit Vorteiler zu 
arbeiten, schadet der erreichbaren Auflösung enorm: mache es nicht!

von Shaggy (Gast)


Lesenswert?

ok was muss ich den schreiben um den Timer bei Pegeländerung zu starten 
und wieder zu stoppen? Das ist jetzt noch das einzige wo ich hänge.

von Shaggy (Gast)


Lesenswert?

Hab jetzt mal so probiert, hab den uc im Moment ohne Quarz am laufen 
wird ich später noch ändern.

TCCR0A = (1<<WGM01); // CTC Modus
TIMSK |= (1<<OCIE0A);
OCR0A = 10-1; // wird alle 10 us ausgeführt
sei();

ISR (TIMER0_COMPA_vect)
{zeit++;}

jetzt nur noch die frage wie starte und stopp ich den Timmer Signal 
abhänig.

von M. K. (sylaina)


Lesenswert?

Shaggy schrieb:
> ok was muss ich den schreiben um den Timer bei Pegeländerung zu
> starten
> und wieder zu stoppen? Das ist jetzt noch das einzige wo ich hänge.

Benutze hierfür den Pin-Change-Interrupt ;)

PS: Pack deinen Code mal in die entsprechend Code-Flags, also so:

[c] dein C-Code ["/c"]

(ohne die " natürlich).

Macht den Spass lesbarer ;)

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.