Hi User, Ich will mit einem PIC16F690 die Frequenz eines an einem Eingangspin anliegenden Rechtecksignals messen. Hab mir folgendes überlegt: Zeitfunktion von 0,5s Länge, wärend dieser Zeit wird mit einer Zählvariable die anzahl der Highpegel am Eingang gemessen, und nach Zeitablauf an eine RS232 Funktion übergeben. Mein Problem ist dabei, dass der Code die Zeit scheinbar nicht wartet. Wie kann man sowas (am besten in C) programmieren? Meine Idee war eine While- Schleife, die solange läuft, bis die Zeit abgelaufen ist, und eine Null von der Zeitfunktion zurückgegeben wird. Das funktioniert aber nicht. Vielleicht hat einer von Euch eine Idee?
Hi, versuch es doch einmal ueber eine Capture Compare EInheit! Ich kenne leider den PIC nicht, daher kann ich dir da keine Genaue Auskunft geben. Lege das Eingangssignal (die Frequenz) auf einen Pin der auch mit einer CapCom Einheit verbunden ist. Danach stellst du den Timer ein, auf steigende Flanke wird die Einheit gestartet, und auf fallende Flanke wird die Einheit gestoppt. Timereinstellung ist bekannt, DutyCycle ist denke ich 50/50 somit kein Problem. Da nun alles in einem Interrupt abgearbeitet wird, und noch dazu vom Silizium selbst hast du viel Zeit und dein System ist komplett frei fuer wichtige andere Aufgaben. Beachte aber das deine INterruptroutine so kurz wie nur denkbar moeglich sein sollte. Wenn du hier Zeitverschleppungen reinbekommst, kann sich alles verschieben oder wunderbare nebeneffekte zeigen. Aber das weisst du selbst. viel Spass gruss micha
Hi micha, Capture hat dieser Controller. Ich denke dass dies auch die einfachste Variante sein kann. Bei meiner Idee muss ja permanent noch abgefragt werden, ob die Zeit schon abgelaufen ist. Ich wollte das Programm eventuell noch auf eine Controller ohne Capture brennen, da wäre eine eigene Lösung ja eigentlich das Beste. Aber Capture ist auch ne Variante. Die von Dir angesprochenen Wunderbaren Nebeneffekte kenne ich schon. Das wären zB. immer bis zum Rand gefüllte Zeitvariablen, oder al garkeine Zeit.
"...wärend dieser Zeit wird mit einer Zählvariable die anzahl der Highpegel am Eingang gemessen..." Wäre richtig, wenn Du die Impulslänge messen willst. Für ne Frequenzmessung mußt Du aber die low-high-Übergänge zählen. "Mein Problem ist dabei, dass der Code die Zeit scheinbar nicht wartet....Das funktioniert aber nicht." Mein Hellseher-Gen ist diesen Monat rezessiv. Da mußt Du schon Deinen Code ganz profan visuell posten, um den Fehler darin finden zu können. Peter
aehm, fuer eine Variante ohne Capture Einheit wuerde ich eine aehnliche Version verwenden. Also Pin mit externem Interrupt, welcher eine Zaehlervariable die vom Timer hochzaehlt steuert. Steigende Flanke Interrupt, fallende Flanke Interrupt, somit bekommst du den gleichen Effekt wie mit Capture Einheit, nur das eben zwei Interrupts daran beteiligt sind (ext Pin Interrupt, Timer Interrupt) und nicht nur die CaptureEinheit. Bin mir jetzt nicht sicher, ob du die Timervariable dann per Semaphore sperren solltest waehrend der Berechnung. Nicht das der Timer die Variable hochzaehlt waehrend du rechnest. Aber dies ist denke ich einfach mal rumspielen und testen. aehm was auch denkbar ist ueber das Start/Stop bit vom Timer diesen einfach anzuhalten. gruss micha
>Steigende Flanke Interrupt, fallende Flanke Interrupt
Wieso willst du beide Flanken auswerten? (hab nicht alles verfolgt, was
oben passierte bis auf die Frequenzmessung.)
Sonst ist die Lösung richtig.
upps, ja sorry. Da ist ein kleiner Denkfehler drin. Bei Frequenzmessung mit 50/50 DutyCycle reicht natuerlich nur eine Flanke. Bei Messung mit variierendem DutyCycle (PWM Signal) benoetige ich beide Flanken. Danke
U.a. sollte man auch wissen, in welchem Frequenzbereich du messen willst, wie genau die Frequenzmessung sein sollte, und ob während der Frequenzmessung noch weitere zeitkritische Prozesse laufen: Hier aber allgemein die Dokumentation und Codr zweier weiteren Möglichkeiten Frequenzen mit dem PIC zu messen: Für eher niedrige Frequenzen: http://www.burger-web.com/Projects/FMeasure/de_Ex_FMeasure.htm.de Sehr grosser Frequenzbereich aber in Assembler geschrieben: http://www.sprut.de/electronic/pic/programm/freqled4/freqled4.htm Grüsse Frank
>Bei Messung mit variierendem DutyCycle (PWM Signal) benoetige ich >beide Flanken. Nö, warum? Die Frequenz ist immer noch der Kehrwert der Periodendauer. Und die Periodendauer wird dadurch beschrieben, dass es sich dabei um die Zeit handelt, nach der sich das Muster wiederholt. Bei Digitalsignalen kann man das darauf reduzieren, dass man feststellt, in welchem zeitlichen Abstand zwei gleiche Flanken auftreten. Wenn man beide Flankenrichtungen auswertet, kann man die Pulsdauer und die Periodendauer feststellen, und somit den Tastgrad (Duty-Cycle) berechnen. Die Variation des Tastgrads wird gerne bei digitalen Temperatursensoren benutzt. Die Pulslängenmessung ist bei der Auswertung von Modell-Fernsteuerungs-Signalen interessant. Für eine Periodendauer- oder Frequenzmessung ist nur eine Flanke interessant.
Habe so eine Geschichte auch schon bearbeitet. Mit der Capture Einheit die steigenden Flanken auswerten. Am besten mehrere Messwerte des Timers speichern, differenzen bilden (aufpassen ob nicht ein Timerüberlauf in der zwischenzeit stattgefunden hat) und mitteln jetzt nur noch die berechnung zur Frequenz und fertig.
Hallo Manfred, Da Du schon mal mit dem Capture was gemacht hast, frage ich mal ganz frech nach einem Code. Initialisierung von Capture und Timer1 würde mich interessieren. Das selbstgeschriebene Programm war nur eine Ausweichvariante, weil eventuell noch ein anderer PIC zur Realisierung genutzt werden sollte. Jetzt habe ich einen 16F690, der hat internen CCP. Falls Du mir mit einem INIT für Capture und Timer1 aushelfen könntest, das wäre echt cool. Meiner läuft nämlich nicht. MfG Tom
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.