msp430 Interrupt löst "selbständig" aus

Gast #1286607
Lesenswert?

Hallo zusammen,

ich beschäftige mich seit kurzem mit dem µC MSP430F2131.

Ich habe einige Dokus gelesen und versucht die Bsp.-Programme 
nachzustellen.

Mit dem ersten Interrupt Bsp. gibt es aber leider Probleme.

Ich versuche einfach über Taster einen Interrupt auszulösen und ein LED 
nach 5 Tastendrucken zu toggeln.
Der Taster verbindet den Pin 2.3 mit Masse, d.h der Interrupt wird mit 
fallender Flanke ausgelöst.

Zur Programmierung und Schnittstelle verwende ich IAR

Das Programm sieht folgendermassen aus:

#include "msp430x21x1.h"
volatile int zaehler = 0;
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  P1DIR = 0xFF; // alle Pins auf Output gesetzt
  P1OUT = 0xFB;

  P2DIR = 0xF7;                 // P2.3 Input
  P2REN = 0x08;                 // P2.3 Pullup
  P2IES = BIT3;                 // P2.3 Hi/lo edge
  P2IE  = BIT3;                 // P2.3 interrupt enabled
  P2IFG = 0xF7;                 // P2.3 IFG cleared
  _EINT();

while(true)
{
  if(zaehler >= 5)
  {
      P1OUT = ~P1OUT;
      zaehler = 0;
  }

}
  return 0;
}
// Port 2 interrupt service routine
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
  zaehler = zaehler +1;
  P2IFG = 0xF7; // P2.3 IFG clearedf

}

Wenn ich das Programm debugge (haltepunkt im Interrupt) funktioniert 
alles wunderbar.
Lasse ich den Haltepunkt weg wird der Zustand des LEDs bereits nach 2 -4 
Tastendrucken geändert.
d.h ich vermute das durch meinen Tastendruck mehrere Interrupts 
ausgelöst werden.

Ich habe für den Interrupt-Pin den internen Pull-Up aktiviert, ansonsten 
wurden ständig Interrupts ausgelöst weil kein "definierter" Zustand zu 
erkennen war.

Wo kann das Problem liegen?
Wie kann ich das Problem eingrenzen?

Evtl. hat ja jemand eine Idee.

lg

Andi
Gast #1286651
Lesenswert?

Jo, klingt so als würde der Taster prellen.
Gibt sicher schon 1'000'000 threads zu diesem Themam, wie man das lösen 
kann. Eine einfache Lösung ist, einen periodischen Timerinterrupt zu 
generieren (vielleicht so alle 20ms) und darin den Tasterzustand 
abzufragen.
Gast #1288535
Lesenswert?

Hallo Andi,
mir ist noch aufgefallen, dass bei Deiner Initialisierung Bit3 in P2OUT 
nicht gesetzt wird, nur dann ist der interne Widerstand ein Pull-up. Ist 
P2OUT low, dann ist es ein Pull-down.

Gruß, Michael

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