Forum: Mikrocontroller und Digitale Elektronik MSP430 Interrupt Problem


von Philipp .. (philippg)


Lesenswert?

Hi!
Ich habe ein kleines Problem mti einem der MSP430 Starter Kits.


Ich wollte ersteinmal ein ganz einfaches Toggeln einer LED per Button 
machen.
Das Togeln per vorinstalliertem Button funktioniert einwandfrei.
Will ich jedoch mittels eigenem angelöteten Schalter toggeln schlägt 
dies fehl.

Anschlüsse:
P10 und P16 LEDs
P13 ist ein aufgelöteter Taster.

Ich habe ein Kabel an GND befestigt. Sobald das Kabel P13 berührt, 
schalten die LEDs um.
Nach meinem Code oben müssten die LEDs aber auch umschalten, wenn ich 
P14 berühre... richtig?
1
void main(void){
2
  WDTCTL = WDTPW + WDTHOLD;  // Setup WDT
3
  
4
  P1DIR = BIT0 | BIT6;    // Setup In/Out
5
  P1OUT = BIT6;        // Flash green LED
6
  
7
  P1IE = BIT3;        // Interrupt on Bit3
8
  
9
  __bis_SR_register(GIE);
10
11
  P1IE |= BIT4;
12
  P1IES |= BIT4;
13
  
14
}
15
16
17
  /*
18
   * Button Interrupt
19
   */
20
#pragma vector=PORT1_VECTOR
21
__interrupt void PORT1_ISR(void){
22
  if( P1OUT & BIT6 )
23
    P1OUT = BIT0;
24
  else
25
    P1OUT = BIT6;
26
  P1IFG &= !BIT3;      // Reset Interrupt Flag Register
27
}

Bin für jede Hilfe dankbar!

Grüße, Philipp

von LuXXuS 9. (aichn)


Lesenswert?

Dir fehlt ne Endlosschleife oder LPM.

von Philipp .. (philippg)


Lesenswert?

Ich habe als letzte Zeile in der main()-Methode jetzt mal while(); 
eingefügt.
Bringt aber keine veränderung.

von LuXXuS 9. (aichn)


Lesenswert?

While(1){}

von Philipp .. (philippg)


Lesenswert?

Sry, hatte oben falsch gepostet!

while(1);

Stand im Code!

while(1); bzw. while(1){} bringt keine Veränderung!

von LuXXuS 9. (aichn)


Lesenswert?

Poste bitte nochmal genau, was du überhaupt vorhast. Mit welchem Pin 
willst du jetzt was machen?

Wenn du einen Taster gegen GND schaltest, dann brauchst du auch nen 
Pull-Up.

von Philipp .. (philippg)


Lesenswert?

Pin3 hat einen fertig verlöteten Taster.
Dieser löst den Interrupt korrekt aus.

Statt den Taster zu drücken, kann ich auch ein Kabel an GND und die 
Lötstelle am Taster halten. Funktioniert ebenso.

Wenn ich das Kabel von GND an Pin4 halte, wird der Interrupt allerdings 
nicht ausgelöst!
Das möchte ich aber.

Pin4 soll mittels eines Schalters (oder eben atm durch Kabel dran 
halten) den Interrupt auslösen.

von Philipp .. (philippg)


Lesenswert?

Hier mal besser aufgeräumter Code:

So hier nochmal aufgeräumterer Code:
1
#include  "msp430x20x2.h"
2
3
#define     TASTER          BIT3
4
#define     LED             BIT6
5
#define     KABEL            BIT4
6
7
8
void main(void){
9
  WDTCTL = WDTPW + WDTHOLD;  // Setup WDT
10
  
11
  P1DIR = LED;  // Output in 0 and 6
12
  P1OUT = P1DIR;
13
  P1IN = !P1DIR;
14
  P1IFG = 0x00;
15
  
16
  P1IE = KABEL | TASTER;
17
18
  __bis_SR_register(GIE);
19
  while(1){}
20
  
21
}
22
23
24
  /*
25
   * Button Interrupt
26
   */
27
#pragma vector=PORT1_VECTOR
28
__interrupt void PORT1_ISR(void){
29
  P1OUT ^= LED;
30
  P1IFG = 0x00;          // Reset Interrupt Flag Register
31
}

von LuXXuS 9. (aichn)


Lesenswert?

Schreiben ans P1IN-Register ist Blödsinn. Auch ist es nicht sinnvoll, 
Anweisungen wie P1OUT = P1DIR zu schreiben - das ist aber eher 
genereller Natur.

Benutzt du das Launchpad? Hast du einen Pull-Up-R (In Software 
jedenfalls nicht)? Evtl. hat der Tasterveinen in Hardware, das Kabel 
atürlich nicht.

von Philipp .. (philippg)


Lesenswert?

Ja, ist das Launchpad.

Ich habe jetzt mal den Softwareseitigen Pull-Up-R aktiviert. Keine 
Veränderung.
hardwareseitig habe ich noch keinen. Muss gerade mal schauen was ich da 
an Wiederstand einsetzen muss.
1
#include  "msp430x20x2.h"
2
3
#define     TASTER          BIT3
4
#define     LED             BIT6
5
#define     KABEL            BIT4
6
7
8
void main(void){
9
  WDTCTL = WDTPW + WDTHOLD;  // Setup WDT
10
  
11
  P1DIR = LED;  // Output in 0 and 6
12
  P1REN |= KABEL;
13
  P1IFG = 0x00;
14
  P1IE = KABEL | TASTER;  
15
  __bis_SR_register(GIE);
16
  while(1){}
17
  
18
}
19
20
// Taster Interrupt
21
#pragma vector=PORT1_VECTOR
22
__interrupt void PORT1_ISR(void){
23
  P1OUT ^= LED;
24
  P1IFG = 0x00;          // Reset Interrupt Flag Register
25
}

von Stefan (Gast)


Lesenswert?

Philipp ... schrieb:
> Ich habe jetzt mal den Softwareseitigen Pull-Up-R aktiviert.
Nein, du hast den Pull-Down-R eingeschaltet.  Wenn du den Pull-Up willst 
musst du noch das entsprechden P1OUT Bit setzen.

von Philipp .. (philippg)


Lesenswert?

Und schon klappt es :-)

Wusste ich bisher so nicht..  großes Danke für die Hinweise und Tipps!
Es läuft wunderbar!

Hier nochmal der entgültig funktionierende Code:
1
#include  "msp430x20x2.h"
2
3
#define     TASTER          BIT3
4
#define     LED             BIT6
5
#define     KABEL            BIT4
6
7
8
void main(void){
9
  WDTCTL = WDTPW + WDTHOLD;  // Setup WDT
10
  
11
  P1DIR = LED;  // Output in 0 and 6
12
  P1REN |= KABEL; // Resistor enabled
13
  P1OUT |= KABEL; // out =1 for pullup-resistor
14
  P1IFG = 0x00; // Clear interrupt flags
15
  P1IE = KABEL | TASTER;  // Turn on Interrupts
16
  __bis_SR_register(GIE);
17
  while(1){}
18
  
19
}
20
21
// Taster Interrupt
22
#pragma vector=PORT1_VECTOR
23
__interrupt void PORT1_ISR(void){
24
  P1OUT ^= LED;
25
  P1IFG = 0x00;          // Reset Interrupt Flag Register
26
}

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.