Forum: Mikrocontroller und Digitale Elektronik PIC24 input capture mit dedicated timer


von Hans (Gast)


Lesenswert?

Da ich im Internet nicht viel zum PIC24 "Input capture with dedicated 
timer" Modul gefunden habe, mußte ich lange herumprobieren.
Vielleicht ersparen meine Kenntnisse jemand anderes viel Arbeit:

Es ging um die Periodendauer-Erfassung einer Lichtschranke unter 
maximaler Ersparnis von Prozessor-Rechenzeit, bes. Interrupts.
Da schien das Input capture gradezu für vorbestimmt.

Nach einer Woche Herumprobieren mit dem Input-capture  des PIC 
24FV16KA302 bleibt m.E. festzuhalten:
Es gibt leider keinen Modus, in dem das Modul den eigenen Zähler bei 
jedem Capture-Ereignis auf Null zurücksetzt.
Synchronisieren des Capture Moduls IC1 durch seinen eigenen Output ist 
nicht möglich, weil das kein capture- output ist, sonderen nur ein 
Overflow-Output.

Die Werte, die im Buffer stehen, müßen also grundsätzlich voneinander 
subtrahiert werden, um die Periodendauer am ICx-Eingangspin zu erhalten. 
(gemessen in der Frequenz, die der Prescaler der gewählten Clock-Quelle 
ausspuckt, nicht etwa der betreffende Timer selbst.)
Ein ICxTMR counter-Reset nach dem capture lässt sich zwar erreichen, 
wenn die Synch-Quelle direkt nach dem Capture irgendwie zum Überlaufen 
gebracht wird. (Timer1 "manuell"auf 0xFFFE stellen und gleichen 
Prescaler, wie clock, jedenfalls darf der Überlauf auch nicht zu früh 
erfolgen,sonst kein Nullen des ICxTMR.)aber das ist natürlich absurd 
umständlich.

Vermutlich würde es auch funktionieren mit einem Comparator Modul, wenn 
man dessen Pin zusätzlich auch  mit dem Signal am ICxPIN verbindet.

Es ist mir auch nicht gelungen, den IC1TMR einfach zu clearen. Leider 
scheint der wohl "read-only" zu sein. Keine Info dazu im Datenblatt.

Direktes Null-stellen ist nicht möglich, auch nicht mit manueller 
Trigstat-Betätigung.
ICTRIG oder TRIGSTAT -Bit werden bei keiner der obigen Methoden manuell 
gehandelt, nur in der INIT auf Null gesetzt.

Da in jedem dieser Fälle (außer ev. Comparator)ein Interrupt pro capture 
erforderlich ist, spart das Modul eigentlich überhaupt nichts ein.
Will man IC1-INterrupts einsparen, muß!!!!! man hinterher die 
Bufferinhalte voneinander subtrahieren, um die Periode zu erhalten, was 
auch an die 10 zustätzliche Befehle erfordern dürfte mit 
Überlaufverrechnung etc.

Der FIFO funktioniert hier wie ein Kaugummiautomat: Von oben werden die 
Ergebnisse (Kaugummikugeln) ins Rohr geworfen und können unten 
nacheinander entnommen werden.
Dazu ist keinerlei zeitlicher Zusammenhang zwischen Füllen und Entnahme 
oder Beachtung von Buffer-speicherplätzen erforderlich.
Die Kaugummis rutschen automatisch von oben nach unten nach, wenn unten 
eins entnommen wird.(durch einen ICxBUF lesenden Befehl MOV u.ä.) 
Deshalb gibt es dieses ICxBUF auch nur einmal, obwohl 4Werte gespeichert 
werden können.
Es können nur nicht mehr als 4 Kaugummis eingefüllt werden (ICOV-Bit 
prüfen)
und wenn man noch etwas entnimmt, nachdem die Kaugummis alle waren, 
sollte man es lieber nicht in den Mund stecken. (ICBNE-Bit prüfen)
Im übrigen gibt es das Datenblatt 39722a von Microchip zum Input capture 
mit dedicated timer.  Noch ein ausführlicheres habe ich leider nicht 
gefunden.
Es mag sein, dass mir bei meinem ganzen Durcheinander etwas entgangen 
ist, deshalb verwende ich Begriffe, wie "scheint" und "m.E.".

von Klaus (Gast)


Lesenswert?

Hans schrieb:
> Da ich im Internet nicht viel zum PIC24 "Input capture with dedicated
> timer" Modul gefunden habe

Es gibt das "dsPIC33/PIC24 Family Reference Manual" und daraus das 
Kapitel "Input Capture" als DS70000352C.

Hans schrieb:
> Es ging um die Periodendauer-Erfassung einer Lichtschranke unter
> maximaler Ersparnis von Prozessor-Rechenzeit, bes. Interrupts.

Es geht beim Input Capture nicht um das Sparen von Prozessorzyklen 
(was IMHO sowieso Unsinn ist), sondern um die Zeitschärfe des Messwerts. 
Ein Flankenwechsel am Eigang wird auch dann mit voller Clockauflösung 
registriert, wenn die CPU beschäftigt oder der Interrupt gesperrt ist. 
Und durch das FIFO kann die Bearbeitung auch nach dem Auftreten weiterer 
Flanken erfolgen.

MfG Klaus

von Hans (Gast)


Lesenswert?

Ja, danke Klaus, für deine Anmerkungen. Allerdings bringt das von mir 
zitierte Datenblatt 39722a 
(http://ww1.microchip.com/downloads/en/DeviceDoc/InputCapture39722a.pdf) 
dieselben Infos, als das von Dir zitierte: 
(http://ww1.microchip.com/downloads/en/DeviceDoc/70000352C.pdf)
Vieles muß man sich aber immer noch denken, bzw. ausprobieren.

Normalerweise wäre meine Lösung für das Problem einfach ein mitlaufender 
Timer und ein Int-PIN-Interrupt gewesen.  Zumal das Programm erst 10% 
der verfügbaren Rechenzeit füllt und es sonst keine zeitkritischen 
Interrupts gibt.Das capture-Modul hat mich aber eben einfach gereizt.

Allerdings ist das mit dem Verrechnen der Überträge einfacher, als ich 
oben dachte. Wenn man beachtet, dass der timer niemals öfter als einmal 
überlaufen darf, löst sich das Problem durch einfaches integer- 
Subtrahieren des neuen Werts vom alten von selbst.

Ich behaupte auch gar nicht, dass dieses Modul schlecht ist. Es ist ja 
sehr vielseitig. Nur diese Timer-Reset-bei-capture Möglichkeit gabs eben 
nicht.

Und ich hatte mich vorher mit dem Output-compare beschäftigt, und da 
funktionierte vieles anders.

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.