Forum: Mikrocontroller und Digitale Elektronik Sehr kurze Zeiten messen


von Philipp (Gast)


Lesenswert?

Hallo zusammen,

ich nutze einen MSP430F169 mit 8 MHz Takt.

Ich möchte die Länge eines LOW-Pegels messen.

Ich konfiguriere dazu die CCR1 des Timer A auf den Capture Mode.

Nun habe ich aber das Problem, dass die Zeiten nicht knapp genug sind. 
Zum testen habe ich im Timer A1-Interrupt nur geprüft, ob er wegen der 
CCR1 einen Interrupt wirft, einen AUsgangspin gewechselt (per XOR) und 
die Interruptrichtung von fallender auf steigende Flanke gewechselt.

Unter ca 100 Mikrosekunden kann ich trotzdem nichts zuverlässig messen.

(Ich schaue mir auf einem Oszi die Ausgabe eines schnellen 
Rechtecksignals und den gesetzten Pin dazu an - oft wird der Pin z.B. 
nicht zurück gesetzt und erst bei der nächsten steigenden Flanke wieder 
hochgesetzt)

Hat jemand eine Idee, wie ich das trotzdem machen könnte?

Eine Auflösung auf z.B. 10 Mikrosekunden wäre toll...

Grüße
Philipp

von mäxchen (Gast)


Lesenswert?

Wenn deine Interruptroutine zu rechenintensiv ist, könnte es sein dass 
der up nicht mit rechnen nachkommt. Poste doch mal dein Code.

MfG mäxchen

von HebAufHat (Gast)


Lesenswert?

Wenn es wirklich nur um EINE Messung geht, einfach pollen und warten, 
bis LOW anliegt. Dann in einer Schleife ein Register hochzählen (oder 
Timer anwerfen), und bei HIGH die Schleife beenden. Weiß nicht wie es 
beim MSP ist, aber mit nem AVR und 8MHz kannst Du damit 1-2 
Schleifendurchläufe pro Mikrosekunde schaffen, 10uS Auflösung sollten 
also machbar sein.

von Falk B. (falk)


Lesenswert?

@Philipp (Gast)

>ich nutze einen MSP430F169 mit 8 MHz Takt.
>Ich möchte die Länge eines LOW-Pegels messen.

>Ich konfiguriere dazu die CCR1 des Timer A auf den Capture Mode.

Du brauchst zwei ICPs, sprioch CCRs. Einer misst die fallende, einer die 
steigende Flanke.
Wenn du nur einen CCR hast, musst du mit einem exterenen Interrupt 
aurbeiten, siehe hier.

Beitrag "Re: Atmega32 Pulsbreitenmessung 200ns"

>Eine Auflösung auf z.B. 10 Mikrosekunden wäre toll...

Mit Knoff hoff schafft man die vollen 8 MHz respektive 125ns.

MFG
Falk

von Martin (Gast)


Lesenswert?

Ich kenne den MSP430F169 nicht, aber 10µs ist doch eine Lange Zeit. 
Schau mal ins Datenblatt oder die Application notes

von Philipp (Gast)


Lesenswert?

Hiho,

ich habe es mal mit CCR1 und CCR2 auf Timer A probiert, allerdings ist 
deren TACCR1 = TACCR2, egal, wann ich ihn zum debugging anhalte.

  P1DIR &= ~P1DIR_2;
  P1SEL |= P1SEL_2;
  P1DIR &= ~P1DIR_3;
  P1SEL |= P1SEL_3;

  TACCTL1 |= CM_2;
  TACCTL1 |= CCIS_0;
  TACCTL1 |= CAP;
  TACCTL1 &= ~SCCI;
  TACCTL1 |= SCS;
  TACCTL1 |= CCIE;


  TACCTL2 |= CM_1;
  TACCTL2 |= CCIS_0;
  TACCTL2 &= ~SCCI;
  TACCTL2 |= CAP;
  TACCTL2 |= SCS;
  TACCTL2 |= CCIE;

Dabei habe ich doch extra CCR1 auf fallende, CCR2 auf steigende Flanke 
gesetzt. Das Signal ist nicht zu schnell, selbst wenn ich es auf 1 Hz 
setze, haben beide den gleichen Wert.

Was habe ich bei der Initialisierung vergessen?

Grüße
Philipp

von HebAufHat (Gast)


Lesenswert?

versuchs mal mit Assembler..

von Philipp (Gast)


Lesenswert?

Naja - warum  sollte ich beim Initialisieren Assembler nutzen?

Und das Interruptgesteuerte Speichern der Werte sollte durch meinen Code 
ja nicht verändert werden, oder?

von Falk B. (falk)


Lesenswert?

@Philipp (Gast)

>Dabei habe ich doch extra CCR1 auf fallende, CCR2 auf steigende Flanke
>gesetzt. Das Signal ist nicht zu schnell, selbst wenn ich es auf 1 Hz
>setze, haben beide den gleichen Wert.

Was habe ich bei der Initialisierung vergessen?

Wie sieht TACTL aus? Der Timer muss im Continous Mode arbeiten.

MFG
Falk

von Philipp (Gast)


Lesenswert?

> Wie sieht TACTL aus? Der Timer muss im Continous Mode arbeiten.

Achso, den habe ich im UP-Modus und lasse den immer bis 1000 zählen.

Ich werde das mal ausprobieren.

von Philipp (Gast)


Angehängte Dateien:

Lesenswert?

Auch im Continous Mode tritt der Fehler noch auf.

Anbei ein Screenshot der Timer-Register.

von Falk B. (falk)


Lesenswert?

@Philipp (Gast)

>Dateianhang: register.JPG (195,5 KB, 4 Downloads)

Kleiner Tip. Bildformate.

>Anbei ein Screenshot der Timer-Register.

Hast du auch dein Signal an die richtigen Pins angeschlossen? An beide?

MFG
Falk

von Philipp (Gast)


Lesenswert?

Ja, es liegt an den Pins 14 und 15 an, also TA1 und TA2.

Und ich meine die beiden PINs auch für die SOnderfunktion konfiguriert 
zu haben:
  P1DIR &= ~P1DIR_2;
  P1SEL |= P1SEL_2;
  P1DIR &= ~P1DIR_3;
  P1SEL |= P1SEL_3;

Grüße
Philipp

P.s.: Sry fürs große Bild

von Falk B. (falk)


Lesenswert?

@Philipp (Gast)

>Ja, es liegt an den Pins 14 und 15 an, also TA1 und TA2.

>Und ich meine die beiden PINs auch für die SOnderfunktion konfiguriert
>zu haben:

Ich glaub das ist falsch, damit schaltest du die Output Compare Funktion 
ein. Input Capture geht glaub ich immer, weil die Pins ja als Eingang 
laufen.

MFg
Falk

von Philipp (Gast)


Lesenswert?

Doch, das muss wohl so.

Wenn ich das P1SEL nicht umschalte, bleiben die TACCR1 und TACCR2 auf 
0x00.

Grüße
Philipp

von Stefan (Gast)


Lesenswert?

Was ist die Clock-source für Timer_A, mit welchem Pre-Scaler?
-> Timer_A clk zu langsam bzw. läuft er überhaupt?

von Stefan (Gast)


Lesenswert?

Laut Deinem Register-Abbild verwendest Du ACLK als source für Timer_A.
Wenn Du den 8MHz Quarz allerdings an XT2 angeschlossen hast, dann wäre 
ACLK ohne Funktion, da dieser nur von LFXT1 betrieben werden kann. Oder 
Du hast einen 32kHz an LFXT1, was aber wohl zu langsam wäre...

von Philipp (Gast)


Lesenswert?

Der 8 MHz hängt an XT1 und mit Prescaler 8 am Timer. Ursprünglich lag 
CCR0 bei 1000 und im Up-Modus - damit ich jede ms einen Tick bekommen 
kann.

Dementsprechend wird TAR auch jede Mikrosekunde inkrementiert.

von Falk B. (falk)


Lesenswert?

@  Philipp (Gast)

>Wenn ich das P1SEL nicht umschalte, bleiben die TACCR1 und TACCR2 auf
>0x00.

Teste doch mal CCR1 und CCR2 einzelen.

MFG
Falk

von Philipp (Gast)


Lesenswert?

Hallo,

  ///Initialize Port 1 for CCR1
  P1DIR &= ~P1DIR_2;
  P1SEL |= P1SEL_2;
  P1DIR &= ~P1DIR_3;
//  P1SEL |= P1SEL_3;


Jetzt ändert sich auch nur das Register des CCR1, also muss das wohl 
wirklich so.

von Philipp (Gast)


Lesenswert?

Mooooment.

Denkfehler.

Die Werte sind beim Debugging im SingleStep gleich, wenn ich das 
Programm laufen lasse unnd dann plötzlich anhalte scheinen sie 
unterschiedlich zu sein.

Was übrigens auch voll Sinn macht aber gestern in geistiger Umnachtung 
wohl von mir nicht erkannt wurde g

Danke allen!

von Philipp (Gast)


Lesenswert?

PERFEKT.

Der Timer läuft wieder im UP-Mode, damit ich jede ms einen Tick bekomme 
und die TACCR1 und TACCR2 geben mir die Zeit des Down-Pegels.

Habe das mit einem Funktionsgenerator geprüft: Sogar auf die 
Mikrosekunde genau.

Toll!, Danke für eure Hilfe!

von Falk B. (falk)


Lesenswert?

Macht ein Freibier. ;-)

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.