Forum: Mikrocontroller und Digitale Elektronik kurze Zeitabstände messen


von Moin (Gast)


Lesenswert?

Hallo
Wie kann man möglichst genau mit einem der ATMEGAs in Assembler kurze
Zeitabstände mit dem Timer1 messen? Ich möchte die low-Zeit eines
TTL-Signals messen.

Mir ist noch völlig unklar, wie am elegantesten mit fallender Flanke
der Zähler gestartet werden kann.
Das Bilden einer Differenz aus zwei Zählerständen halte ich für
ungünstig, da es möglich sein soll den 16-Bit-Zähler fast völlig
ausnutzen.
Mit Capture möchte ich am Ende bei steigender Flanke den Zählerstand
übernehmen.

Tutorials oder googeln in Foren hat mir bei diesem Problem nicht
weitergeholfen.

Bitte helft mir mit ein Paar Vorschlägen oder Codeschnipseln, die ich
mir dann umschreiben kann.
Vielen Dank.
Moin

von Christof Krüger (Gast)


Lesenswert?

Da wäre es erstmal praktisch zu wissen in welcher Größenordnung die
Zeitabstände denn so sein sollen.

von Jens123 (Gast)


Lesenswert?

Du koenntest die 2 Externen Interupts dafuer missbrauchen...
Wenn das Signal auf LOW geht loesst du den Ersten Int aus, welcher
diesen Interupt Disabelt, und startest den Counter, dieser Zaehlt dann
so lannge, bis das Signal wieder auf High ist und loesst somit den 2ten
Interupt aus, welcher sich Disabelt und zu gleich wieder den ersten
Enabelt stellst den Counter wieder aus...
und so weiter

Nur eine Idee

Moin Jens

von ralf (Gast)


Lesenswert?

Hallo,

wieso willst Du denn kein Input Capture verwenden? Damit kann man doch
den ganzen Timer ausnutzen. Wenn der Timer nicht ausreicht kann man
auch noch auf 32Bit erweitern per Software (Variable als
Überlaufzähler). Sollte ohne Probleme funktionieren. Einfach den Timer
frei laufen lassen und dann immer die Differenz aus aktuellem und altem
Zeitstempel berechnen.

Viele Grüße,

Ralf

von Moin (Gast)


Lesenswert?

Kann man nicht irgendwie den Start (fallende Flanke) genauso triggern
wie das Ende (steigende Flanke - mit Capture)? - Und zwar ohne mehrere
Pins zu verwenden?

@Ralf
Vermutlich denke ich zu kompliziert: Muss ich, wenn ich einen
freilaufenden 32-Bit Zähler baue und mit Capture den Startwert und mit
einem zweiten Capture den Zielwert Capture nicht eine umfangreichere
Auswertung programmieren? Müsste dann nicht überprüft werden, ob es
einem Überlauf gegeben hat oder welcher Wert größer ist, damit richtig
die Differen berechnet wird?
Sehe ich Probleme wo keine vorhanden sind?

Moin

von Eckhard (Gast)


Lesenswert?

Hallo,

kenne ja den ATMEGA nicht aber normalerweise können Timwer auch beim
Overflow einen Interrupt auslösen. In der ISR erhöhst Du dann deinen
Überlaufzähler jeweils um 1.


Eckhard

von Jens123 (Gast)


Lesenswert?

Yap der Timer kann einen Interupt ausloesen..

von Peter D. (peda)


Lesenswert?

"Sehe ich Probleme wo keine vorhanden sind?"

Es sieht auf den ersten Blick schwieriger aus, als es ist.

Ist z.B. der Capture Wert 0xFFFC und ein Überlauf ist passiert, dann
ist das Capture vor dem Überlauf passiert und der Überlauf muß nicht
mitgezählt werden.

Am einfachsten unterscheidet man das dadurch, ob Bit15 gesetzt ist,
d.h. der Wert >=0x8000 oder <=0x7FFF ist.


Peter

von Ralf (Gast)


Lesenswert?

Hallo,

ich kenne den Timer 1 des Controllers jetzt im ersten Augenblick nicht.
Aber ich denke doch, dass man die Flanke der Interruptauflösung
einstellen kann. Einen Overflowinterrupt kann man sich ja, wie oben
schon jemand geschrieben hat, auch generieren. In diesem Overflow
inkrementiert man dann einen Zähler, der dann später das Hiword der
Zeitstempel bildet (wenn du überhaupt 32Bit brauchst). Den Überlauf
fängst Du dann mit Peter's Methode richtig ab. Dann solltest Du dir
noch einen Capture Interrupt erzeugen lassen, in dem Du die Flanke
konfigurierst (steigend/fallend). Dabei ist natürlich zu beachten, dass
du auch genug Zeit zwischen den Flanken hast und deine Interrupts nicht
zu weit verzögert werden, sodass du es nicht rechtzeitig schaffst, die
Flanke umzuschalten. Es wäre also mal sinnvoll, wenn Du schreibst, was
du unter kurzer Zeit verstehst.
Eine Abfrage ob ein Wert größer ist als der andere ist nicht nötig,
wenn der Timer und der evtl. vorhandene Überlaufzähler modulo 2^16
laufen (also von 0x0000 bis 0xFFFF usw.). Dabei berechnest Du
automatisch die richtige Zeitdifferenz aus, wenn Du den alten
Zeitstempel vom aktuellen abziehst. Man kann sich das ganze auch als
Zahlenring vorstellen. Es ist wichtig, dass die Subtraktion unsigned
int durchgeführt wird, sonst geht's nicht.

Bis denne,

Ralf

von Moin (Gast)


Lesenswert?

Hallo
@Ralf
Zu deiner Frage, was ich mit der Zeitmessung machen möchte:
Ich will zwei Projekte verwirklichen
1. Projekt: low-Zeit im Bereich 20us bis 5 sec messen (Genauigkeit 10us
oder 500us - je nach Messbereich)
Ich habe einen Kapazitätsmesser für Elkos gebaut. Je nach Kapazität
verändert sich die low-Zeit des TTL-Signals

2. Projekt (noch etwas weiter entfernt): Ich möchte einen
'Universalzähler/Kurzzeitzähler' bauen und hierbei (was die
Genauigkeit angeht)den ATMEGA128 bei 16 MHz ausreizen.

Eine durchdachte Realisierung des ersten Projekts soll die Vorbereitung
für das zweiten Projektes sein und zusätzlich mir Übung im Umgang mit
Timern und Zeitmessungen im Allgemeinen verschaffen. Einen
Frequenzzähler, der über einen bestimmten Zeitraum die Schwingungen
zählt und dann hieraus die Frequenz berechnet habe ich schon
realisiert.
Über Zeitschleifen oder Impulszähler habe ich viele Tutorials im
Internet gefunden, aber keins was mein Problem genauer beleuchtet.

Vielen Dank für Eure Mühe
Moin

von Moin (Gast)


Lesenswert?

@Ralf
Deine Ausführung über die 'Subtraktion im Zahlenring' hat mit die
Augen geöffnet. Das Problem ist ja viel kleiner als ich es mir gedacht
hatte :))
Vielen Dank
Moin

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.