Hallo zusammen,
ich habe hier ein kleines Problem mit meinem MSP430F1611:
Ich möchte einen Port-Pin (genauer: P1.5, Pin 17 beim MSP430F1611) auf
Änderungen hin überwachen. Bei einer fallenden Flanke soll in die ISR
vom Timer_A0 gesprungen werden.
Minimaler Code um den Fehler zu reproduzieren:
1 | /***********************
|
2 | main_isr
|
3 | ***********************/
|
4 | INTERRUPT_HANDLER(main_isr, TIMERA0_VECTOR)
|
5 | {
|
6 | P5OUT ^= BIT0;
|
7 | }
|
8 |
|
9 | /***********************
|
10 | main
|
11 | ***********************/
|
12 | void main(void)
|
13 | {
|
14 | // (Initialisierung von Clock, Watchdog & Co.) (...)
|
15 |
|
16 | P1DIR = 0x00;
|
17 | P1SEL = BIT5; // P1.5 configured as TA0
|
18 | //P1SEL = BIT1; // (*) P1.1 configured as TA0
|
19 |
|
20 | // Falling edge + CCI0A + Capture Mode + Interrupt
|
21 | TACCTL0 = CM_2 + SCS + CCIS_0 + CAP + CCIE;
|
22 |
|
23 | // ACLK + Continuous Mode
|
24 | TACTL = TASSEL_1 + MC_2;
|
25 | __enable_interrupt();
|
26 | while(1)
|
27 | {
|
28 | // Busy wait
|
29 | }
|
30 | }
|
Das seltsame ist: Wenn ich statt P1.5 den Pin P1.1 als TA0 einstelle
(also den mit (*) gekennzeichneten Code einkommentiere) funktioniert
alles
problemlos (d.h. die ISR wird angesprungen und alles ist so wie es sein
sollte).
Einen Hardwaredefekt kann ich ausschliessen, da meine fallende Flanke
garantiert am Pin P1.5 anliegt (mit Oszi nachgemessen).
Die Falnek liegen auch lange genug an (mehrere 100ms), so dass hier
eigentlich mehr als genug Zeit für den MSP430 bleibt um die Änderung zu
registrieren.
Ich bin hier gerade ein wenig verwirrt. Ich habe das Datenblatt so
verstanden, dass ich über eine "1" an der entsprechenden Stelle des
P1SEL-registers auswählen kann, welchen Port-pin ich gerne als
TA0-Quelle haben möchte. Laut Datenblatt kommen dazu beim MSP430F1611
die Pins P1.1 (Pin 13) und P1.5 (Pin 17) in Frage.
Meine Frage: Was läuft hier Falsch? Warum funktioniert denn das nur mit
P1.1 als TA0?
Neugierige Grüsse
DanDanger