mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Sehr kurze Zeiten messen


Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mäxchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HebAufHat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

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

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HebAufHat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuchs mal mit Assembler..

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Philipp (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Auch im Continous Mode tritt der Fehler noch auf.

Anbei ein Screenshot der Timer-Register.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch, das muss wohl so.

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

Grüße
Philipp

Autor: Stefan (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Macht ein Freibier. ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.