Forum: Mikrocontroller und Digitale Elektronik 32-Bit Input-Capture mit dsPIC


von Chris D. (m8nix)


Lesenswert?

Hallo,

wenn ich das Datenblatt des dsPIC30F6014 richtig verstehe, dann können 
entweder die oberen, oder die unteren 16-Bits eines 32-Bit Timers (Timer 
2 und 3 kaskadiert) durch ein Capture-Event in den FIFO-Puffer (ICxBUF) 
gecaptured werden? – Abhängig von Bit ICTMR im Register ICxCON.

Wie ist es nun möglich alle 32-Bits zu capturen?

Meine erste Idee hierzu:
Das Capture-Event auf 2 Input-Capture-Eingänge gleichzeitig zu legen, 
die unteren 16-Bits dann mit dem ersten Capture-Input und die oberen 
16-Bits mit dem zweiten Capture-Input sichern.

Ist das der richtige Weg, oder geht’s auch einfacher/anders?

Gruß
Chris

von Chris D. (m8nix)


Lesenswert?

... niemand 'ne Idee?

Im Microchip-Forum finde ich auch nichts was mir weiter hilft.

[http://ww1.microchip.com/downloads/en/devicedoc/70117e.pdf]

von Anja (Gast)


Lesenswert?

Chris D. schrieb:
> Das Capture-Event auf 2 Input-Capture-Eingänge gleichzeitig zu legen,
> die unteren 16-Bits dann mit dem ersten Capture-Input und die oberen
> 16-Bits mit dem zweiten Capture-Input sichern

Mmmh mal überlegen.

wenn ich 2 Pins habe die prinzipiell immer unterschiedliche 
Schaltschwellen haben, also nie exakt gleichzeitig schalten; Wie kann 
ich mir dann ohne externe Synchronisation der Pins (mit demselben Takt 
der intern für die Synchronisation des CCP-Signals verwendet wird) 
sicher sein daß die CCP-Units mit derselben Taktflanke die Timerwerte 
sichern.

Bei einem Low-Wert des CCP von -1 .. +1 werde ich mir nie sicher sein ob 
der High Wert jetzt eins mehr oder eins weniger haben muß.

Wenn ich dagegen den Low-Timer bei Überlauf einen Timerinterrupt 
generieren lasse in dem ich den High-Wert inkrementiere, kann ich dem 
CCP-Wert immer den richtigen High-Wert zuordnen. (Werte < 0 erhalten den 
Wert vor dem Interrupt, Werte >= 0 erhalten den High-Wert nach dem 
Interrupt).

Nebeneffekt: ich spare einen Prozessor-Pin, 2 D-Flip-Flops und eine 
Bohrung in den Chip wo ich den internen Takt abgreife.

Gruß Anja

von Chris D. (m8nix)


Lesenswert?

Hallo Anja,

die selben Bedenken der taktversetzten Sicherung der Timerwerte bei 
Verwendung von 2 Input-Capture-Eingängen habe ich auch. Solange das 
Trigger-Ereignis nicht unmittelbar am Überlaufpunkt des Low-Timers 
auftritt, ist das ganze auch kein Problem - was aber wenn doch?

Die dsPIC-Eingänge haben zwar alle einen Schmitt Trigger, aber das heißt 
ja noch lange nicht das die Schaltschwellen der Trigger exakt gleich 
arbeiten.
Ein entsprechend flankenflaches Trigger-Signal begünstigt dann die 
versetzte Sicherung noch.
Im Gegenzug müsste aber ein schneller, den Input-Capture-Eingängen 
vorgeschalteter, Schmitt Trigger das Problem mindern/lösen?

Deinen Ansatz mit dem Interrupt-Timer finde ich nicht schlecht - behalte 
ich im Hinterkopf. Ich warte jetzt aber erst mal ab was, der 
Microchip-Support dazu zu sagen hat... wenn er denn was sagt?!

PS: Jetzt weiß ich auch wovon der Begriff "Aufbohren" abgeleitet wurde. 
:-O

Gruß
Chris

von Anja (Gast)


Lesenswert?

Chris D. schrieb:
> Ich warte jetzt aber erst mal ab was, der
> Microchip-Support dazu zu sagen hat... wenn er denn was sagt?!

Ich habe gute Erfahrungen mit dem Microchip-Support. Allerdings war 
meine Frage auch nicht so technisch komplex.

Gruß Anja

von Chris D. (m8nix)


Lesenswert?

Answer (Vom Microchip Support)

Your understanding is correct concerning the ICTMR bit description. You 
would need to configure (2) separate ICx channels identically except one 
for timer2 the other for timer3. Connect both ICx pins together to the 
same input signal.

Hm… da macht man sich immer n'Kopf für nix und wieder nix. Ich mach 
trotzdem mal nen Schmitt Trigger vor die beiden Input-Capture-Eingänge 
und teste das ganze ausgiebig am Überlaufpunkt des Low-Timers.
Aber froh bin ich schon, wenn das Ganze so funzt - brauch ich doch keine 
extra Berechnungen anstellen und den Timer 2 Interrupt bin ich auch los 
:-)

Gruß
Chris

von Ulrich (Gast)


Lesenswert?

Bei anderen µCs (z.B. 8 Bit AVRs) ist es keine größeres Problem ein 16 
Bit input Capture per Software auf höhere Auflösung zu erweitern. 
Zwischen 2 Überläufen eines 16 Bit Timers hat man genügend Zeit die 
höheren Bits hochzuzählen und Grenzfälle abzufangen.

Die Lösung mit 2 ICP Eingängen und externer Synycronisation ist schon 
recht aufwendig. Ohne externe Syscronisation ist es halt nicht 
zuverlässig, oder man müßte die Grenzfälle noch einmal in Software 
testen. Dann könnte man aber auch gleich die Softwarelösung von oben 
nehmen - der Aufwand ist fast der gleiche.

von Chris D. (m8nix)


Lesenswert?

Hallo Ulrich,

die externe synchronisation hält sich ja in Grenzen. Microchip schreibt 
ja das Capture-Event auf zwei IC-Eingänge gleichzeitig zu legen. Wenn 
ich da einen extra Schmitt Trigger spendiere und das ganze danach 
zuversichtlich läuft, hab ich doch keinen Mehraufwand auf Softwareseite.

Gruß
Chris

von Ulrich (Gast)


Lesenswert?

Nur ein Schmidttriger wird keine Zuverlässige Syncronisation geben. Das 
kann zu 99% funktionieren, aber halt nie 100 prozentig. Da braucht man 
schon  ein oder 2 Flipflops, die syncron zum Prozessor Takt die Daten 
übenehmen. Wenn der Takt direkt von außen kommt, hält sich der Aufwand 
in Grenzen. Bei einem internen Taktvervielfacher wird es schon 
schwieriger - entweder ein PLL oder einen schnellen Quarz und dann erst 
Teilen. Wenn man keine genauen Daten hat, muß man ggf. noch die Phase 
abgleichen.

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.