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
Da wäre es erstmal praktisch zu wissen in welcher Größenordnung die Zeitabstände denn so sein sollen.
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
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
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
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
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
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.