#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
jotruuu schrieb: > TA0CCTL1 |= CAP + CM_1 + CCIS_0 +SCS; > TA0CCTL0 |= CCIE; Bitte entscheide dich, ob du CCR0 oder CCR1 verwenden willst.
habs jetzt geändert, dass ich nur CCR0 anspreche. es funktioniert aber trotzdem nicht. macht keinen sinn für mich
Außer dir weiß niemand, wie der Code nach der Änderung aussieht.
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
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
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?
Wenn du P1.0 benutzen willst, dann musst du auch das passende CCR benutzen.
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
es läuft. habs jetzt mit P1.6 gemacht für TACCR0. also TACCTL0 ansprechen. hatte vergessen P1SEL1 zu setzen. jetzt funktioniert es aber
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)?
Ich würde die Flags mit '|' statt mit '+' verodern, weil 1+1=2, aber 1|1=1, also weniger Fehleranfällig.
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
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.
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?
Warum willst du CCR0 auf Null setzen? Das geht nur mit Software, mit den dabei üblichen Verzögerungen (wie du gesehen hast).
Wie Clemens schon schrieb, wird deine Aufgabe mit GPIO Interrupt gelöst. Und sonst TAR = 0; Der Befehl sollte drin sein.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.