Forum: Mikrocontroller und Digitale Elektronik MSP430 F2013 Problem bei Interrupt von P2


von wosa (Gast)


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

von Christian B. (snooz3r)


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

von wosa (Gast)


Lesenswert?

Danke ! das wars :)

von sushil (Gast)


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

von MSP430 (Gast)


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
}

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.