Frohe Weihnachten,
ich wollte heute mal eine Interrupt Service Routine ausprobieren, doch
das klappt nicht wie ich es mir vorstelle. Hier mal der Code:
1 | #include "io430.h"
|
2 | #include "intrinsics.h"
|
3 | #include "stdint.h"
|
4 |
|
5 | volatile int i = 0;
|
6 |
|
7 | void main(void)
|
8 | {
|
9 | //Pins als Output deklarieren
|
10 | P1DIR = 255;
|
11 |
|
12 | //Watchdog anhalten
|
13 | WDTCTL = WDTPW + WDTHOLD;
|
14 |
|
15 | //Basic Clock System initialisieren
|
16 | BCSCTL3 |= XCAP1 + XCAP0;
|
17 |
|
18 | //TimerA initialisieren:
|
19 | // ACLK, Teiler 1, Aufwaertszaehlen, Interrupt an, starten
|
20 | TACTL = TASSEL_1 + MC_1 + TAIE + TACLR;
|
21 |
|
22 | //Zaehlgrenze einstellen:
|
23 | TACCR0 = 32768;
|
24 |
|
25 | //Interrupts einschalten:
|
26 | __enable_interrupt();
|
27 |
|
28 | //Interrupts am TimerA Kanal0 einschalten:
|
29 | TACCTL0 = CCIE;
|
30 |
|
31 | for(;;)
|
32 | {
|
33 |
|
34 | }
|
35 | }
|
36 |
|
37 | #pragma vector = TIMERA0_VECTOR
|
38 | __interrupt void sekuendliches_aufwachen (void)
|
39 | {
|
40 | P1OUT++;
|
41 | i++;
|
42 | }
|
Zweck:
Binärer Zähler, der durch Aufrufe der ISR hochzaehlt (f = 1Hz).
Zwei Dinge wundern mich doch sehr:
-während ich im Debugger und an meinen LEDs sehen kann, wie P1OUT schön
inkrementiert wird, zählt i nur einmal auf 1, der Befehl i++ scheint
(warum auch immer) danach nicht mehr ausgeführt zu werden. Eine lokale
Definition von i in der ISR selbst ändert daran nichts.
-wenn ich an der Stelle:
//Pins als Output deklarieren
P1DIR = 255;
noch ein P1OUT = 0 anhänge, leuchtet die LED an P1OUT.0 viel schwächer,
und der Zählerstand kommt auch nicht über die 1 hinaus.
Ich verstehe echt nicht, was hier vor sich geht, vielleicht kann es mir
ein anderer sagen. Achja, falls es was zur Sache tut: ich entwickle mit
IAR Kickstart.