Forum: Mikrocontroller und Digitale Elektronik MSP430 Falscher Pin reagiert auf Interrupt


von Hannes S. (herrhannes)


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.

von Hannes S. (herrhannes)


Lesenswert?

Nun ist mir ein weiteres Problem aufgefallen:

Nur P2.4 reagiert auf Interrupts, auf P2.3 passiert nichts.

Im Debugger habe ich nachgeschaut, die P2ES und P2IE-Bit sind richtig 
gesetzt.

von Jörg S. (joerg-s)


Lesenswert?

Um welchen MSP geht's denn genau?

> -> RX0BUF und RX1BUF!
Hat das was zu bedeuten? Hast du den UART aktiviert?

>auf P2.3 passiert nichts.
Die Pegeländerung am Pin siehst du aber im Debugger im Register?

von Hannes S. (herrhannes)


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?

von Jörg S. (joerg-s)


Lesenswert?

Hannes Stoll schrieb:
> UART auf UCA0 und SPI auf UCB0 sind aktiviert, kann das ein Problem
> sein?
Wenn das die betroffen Pins sind, ja. Schau in das Datenblatt vom 
Controller, da ist die interne Schaltung der Pins drin. Da siehst du was 
passiert wenn du PxSEL setzt.

von Hannes S. (herrhannes)


Lesenswert?

Achso, nein, das sind sie nicht.
P2.3 ist demnach: GP IO Pin und Timer1_A IO.
Aber eben nicht per P2SEL oder P2SEL2 ausgewählt, außer das hat eben 
etwas mit SPI oder UART zu tun, was ich aber nicht glaube.

von Jörg S. (joerg-s)


Lesenswert?

Um welchen MSP geht's denn genau?

von Hannes S. (herrhannes)


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.

von Jörg S. (joerg-s)


Lesenswert?

Wie löst du denn die Interupts aus?

von Debugger (Gast)


Lesenswert?

Hannes Stoll schrieb:
> Der Grund ist mir aber weiterhin rätselhaft.

Und er bleibt es auch, wenn du hier nicht den ganzen Code zeigst.

von Josef (Gast)


Lesenswert?

Die Zaehlung beginnt bei 0.
BIT3 + BIT4 sind das 4. und 5. Bit / Pin.

Gruss

von Josef (Gast)


Lesenswert?

Ist Bloedsinn was ich geschrieben habe.
Die Pins fangen ja auch bei 0 an.

von Hannes S. (herrhannes)


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.

von Debugger (Gast)


Lesenswert?

Hannes Stoll schrieb:
> Hier der gesamte Code

Das glaube ich nicht!!! Wo wird GIE gesetzt?

Du solltest einen Blick in den FUG werfen.

von Hannes S. (herrhannes)


Lesenswert?

1
__bis_SR_register(LPM0_bits + GIE);
Die werden in der main() gesetzt, nachdem alles andere initialisiert 
ist.
Dachte, das wäre klar, nachdem die anderen Pins ja korrekt reagieren.
Den FUG schaue ich mir mal an, habe nur speziell im Dokument für meinen 
µC geschaut.

von Erik (Gast)


Lesenswert?

Probier doch mal nur einen einzelnen Pin aus
also  nur Bit 2  ....

schau dir im Debugger die Port2 Belegung an
evtl. im Forum veröffentlichen

mfg erik

von Hannes S. (herrhannes)


Lesenswert?

Ok, das mache ich dann mal, wenn ich wieder zuhause bin.

Meiner Meinung nach waren da aber keine Auffälligkeiten, bis eben 
darauf, dass die ISR nicht aufgerufen wurde.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.