Forum: Compiler & IDEs MSP430 Probleme mit den Interrupts


von Christian Ege (Gast)


Lesenswert?

Hallo ich verwende den mspgcc und einen M430F149.

Ich habe da noch ein Problem mit dem MSP430 und dessen Interrupts:

Wann wird der Interrupt beim MSP430 ausgelöst?
Ich habe nämlich das Problem das alle X-Mal der Interrupt ausgelöst
wird wenn die Taste losgelassen wird. Was ja im Prinzip kein allzu
großes Problem ist. Jetzt will ich aber einen Schrittmotor damit
steuern der solange P1.1 gedrückt ist nach links läuft und solange P1.2
gedrückt ist nach rechts laufen. Da stört mich der Umstand das der
Interrupt erst beim loslassen der Taste ausgelöst wird ziemlich.

Hier die Initialisierung meines PORTS

Es wird nur P1.1 und P1.2 als Interrupt initialisiert.

P1DIR = 0xF9;  //Port1 als Eingang verwenden
P1IE = 0x06;  //PORT1 Interrupt Enable Flag
P1SEL = 0xF9;  //PORT1 Modul select Flag
P1IFG  = 0x00;  //PORT1 Interrupt Flag
P1IES = 0xF9 ;  //PORT1 Interrupt Edge select (0=pos 1=neg)

Oder habe ich insgesammt ein riesen Denkfehler drin?

Die Tasten habe ich nachgemessen, die sollten das richtige tun.

cu
chege

von OldBug (Gast)


Lesenswert?

Ich habe jetzt nicht lange drüber nachgedacht, aber das hört sich nach
falschem IES an...

Gruß,
Patrick...

P.S.: Korrigiert mich, wenns falsch ist ;)

von Christian Ege (Gast)


Lesenswert?

@ OldBug
Meines Wissens müsste ich die den PORT richtig initialisiert haben.

Hier ein ausführliches Beispiel:


#include <msp430x14x.h>
#include <io.h>
#include <signal.h>
#include <iomacros.h>

#define KEY_INPUT P1IFG
#define MASK      0x06    //Maskierung nur P1.1 und P1.2

void delay(unsigned int d);                            //Prototyp für
delay(...)

int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;    //Stop watchdog timer
    P5DIR = 0xFF;                              //Port5 (LEDS) alle PINS
auf Ausgang schalten "1111 1111"

  P1DIR   = 0xF9;                    //Port1 als Eingang verwenden
    P1IE   = 0x06;        //PORT1 Interrupt Enable Flag
  P1SEL   = 0xF9;                          //PORT1 Modul select Flag
    P1IES   = 0x00;                      //PORT1 Interrupt Edge select
(0=pos 1=neg)

  P5OUT = 0xFF;        // Alle LEDS an
   _EINT();                                   //Enables Interrupts

  for(;;)          //Endlosschleife
  {
    nop();
    delay(65500);      // Delay
  }

 return(0);
}

void delay(unsigned int d)
{
  volatile int i;
  for(i = 0; i < d; i++)
    nop();
}

interrupt(PORT1_VECTOR) intServiceRoutine(void)
{
  P5OUT = 0x00;      // LEDS aus
  P5OUT = P1IFG & MASK;  // IFG Maskiert
  P5OUT = P5OUT << 5;    // LED 6&7 = P1IFG
  P5OUT = P5OUT | (~P1IN & MASK);  // LED 1&2 = P1IN

  P1IFG = 0x00;      //Verlassen des Interrupts
}

von OldBug (Gast)


Lesenswert?

Hallo Christian!

Wie ist denn Dein Taster an P1.1 bzw P1.2 angeschlossen?
Wird der Pin per PullUp gegen Versorgungsspannung gehalten, und der
Taster legt den Pin dann auf low, oder wird der Pin per PullDown gegen
GND gehalten, und der Taster legt den Pin auf high?

von Christian Ege (Gast)


Lesenswert?

Also ich bin eher der Programmierer nicht so der Hardware Mensch ;-)

Vielleicht hilft Dir das ja schon weiter, ich habe das DEMO Board von
ELV. Gab es günstig bei Ebay sonst hätte ich es mir nicht gekauft.


So ist das Teil beschaltet: (P1.2 – P1.4 Analog)



             R24 10kOhm
           ____
  VCC 3.2 V o---|______|-------o-------------------> MSP430
               |
              |-D Taster P1.1 ...
             |
  GND o------------------|-----------
           __|__
           -----
             -
Das müsste dann PullUp sein oder ?


thx

chege

von Christian Ege (Gast)


Angehängte Dateien:

Lesenswert?

Schade hat er total zerhauen ;-(
Ich häng ein Bild mit dran!

cu
chege

von OldBug (Gast)


Lesenswert?

Hm, Probiers mal damit:

P1IES |= BIT0;      /* Interrupt on falling edge  */

Gruß,
Patrick...

von OldBug (Gast)


Lesenswert?

ähm...

P1IES |= BIT1;

Sorry... ;)

von Oliver Keller (Gast)


Lesenswert?

Hi Christian,

Also ausser P1IES, müsste bei Dir v.a. P1SEL falsch gesetzt sein.
Die Port 1 Pins mit Tasten dran müssten eigentlich im P1SEL auf 0
gesetzt werden, d.h. die müssen als ganz normaler IO konfiguriert
sein.
Bei mir (MSPGCC) kommt sonst jedenfalls überhaupt kein Interrupt auf
Tastendruck.

Gruss,
Oli

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.