Forum: Mikrocontroller und Digitale Elektronik Frequenz mit MSP430 messen


von Daniel Schneeweis (Gast)


Lesenswert?

Hallo

Ich will eine Frequenz mit dem MSP430F149 messen. Klar das es
funktioniert mit der Frequenz auf einen Interrupt und in der ISR nen
Zähler hochzählen. Das lastet den Prozessor bei höhern zu messenden
Frequenzen aber stark aus, weil er immer in die Routine springen muss.


Nun meine Frage: Man kann ja mit dem Timer Zeiten messen. Also capture.
Dort wird der Takt der gezählt wird intern erzeugt und das äussere
Singal ist die "Torzeit". Nun würd ich aber gern die Torzeit intern
und den takt von Extern anlegen. Geht das? Kann ich den Zählereingang
von Timer A nach aussen auf einen Pin legen??

Hab schon in dem Userhandbuch und so geschaut, konnte aber nix finden

von Daniel Schneeweis (Gast)


Lesenswert?

Hallo

Kann mir da wirklich keiner helfen?? Es muss doch ein paar Leute geben,
die sich mit dem MSP gut auskennen oder??

von Rahul (Gast)


Lesenswert?

Du hast die verschiedenen Lösungen doch oben schon genannt.
Bei solchen Problemen findet man meist im Datenblatt Hilfe.

von Daniel Schneeweis (Gast)


Lesenswert?

Naja wie gesagt ich konnte im Datenblatt nichts finden, wie ich die
externe Frequenz an meinen Zählereingang legen kann. Ich habe nur den
Capturemode gefunden was ja gerade anderst herum ist.

Warum kommt der Beitrag zwischendrin 3 mal???

von tenner (Gast)


Lesenswert?

moin, irgenwie begreife ich deine frage nicht.

das zu messende signal legst du an einen capture-eingang. richtig
konfiguriert wird z.b. bei jeder steigenden flanke am captureeingang
der timer-wert in das register TACCRx (timerA) geschrieben. überträgt
man diesen wert in der interruptroutine in einen puffer, kann die
frequenz des signal aus dem aktuellen wert in TACCRx, dem gespeicherten
wert des vorherigen interrupt und der timer-takt-frequenz leicht
ausgerechnezt werden.

von Daniel Schneeweis (Gast)


Lesenswert?

Hallo

Also ich hab jetzt selber rausgefunden wie es geht. Ich möchte nicht
das Eingangssignal auf den Capture Eingang legen, und praktisch die
Periodendauer messen. Sondern ich möchte den Caputer von Timer B
vorgeben und die Frequenz direkt in den Zähler laufen lassen (Messung
der Anzahl der Highpegel in einem bestimmten Zeitintervall). Als
Beispiel laufen in einer Sekunde 500 000 (kann sein, das der Zähler
nicht mehr so viel kann) Zählimpulse in den Zähler beträgt die Frequenz
500 kHz. Dazu habe ich die Eingangsfrequenz auf INCLK gelegt. Und eine
Verbindung von TB an TA0 extern gemacht. D.h. ich gebe mit Timer B (TB)
die Torzeit vor. TA0 ist mein Capture eingang.

so kann ich während ich die Frequenz messe (z.B. 1 s lang) andere
Aufgaben mit dem µC erledigen. Natürlich ist das was ich messe, nur die
Durchschnittsfrequenz in diesem Zeitraum.

von MiGu (Gast)


Lesenswert?

Hallo alle zusammen,

habe heute mal wieder mit MSP430 und Capture rumgespielt. Leider läuft 
die Messung nicht so stabil, wie ich's gern hätte. Hier der Code der 
ISR:

--snip---

void TimerA1_Interrupt(void) __interrupt[TIMERA1_VECTOR]
{
unsigned int counter = TACCR2;
TACCTL2 &= ~COV;
 switch(TAIV){
//----------------------------------------------------------
  case 0x0A:{     // timer 2 overflow
              //TACCTL2 |= CCIE;
              if(!fCAP) Overflow++;
              break;
            }
  case 0x04:{     // capture 2 interrupt
              if(fCAP == 1){
                LastValue = counter;
                sum = fCAP = Overflow = 0;
              }else{

              //-- measurement has finished after 2000 cycles --
                if(CountTC++ ==1999){    //199
                  TACTL &= ~MC1;                   // stop meas
                  TACCTL2 &= ~CM0;                // --"--
                  //TACCTL2 &= ~CCIE;
                  sum = (65536-LastValue) + (Overflow*65536) + counter;

                  freq = 6e06 * 2000 / sum;      //XTAL = 6e06 Hz

                  Det_MeasFin = true;
                }
                TACCTL2 |= CCIE;
              }
              break;
            }
      }
       TACCTL2 &= ~COV;
}


Das Problem ist, dass ich mit dem Capture-Eingang eine Frequenz bis ca. 
100kHz messen möchte. Der Capture-Timer soll frei laufen und über 200 
(2000) einkommende Perioden den Quarztakt messen. Anschließend wird 
berechnet. Das Pproblem könnte in dem gleichzeitigen Auftreten von 
Overflow und Capture liegen, denn ich bekomme öfter unterschiedliche 
Frequenzen mit leichten Abweichungen präsentiert.

Wer kann helfen oder hat ein Beispiel?? (PS: Capture soll hier NICHT nur 
die Quarzimpulse über eine einkommende Periode des Capture messen, 
sondern ein freilaufender Timer soll 200 oder 2000 Perioden aufnehmen 
und dann erst stoppen.

Danke im voraus.

von Renato B. (Gast)


Lesenswert?

@ MiGu

Genau dieses Problem, mit dem gleichzeitigen Auftreten von overflow und 
capture, habe ich vermutlich bei meinem Code auch! Wie hast du es 
gelöst?

Hat sonst jemand eine Idee, wie man dies lösen könnte?


Besten Dank im Voraus!

Gruss
Renato

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.