#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
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.
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?
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
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)?
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?
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!