Forum: Mikrocontroller und Digitale Elektronik Timer A Capture Mode, kein Interrupt |MSP430


von jotruuu (Gast)


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

von Clemens L. (c_l)


Lesenswert?

jotruuu schrieb:
> TA0CCTL1 |=  CAP + CM_1 + CCIS_0 +SCS;
> TA0CCTL0 |= CCIE;

Bitte entscheide dich, ob du CCR0 oder CCR1 verwenden willst.

von jotruuu (Gast)


Lesenswert?

habs jetzt geändert, dass ich nur CCR0 anspreche.
es funktioniert aber trotzdem nicht. macht keinen sinn für mich

von Clemens L. (c_l)


Lesenswert?

Außer dir weiß niemand, wie der Code nach der Änderung aussieht.

von jotruuu (Gast)


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

von Clemens L. (c_l)


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.

: Bearbeitet durch User
von jotruuu (Gast)


Lesenswert?

also wenn ich mit CCI0A bzw CCR0 arbeiten will, dann muss ich ja 1.6 
nehmen.

und wenn ich mit 1.0 arbeite,  wird ja CCI1A und CCR1 benutzt
also muss ich hier TA0CCTL1 ansprechen oder nicht?

von Clemens L. (c_l)


Lesenswert?

Wenn du P1.0 benutzen willst, dann musst du auch das passende CCR 
benutzen.

von jotruuu (Gast)


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

von jotruuu (Gast)


Lesenswert?

es läuft. habs jetzt mit P1.6 gemacht für TACCR0. also TACCTL0 
ansprechen. hatte vergessen P1SEL1 zu setzen. jetzt funktioniert es aber

von Clemens L. (c_l)


Lesenswert?

jotruuu schrieb:
> da ich ja den wert in dem register nicht brauche

Warum benutzt du dann einen Timer, und nicht GPIO (siehe Abschnitt 8.2.6 
des User's Guide)?

von Daniel A. (daniel-a)


Lesenswert?

Ich würde die Flags mit '|' statt mit '+' verodern, weil 1+1=2, aber 
1|1=1, also weniger Fehleranfällig.

von jotruuu (Gast)


Lesenswert?

doch ich brauchs schon. hatte mich falsch ausgedrückt.
bei TA0CCR0 steht jetzt aber total der quatsch. da müsste ja eigentlich 
ungefähr immer der gleiche wert drin stehen. oh man :D

von Clemens L. (c_l)


Lesenswert?

jotruuu schrieb:
> bei TA0CCR0 steht jetzt aber total der quatsch. da müsste ja eigentlich
> ungefähr immer der gleiche wert drin stehen.

Da steht nicht die Differenz zum letzten Ereignis, sondern einfach nur 
ein Zeitstempel. Die Differenz darfst du dir selber ausrechnen.

von jotruuu (Gast)


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?

von Clemens L. (c_l)


Lesenswert?

Warum willst du CCR0 auf Null setzen? Das geht nur mit Software, mit den 
dabei üblichen Verzögerungen (wie du gesehen hast).

von al anders versuchen (Gast)


Lesenswert?

Wie Clemens schon schrieb, wird deine Aufgabe mit GPIO Interrupt gelöst.

Und sonst TAR = 0; Der Befehl sollte drin sein.

von jotruuu (Gast)


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!

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.