Forum: Mikrocontroller und Digitale Elektronik MSP 430 - Interrupt des Port 1 nutzen, aber wie?


von Johannes (Gast)


Lesenswert?

Moin!

habe mir kuerzlich sampels des Microcontroller MSP430F437 zukommen
lassen. habe soweit auch alles aufgebaut und auf dem controller auch
ein einfaches programm laufen lassen.
nun wollte ich einen interrupt des port 1 nutzen. solbald dort eine
rising edge festgestellt wird sollen 2 pins des port 2 (die zu leucht
dioden fuehren) mittels interrupt handler auf high gesetzt werden.
mein code sieht wie folgt aus:

/*********************************************************************** 
******
*
     *
*                                    T E S T
     *
*
     *
************************************************************************ 
*****/


#include <msp430x43x.h>
#include <stdio.h>



void delay(void)
{
  int i;
  for(i=0; i<3000; i++);
}


int main(void)
{
  P2DIR |= 0xA2;   //Pin 7 + 5 + 1 of Port 2 = outputs;
  P2IE  |= 0x08;  //Interrupt for Pin 3 = enabled
  P2IES &= ~0x01;   //rising edge
  P2IFG &= 0x00;   //reset interrupt

  P2OUT &= 0x02;

  while (1)
  {
     delay();
  }

} //main-loop

// Port2 interrupt service routine
#pragma vector=PORT2_VECTOR
__interrupt void key_pressed (void)

{
  P2OUT |= 0xA0;
  P2IFG &= 0x00;  //reset interrupt

}


Es passiert aber rein gar nichts! ist die initialisierung vielleicht
falsch?
fuer hilfe am besten mit code beispielen waere ich sehr dankbar!


johannes

von Peter Dannegger (Gast)


Lesenswert?

P2IES &= ~0x01;   //rising edge
  P2IFG &= 0x00;   //reset interrupt

  P2OUT &= 0x02;


Ich kenne den MSP nicht, aber in der Regel stehen Register nach dem
Reset auf 0x00, d.h. es ist witzlos etwas zu UNDieren.

0x00 UND irgendwas bleibt 0x00


Sauberer ist es aber, jede erste Registeroperation immer als Zuweisung
auszuführen, dann sind alle Bits definiert.


Peter

von Johannes (Gast)


Lesenswert?

Peter!

Du hast natuelrich recht! (habe den fehler komischer weise in dem prog
dass ich die ganze zeit auf dem MSP laufen lasse nich gemacht...)

vielen dank dafuer!


leider laeufts immer noch nicht. ich vermute dass ich den interruot
falsch initialisiert habe..


kann mir wer weiterhelfen?!


johann

von Tom (Gast)


Lesenswert?

Hi Johannes

Was ist denn das für eine Delay-Funktion? Der MSP430 hat Timer und
diverse Schlafmodi, womit man das eleganter lösen könnte. Natürlich,
für erste Schritte programmiert man schon mal sowas.
Hast du mal mit einem Debugger geprüft, ob alle Register richtig
gesetzt werden? Bei manchen Simulatoren/Debuggern kannst du Interrupts
auch von Hand auslösen. Vielleicht hilft dir das weiter.

FG

Tom2

von Jörn (Gast)


Lesenswert?

Hallo Johannes,

Das GIE Bit hast du nicht aktiviert oder siehe ich das falsch.

Gruß Jörn

von Johannes (Gast)


Lesenswert?

Joern!

"Maskable interrupts are the lowest priority interrupts and can be
turned off individually with the various interrupt enable registers or
turned off as a group by setting the general interrupt enable bit (GIE)
in the status register (SR)."


Ich dachte, wenn ich das setze DISABLE ich die maskable Interrupts..
ich will sie ja nun aber aktivieren!

trotzdem: vielleicht sollte ich es mal ausprobieren, das zu setzen.
kannst du mir hierfuer beispiel code geben? ich weiss leider nicht wie
man das mit dem status reg macht!

von Jörn (Gast)


Lesenswert?

Dürfte so ziemlich genau das sein, was du suchst ;)

Beispiel von TI HP:


#include <msp430x11x1.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  P1DIR |= 0x01;                        // Set P1.0 to output
direction
  P2IE |= 0x01;                         // P2.0 interrupt enabled
  P2IES |= 0x01;                        // P2.0 Hi/lo edge
  P2IFG &= ~0x01;                       // P2.0 IFG cleared

  _BIS_SR(LPM4_bits + GIE);             // Enter LPM4 w/interrupt
}

// Port 2 interrupt service routine
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
  P1OUT ^= 0x01;                        // P1.0 = toggle
  P2IFG &= ~0x01;                       // P2.0 IFG clearedf
}

von Jörn (Gast)


Lesenswert?

Wahrscheinlich wird deine CPU immer durch den WD reset.

von Johannes (Gast)


Lesenswert?

auf "_BIS_SR(GIE);" bin ich auch schon gekommen, doch das led hat
immer geflackert. denke das ich das aber sauber und ordentlich
hinbekomme wenn ich den WDT disable ...

vielen dank!!

johannes

von Mario (Gast)


Lesenswert?

Hallo,

Jörn hat schon recht, du musst die Interrupts erst mal global erlauben
(das geht mit de GIE-Bit, es heißt ja auch 'global interrupt
ENABLE'). Ist das auf 0, wird KEIN Interrupt ausgeführt.

In dem Befehl '_BIS_SR(LPM4_bits + GIE)' ist ebenfalls das Setzen
dieses Bits enthalten !

Und außerdem musst du, wie auch bereits erwähnt, den Watchdog
ausschalten, der hat mich bei der Entwicklung meiner Programme auch
schon einiges an Nerven gekostet, bis ich draufgekommen bin, dass der
alle paar Millisekunden einen Reset auslöst (ich war halt die Atmels
gewöhnt, wo er von Haus aus disabled ist) ...

Grüße, Mario

von Johannes (Gast)


Lesenswert?

Hehe, kann gut nachvollziehen, was du meinst.
habe ueber den hitachi H8S programmieren gelernt. da muss man den auch
nicht extra disablen. was solls, nun weiss ich ja was los is :)


danke fuer eure hilfe!


johannes

von tenner (Gast)


Lesenswert?

tach,

wenn du einen interrupt an PORT 1 nutzen willst, solltest du auch den
interrupt für port 1 und nicht für port 2 konfigurieren.

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  P2DIR = 0xA2;   //Pin 7 + 5 + 1 of Port 2 = outputs;
  P1IE  |= 0x08;  //Interrupt for Pin 3 = enabled
  P1IES &= ~0x01;   //rising edge
  P1IFG &= 0x00;   //reset interrupt

  P2OUT &= 0x02;

  eint();

  while (1)
  {
     delay();
  }

} //main-loop

// Port1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void key_pressed (void)

{
  P2OUT |= 0xA0;
  P1IFG &= 0x00;  //reset interrupt
}

code ist untesteted

von Johannes (Gast)


Lesenswert?

Das ist ein argument! ;)
hab den mist mitlerweile schon zum laufen bekommen..
trotzdem danke !

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.