kurze Zeitabstände messen

Gast #120278
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
Gast
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
Gast
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
Gast
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
Gast
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
"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
Gast
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
Gast
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
Gast
@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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.