Forum: Mikrocontroller und Digitale Elektronik MSP430F1232 + Interrupt Port 1


von GeRi (Gast)


Lesenswert?

Hi Leute!

Ich möchte am Port 1 auf dem auch das JTAG interface verbaut ist eine 
Interrupt-abfrage machen.

Hab dafür auch den Code geschrieben und der funktioniert. Jedoch 
funktioniert er immer nur für einen Taster. Wenn ich jetzt im Interrupt 
2 Taster abfragen will dann spielt das ganze ding verrückt.

Ich versteh das nicht... kann das sein dass ich die Interrupts dann 
anders rücksetzen muss oder wie?


CODE:
//---------------------------------------------------------------------- 
---
  if((P1IFG & BIT6)){     //Abfrage auf Interruptflag an P1.6
    P1IE &= ~BIT6;

    //while(P1IN & BIT6);   //Warten bis Taster wieder losgelassen

    sChannel=1;       //Kanalauswahl

    //for(k=0;k<=3000;k++); //Entprellung
    P1IE |= BIT6;         //Interrupt wieder freigeben
  }
//---------------------------------------------------------------------- 
---
   if(P1IFG & BIT7){      //Abfrage auf Interruptflag an P1.7
    P1IE &= ~BIT7;        //Interrupt sperren (wegen Prellung)

    //while(P1IN & BIT7);   //Warten bis Taster wieder losgelassen

    if(P2IE & BIT0)       //T1 (bett) für Start des 
Nulldurchgangsinterrupt
      P2IE &= ~BIT0;
    else
      P2IE |= BIT0;

    //for(k=0;k<=3000;k++); //Entprellung
    P1IE |= BIT7;         //Interrupt wieder freigeben
  }

  P1IFG &= ~BIT6;         //Interrupt T2 löschen
  P1IFG &= ~BIT7;         //Interrupt T1 löschen


Wieso soll das nicht funktionieren?

Hab auch das flag schon in der IF schleife rückgesetzt. das bringt auch 
nichts!!!

Bitte um hilfe!

mfg, geri

von Jörg S. (joerg-s)


Lesenswert?

>P1IE &= ~BIT7;        //Interrupt sperren (wegen Prellung)
>P1IE |= BIT7;         //Interrupt wieder freigeben
Ist unnötig da im Interrupt alle Interrupts eh deaktiviert sind.

>Jedoch funktioniert er immer nur für einen Taster.
D.h. das 2. Flag wird nicht gesetzt oder nicht bearbeitet, oder...?

>Wenn ich jetzt im Interrupt 2 Taster abfragen will dann spielt das ganze
>ding verrückt.
Was bedeutet "verrückt"?

von GeRi (Gast)


Lesenswert?

es lösen beide taster einen interrupt aus. Sie sind auf falling edge 
geschalten, was mit den tastern übereinstimmt.

Komischerweiße kommt der interrupt an bit7 nur dann wenn ich drücke und 
löst die richtige aktion aus.

Der taster an bit6 löst interrupt aus, jedoch müsste ich am taster 
bleiben um die aktion auszuführen.. wie kann das sein?

die taster sind komplett gleich aufgebaut alle auf falling edge 
geschaltet...

ich versteh das nicht!

mfg, geri

von Jörg S. (joerg-s)


Lesenswert?

Mmm, ich hab ehrlich gesagt immer noch nicht verstanden was los ist.

von Christian R. (supachris)


Lesenswert?

Kannst du den Quellcode nochmal ohne die auskommentierten Stellen 
posten? Und als formatierten Text, damit man da durchsieht? Und solche 
While-Schleifen usw. in der ISR macht man niemals nicht, überhaupt nicht 
und unter keinen Umständen ;)

von Peter Diener (Gast)


Lesenswert?

Hallo,

das kann mit der Prellzeit der Taster zu tun haben, Bit7 hat vom 
Auslösen des Interrups an mehr Zeit, bis die while Schleife kommt, kann 
diese also umgehen, wenn der Taster gerade in diesem Moment prellt. Das 
kann von Taster zu Taster variieren aber auch sehr reproduzierbar 
aussehen.

Solche Sachen macht man halt auch nicht im Interrupt, und wenn, dann 
entprellt man die Taster.

Viele Grüße,

Peter

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.