Forum: Mikrocontroller und Digitale Elektronik Problem mit Interrupts beim MSP430F169


von Björn W. (bjoern2007)


Lesenswert?

Hallo zusammen,


ich habe ein kleines Problem. Es gelingt mir nicht, einen Interrupt zu 
erzeugen, bzw. zu detektieren.

Ich habe eine LED an den Ausgang Pin 2.7 angeschlossen. Die LED ist über 
einen Widerstand auf Masse gelegt, sollte also leuchten, wenn der 
Ausgang auf high liegt. Das funktioniert auch schon mal.
Gleichzeitig habe ich einen Taster über einen 1,8kohm Widerstand auf 
3,3Volt gelegt und an den Pin 1.0 angelegt. Der Pin ist auch über ca. 
250kohm auf Masse. Also sollten an Pin 1.0 entweder 0V, bzw. im Falle 
eines betätigten Schalters 3,3Volt liegen.

Nun versuche ich, die LED nach Programmstart leuchten zu lassen und über 
einen Interrupt an P1.0 (steigende Flanke) die LED aus zu machen.

Dazu nutze ich folgenden Code unter IAR:

_______________________
#include <msp430x16x.h>


int main( void )
{
  WDTCTL = WDTPW + WDTHOLD;  //watchdog aus
  P2DIR=0xFF;      //port 2 = Output
  P2SEL=0x00;      //alle ports als GPIO
  P2IE=0x00;      //Port 2 interrupt ausmachen
  P2OUT=0x02;      //initial alle LEDs aus (P2.1 LED is active low)

  P1DIR=0x00;                   //P1 alle als input
  P1SEL=0x01;                   //P1.0 as GPIO

  P1IE=0x01;                    //P1.0 interrupt einschalten
  P1IES=0xFF;                   //interrupt on rising edge

  _BIS_SR(GIE);      //Interrupts aktivieren

  P2OUT=0x82;      //LED einschalten

  for(;;)      //Warteschleife
  {
  }

}

#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
  P2OUT&=~0x82;      //LED ausschalten
  P1IFG&=~0x00;                 //Interrupt flag löschen
}

_____________________________

Leider funktioniert es nicht so, wie es sollte. Es wird kein Interrupt 
an P1.0 detektiert und die LED leuchtet immer. Ich habe im Debug-Modus 
unter IAR festgestellt, das einige Male ein Reset ausgelöst wurde, was 
ich mir jedoch nicht erklären kann.

Wer hat eine Idee, was ich falsch mache?

Vielen Dank schon einmal für evtl. Tips.

Gruß,
Björn

von Jörg S. (Gast)


Lesenswert?

1
#pragma vector=PORT2_VECTOR
2
__interrupt void Port_2(void)
Interrupt an Port1 oder 2???? ;)

von Björn W. (bjoern2007)


Lesenswert?

Ups. Danke für den Hinweis.

Habe es umgeschrieben auf:
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)

Gerade mal eben getestet, aber da ist wohl immer noch was im Argen. Es 
wird durch die Taste immer noch kein Interrupt ausgelöst...

von Stefan (Gast)


Lesenswert?

> P1SEL=0x01;                   //P1.0 as GPIO
P1SEL muss '0' sein für I/O-Funktion der Pins !
Mit P1SEL = 0x01 wählst Du für P1.0 die Peripheral-Funktion TACLK-input 
aus!

> P1IES=0xFF;                   //interrupt on rising edge
eben genau anders herum: P1IES = 0x00 für low-to-high transistion!

>P1IE=0x01;                    //P1.0 interrupt einschalten
Dies erst nach P1IES setzen, da sonst u.U. ein IRQ ausgelöst werden 
kann. Vorher P1IFG löschen!

> #pragma vector=PORT2_VECTOR
> __interrupt void Port_2(void)
> {
>   P2OUT&=~0x82;      //LED ausschalten
>   P1IFG&=~0x00;      //Interrupt flag löschen
> }
Interrupt flag löschen: P1IFG &= ~0x01;


Das steht aber alles im User-Guide.

Stefan

von Björn W. (bjoern2007)


Lesenswert?

Jau, das hat geholfen. Vielen Dank!

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.