MSP430 Falscher Pin reagiert auf Interrupt

OP #3118413
Lesenswert?

Hallo,

meine Interrupt-Register sind wie folgt konfiguriert:
1
    /* Port 2 Interrupt Enable Register */
2
    P2IE = BIT3 + BIT4; //Interrupts auf Pin 2.3 und 2.4 aktivieren -> RX0BUF und RX1BUF!
3

4
    /* Port 2 Interrupt Edge Select Register */
5
    P2IES = BIT3 + BIT4 ; //falling edge
6

7
    /* Port 2 Interrupt Flag Register */ //Interrupt Flags löschen
8
    P2IFG = 0;

Nun wird aber die ISR auch aufgerufen, wenn sich PIN2.5 ändert, das 
entsprechende Flag im P2IFG wird gesetzt.

Wieso passiert das? BIT5 von P2IE steht eindeutig und die ganze Zeit auf 
'0'.
Wie sorge ich dafür, dass nur auf PIN2.3 und PIN2.4 reagiert wird?

Gruß
Hannes


Edit: Scheinbar passiert das nur genau einmal.
Das heißt, setze ich danach P2IFG wieder zurück, wird zwar das Bit von 
Pin 5 wieder gesetzt, aber nicht in die ISR gesprungen.
Der Grund ist mir aber weiterhin rätselhaft.
OP #3125810
Lesenswert?

Die Kommentare sind für mich gedacht, das sind die beiden Pins, auf 
denen der MCP2515 anzeigt, wenn der entsprechende Empfangspuffer voll 
ist.

Die Pegeländerung sehe ich im Debugger, seltsamerweise funktioniert es 
zB. mit P2.2. P2SEL ist für die Pins natürlich jeweils deaktiviert.

UART auf UCA0 und SPI auf UCB0 sind aktiviert, kann das ein Problem 
sein?
OP #3125983
Lesenswert?

Um den G2553, der beim Launchpad dabei war.
Allerdings auf ein Breadboard gesteckt.
Im Datenblatt steht eben, dass sowohl P1 als auch P2 vollständig als 
Interruptquellen genutzt werden können und an P2.3 keine vorausgewählten 
Spezialfunktionen wie Takt etc. hängen.
Daher bin ich etwas verwundert.
OP #3126664
Lesenswert?

Nun gut. Hier der gesamte Code, schon mit P2.2 statt 2.4: (Könnt ihr 
euch ja umdenken.
1
    /* Port 2 Interrupt Enable Register */
2
    P2IE = BIT2 + BIT3; //Interrupts auf Pin 2.3 und 2.2 aktivieren -> RX0BUF und RX1BUF!
3

4
    /* Port 2 Interrupt Edge Select Register */
5
    P2IES = BIT2 + BIT3; //falling edge
6

7
    /* Port 2 Interrupt Flag Register */ //Interrupt Flags löschen
8
    P2IFG = 0;
9
}
10

11
#pragma vector=PORT2_VECTOR     //ISR FOR PORT2
12
__interrupt void PORT2(void)
13
{
14
  
15
[breakpoint]
16
  if(P2IFG & BIT2)
17
  {
18
    //CANINTFRX0IF -->erster Buffer voll
19
    uart_send_string("Buffer0 empfangen!\n");
20
    uart_send_string(can_receive_buffer0());
21
    P2IFG &= ~BIT2; //Interrupt-Flag zurücksetzen
22
    mcp2515_bit_modify_register(0x2c,0x01,0x00);
23
  }
24

25
  else if(P2IFG & BIT3)
26
  {
27
    //CANINTFRX1IF -->zweiter Buffer voll
28
    uart_send_string("Buffer1 empfangen!\n");
29
    uart_send_string(can_receive_buffer1());
30
    P2IFG &= ~BIT3;
31
    mcp2515_bit_modify_register(0x2c,0x02,0x00);
32
  }
33
}
Wie ihr seht, nichts besonderes, Interrupthandler für den Port und dann 
wird überprüft, welche Pins nun genau den Interrupt ausgelöst haben.
Der innere Code ist an sich auch total egal, da die ISR gar nicht erst 
ausgelöst wird. (Stelle [breakpoint] wird gar nicht erst erreicht.)
Interruptpins sind active low, ein runterziehen von Hand bringt nur 
etwas bei 2.2 und 2.3, 2.4 mag nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren