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 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
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.
@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
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.
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!