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
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
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
Ich kenne den MSP430F169 nicht, aber 10µs ist doch eine Lange Zeit. Schau mal ins Datenblatt oder die Application notes
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
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
> 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.
Auch im Continous Mode tritt der Fehler noch auf. Anbei ein Screenshot der Timer-Register.
@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
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
Doch, das muss wohl so. Wenn ich das P1SEL nicht umschalte, bleiben die TACCR1 und TACCR2 auf 0x00. Grüße Philipp
Was ist die Clock-source für Timer_A, mit welchem Pre-Scaler? -> Timer_A clk zu langsam bzw. läuft er überhaupt?
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...
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.
@ Philipp (Gast) >Wenn ich das P1SEL nicht umschalte, bleiben die TACCR1 und TACCR2 auf >0x00. Teste doch mal CCR1 und CCR2 einzelen. MFG Falk
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.
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!
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.