Hallo an alle,
ich habe eine Frage bezüglich des Timers A des msp430 und den damit
verbundenen Interrupts.
Ich habe schon verzeifelt gegoogelt, das Kapitel im Datenblatt über den
Timer ganz gelesen und hab immer noch Fragen.
Und zwar werden ja im Up-Mode immer 2 unmittelbare Interrupts ausgelöst,
nämlich wenn das TAR-Register den Wert des TACCR0-Register erreicht und
dann noch einen Clk-Zyklus später, nämlich, wenn das Zählregister wieder
auf 0 geht.
Wie sollen denn da jemals beide Interrupts abgearbeitet werden? Die
Interrupt-Routinen gehen ja von Haus aus schon 11 Zyklen, ohne den noch
auszuführenden Code.
Und wie sprech ich den Interrupt, den ich möchte, an? Ich habs bisher
mit TIMERA0_VECTOR probiert, aber irgendwie geht der MC nie in die
entsprechende Routine, da ich versuchsweise eine LED ausmachen möchte,
die aber immer anbleibt.
Könnte da mal jemand Licht in mein Unwissen bringen? Vielen Dank!
Mein jetziger (nicht funktionierender) Code:
1 | #include "msp430x20x3.h"
|
2 |
|
3 | // ISR:
|
4 | #pragma vector=TIMERA0_VECTOR
|
5 | __interrupt void WATCHDOG_ISR (void) // Wird jede Sekunde ausgeführt
|
6 | {
|
7 | P1OUT = 0x0;
|
8 | }
|
9 |
|
10 |
|
11 | void init(void)
|
12 | {
|
13 | BCSCTL2 = 6; // SMCLK mit Vorteiler 8, SMCLK von DCO
|
14 | P1DIR = 0x1;
|
15 | P1OUT = 0x1;
|
16 |
|
17 | TACTL |= TASSEL_2; // SMCLK ist Source für Timer A
|
18 | TACTL |= ID_3; // Vorteiler ist nochmals 8
|
19 | TACTL |= MC_1; // Up-Mode
|
20 | TACTL |= TAIE; // Interrupt für Timer A einschalten
|
21 |
|
22 | TACCR0 = 1000; // set timer length
|
23 | TACCTL0 |= CCIE; // enable CCRO interrupt
|
24 | }
|
25 |
|
26 |
|
27 |
|
28 | int main( void )
|
29 | {
|
30 | WDTCTL = WDTPW + WDTHOLD;
|
31 | init();
|
32 | _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
|
33 | return 0;
|
34 | }
|
Vielen Dank für eure Hilfe!
Bernhard