MSP430 Probleme mit den Interrupts

Gast #76084
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
Gast #76086
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
}
Gast #76087
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?
Gast #76088
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
Gast #76092
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.