Hallo Leute,
ich hab versucht eine Stoppuhr mit dem MSP430 zu programmieren, leider
vergeblich.
Ich habe vor, wenn ein bestimmter Pegel erreicht ist dass der Comparator
A+ in die ISR springt und da den TACCR0 hochzählt.
Die LED wird erfolgreich eingeschaltet, bzw ausgeschaltet, nur zählt er
die Variable i nicht hoch bzw. speichert er den aktuellen Wert von i
nicht ins TACCR0 rein.
Hoffe jemand kann mir einen Denkanstoß dafür geben.
Danke im voraus.
1 | #include <msp430g2553.h>
|
2 |
|
3 | int i=3; // weil unten in der Schleife schon 3 Taktzyklen vergangen sind, bis er angefangen hat
|
4 | // zu zählen
|
5 |
|
6 | #pragma vector = COMPARATORA_VECTOR
|
7 | __interrupt void COMPA_ISR(void)
|
8 | {
|
9 | if (CACTL2 & CAOUT)
|
10 | {
|
11 | CACTL1 |= CAIES; // value high, so watch for
|
12 | // falling edge
|
13 | P1OUT |= BIT6; // if CAOUT set, set P1.6
|
14 |
|
15 | while(1)
|
16 | {
|
17 | i++;
|
18 | TACCR0 = i;
|
19 | }
|
20 | }
|
21 |
|
22 | else
|
23 | {
|
24 | CACTL1 &= ~CAIES; // value low, so watch for
|
25 | // rising edge
|
26 | P1OUT &= ~BIT6; // else reset
|
27 | }
|
28 | } // COMPA_ISR
|
29 |
|
30 |
|
31 | int main (void)
|
32 | {
|
33 |
|
34 |
|
35 | WDTCTL = WDTPW + WDTHOLD; // Stop WDT
|
36 |
|
37 | BCSCTL1=CALBC1_1MHZ; // set DCO to 1MHz, set range
|
38 | DCOCTL=CALDCO_1MHZ; // set DCO step+modulation
|
39 |
|
40 | P1DIR |= BIT6; // P1.6 output
|
41 |
|
42 | // CACTL1 |= CAEX;
|
43 | CACTL1 |= CARSEL + CAREF_1 + CAON + CAIE; // 0.25 Vcc = -comp, on
|
44 | CACTL2 |= P2CA4; // P1.1/CA1 = +comp
|
45 |
|
46 | //---------------------- Timer einstellen ------------------------------
|
47 | TACTL |= TASSEL_1 + MC_1; // CLK-source=32kHz, up-mode
|
48 | BCSCTL3 |= XCAP_3; // CL=~12.5pF
|
49 |
|
50 | TACCR0 = 0;
|
51 |
|
52 | while(1);
|
53 | }
|