www.mikrocontroller.net

Forum: Compiler & IDEs MSP430 Probleme mit den Interrupts


Autor: Christian Ege (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Christian Ege (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christian Ege (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian Ege (Gast)
Datum:
Angehängte Dateien:

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

cu
chege

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, Probiers mal damit:

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

Gruß,
Patrick...

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm...

P1IES |= BIT1;

Sorry... ;)

Autor: Oliver Keller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.