Sehr kurze Zeiten messen

Gast #993679
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
Gast
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
Gast
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.
@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
Gast
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
Gast
Naja - warum  sollte ich beim Initialisieren Assembler nutzen?

Und das Interruptgesteuerte Speichern der Werte sollte durch meinen Code 
ja nicht verändert werden, oder?
@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
Gast
> 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.
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:
  P1DIR &= ~P1DIR_2;
  P1SEL |= P1SEL_2;
  P1DIR &= ~P1DIR_3;
  P1SEL |= P1SEL_3;

Grüße
Philipp

P.s.: Sry fürs große Bild
@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
Gast
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...
Gast
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.
Gast
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.
Gast
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!
Gast
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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.