MSP430 F2013 Problem bei Interrupt von P2

Gast #3327064
Lesenswert?

Hallo, ich habbe folgendes Problem :

Mein Programm springt nicht in die ISR wenn ich eine positive Flanke an 
P2.6 anlege.

void main(void)
{

WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

// Einstellungen für P2.6 als Interrupt Quelle

  CLR(P2SEL,BIT6);      // P2.6 XIN deaktivieren
  SET(P2DIR,BIT6);      // P2.6 = Input
  CLR(P2IES,BIT6);  // P2.6 Interrupt bei steigender Flanke
  SET(P2IE,BIT6);      // P2.6 Interrupt enable
  SET(P2REN,BIT6);    // Pullup/pulldown resistor enabled
  CLR(P2OUT,BIT6);    // Eingang an 0 Potential ziehen

  LED_ON;

  while(1)
  {
  }
}

#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
  if(P2IFG & BIT6)
    {
      LED_OFF;
      CLR(P2IFG,BIT6);
    }
}

CLR und SET sind makros die zum setzen und löschen von bits verwendet 
werden.

LED_ON schaltel eine led ein und LED_OFF schaltet sie wieder aus
#3327097
Lesenswert?

Hi,

die bei der direction genannten BITx gelten danach als Ausgänge. So 
zumindest bei meinem G2553 :)

Hast du das Interrupt flag gesetzt? __enable_interrupt(); Da hatte ich 
auch lange rumgesucht, ist es nicht aktiv, werden keine steuerbaren 
Interrupts aufgerufen obwohl sie anliegen.

Ansonsten musst du halt mal debuggen und schauen ob die Interrupts 
hängenbleiben in dem dazugehörigen Register.

Grüße
Christian
Gast #3589082
Lesenswert?

can you please attach your working code,I am confused when you SET the 
P2 BIT 6 to make it input? Shouldn't it be CLR. IF you have this working 
code then please attach here, also I have issue know what is  this 
statement:

__enable_interrupt ();
may I know why this statement is needed.

regards
sushil singh chauhan
NUS Singapore
Gast #3590552
Lesenswert?

Ein Beispiel
1
#include <msp430g2553.h>
2

3
#define LED_GREEN   BIT6
4
#define TASTE_S2    BIT3
5

6
int main(void) {
7

8
   WDTCTL = WDTPW + WDTHOLD; // WDT stoppen
9

10
   BCSCTL1 = CALBC1_1MHZ;    // Sytemtakt
11
   DCOCTL = CALDCO_1MHZ;
12

13
   P1SEL |= LED_GREEN;       // LED zeigt PWM
14
   P1DIR |= LED_GREEN;
15
   
16
   P1REN |= TASTE_S2;        // Pull einschalten
17
   P1OUT |= TASTE_S2;
18
   
19
   P1IES |= TASTE_S2;        // fallende Flanke
20
   P1IFG &= ~TASTE_S2;       // pending Intr löschen
21
   P1IE |= TASTE_S2;         // enable Intr für Taste
22
   
23
   TACCR0 = 1000;            // Frequenz einstellen
24
   TACCR1 = 100;             // Tastverhältnis 1 : 3
25
   TACCTL1 = OUTMOD2 | OUTMOD1 | OUTMOD0;    // TAO.1 im Mode 7
26
   TACTL = TASSEL1 | MC0 | TACLR;            // Timer einstellen und löschen
27
   
28
   _BIS_SR(LPM1_bits + GIE); // low power und Intr enabled
29

30
}
31

32

33
// Port 1 interrupt service routine
34
#pragma vector=PORT1_VECTOR
35
__interrupt void Port_1(void) {
36

37
  P1IFG &= ~TASTE_S2;                     // pending Intr löschen
38
  TACCR1 = (TACCR1 > 100) ? 100 : 900;    // Tastverhältnis ändern
39

40
}

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