Timer A Capture Mode, kein Interrupt |MSP430

Gast #4436743
Lesenswert?

#include <msp430fr5739.h>

volatile int count=0;

void main(void)
{
   WDTCTL = WDTPW + WDTHOLD; //stop watchdog
   _enable_interrupts();

  P1SEL0 |= BIT0;    // INPUT CC1A FÜR CAPTURE wählen

   CSCTL0_H = 0xA5; //password
    CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0;  //set all divider to 1 to get 
8MHz on internal clock

    // TIMER A
  TA0CTL &= ~MC_3; //Stop timer
  TA0CTL |= TACLR; //clear counter
  TA0CCTL1 |=  CAP + CM_1 + CCIS_0 +SCS;//capture mode, capture on 
positive edge, CCIxA as input source, synchronize
  TA0CCTL0 |= CCIE; // ENABLE INTERRUPT
  TA0CTL |= TASSEL__SMCLK + MC__UP; //SMCLK,count mode: up

  for(;;)
  {
  }

}

  //INTERRUPT SERVICE ROUTINE

#pragma vector=TIMER0_A0_VECTOR

    __interrupt void Timer0_A0 (void)
  {
    count++; //wenn flanke detektiert, dann hochzählen
  }


hallo freunde,
ich möchte mit dem MSP430 ein signal, das mit einem manchester code 
codiert ist auswerten. dazu wollte ich zu erst probieren, ob ich es 
schaffe eine positive flanke mit hilfe der capture funktion des timer A 
zu erkennen. es passiert aber nichts, der interrupt wird nicht 
ausgelöst.
den input erzeuge ich mit einem anderen msp430. sind 7 bits, manchester 
codiertm, frequenz bei 1000Hz, die sich immer wieder wiederholen.

hab mir ein paar beispiel programme angeschaut im internet, wo das ganze 
ähnlich gemacht wird. ich finde den fehler in meinem programm aber 
nicht.
könnt ihr erkennen, wo der fehler liegt?
vielen dank schonmal für die antworten
Gast #4440349
Lesenswert?

TA0CTL &= ~MC_3; //Stop timer
  TA0CTL |= TACLR; //clear counter
  TA0CCTL0 |=  CAP + CM_1 + CCIS_0 +SCS;//capture mode, capture on
positive edge, CCIxA as input source, synchronize
  TA0CCTL0 |= CCIE; // ENABLE INTERRUPT
  TA0CTL |= TASSEL__SMCLK + MC__UP; //SMCLK,count mode: up

mehr habe ich nicht mehr geändert.

noch eine andere frage, ist doch richtig, dass ich das signal auf P1.0 
geben muss??
http://www.ti.com/lit/ds/symlink/msp430fr5739.pdf
#4440431
Lesenswert?

Up Mode zählt bis zum Wert in CCR0. Da wäre es kein gute Idee, CCR0 zu 
überschreiben. Wenn du wirklich Up Mode und nicht Continuous Mode 
verwenden willst, solltest du ein anderes CCR für den 
Capture-Zeitstempel verwenden.

jotruuu schrieb:
> ist doch richtig, dass ich das signal auf P1.0 geben muss?

Wirf mal einen Blick in Tabelle 6-8, oder 4-1.
Gast #4440559
Lesenswert?

das wäre dann ja CCR1 für P1.0.
aber das ist ja erstmal nicht wichtig, da ich ja den wert in dem 
register nicht brauche (das interrupt ist ja noch nicht aufgelöst).
die frage ist ja, ob ich TA0CCTL1 benutzen muss, wenn ich mit P1.0 
arbeite? oder?

stehe ehrlich gesagt etwas auffem schlauch gerade
Gast #4442073
Lesenswert?

danke für die info! klappt jetzt alles wunderbar, die differenz passt 
auch.
eine möglichkeit TA0CCR0 auf null zu setzten wäre das TACLR zu setzen. 
dann wird auch der zählmodus zurück gesetzt. jetzt kommen aber bei mir 
andere werte raus. bei den differenzen hatte ich immer 3999, was auch 
richtig was. jetzt habe ich aber sbolute werte im bereich von 3960.
gibt es eine andere möglichkeit TA0CCR0 auf null zu setzen?
Gast #4443552
Lesenswert?

ich brauch die differenz, weil es später einfacher ist zu decodieren, da 
ich immer auf mid bit period oder bit period vergleiche.
ansonsten habe ich ja immer die überläufe bei 65536, die das ganze 
unnötig aufwändig machen. die verzögerung die beim zurück setzen des 
registers auftritt ist nicht kritisch.

danke für eure hilfe!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren