MSP430 Interruotroutine wiederholen bis Taster losgelassen wird

Gast #999593
Lesenswert?

Hallo,

ich verwende einen MSP430F2272 und möchte Taster via Interruot abfragen.

Nun habe ich es soweit hinbekommen, daß der Interrupt erkannt und meine 
Routine durchlaufen wird. Nur soll die Interruptroutine solange 
durchlaufen werden bis der Taster wieder losgelassen wurde.
Momentan habe ich es nur so hinbekommen, daß die Routine nur einmal 
durchläuft und der Taster dann von neuem neu gedrückt werden muß.

Im Tutorial 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts) 
habe ich gelesen, daß es auch anders geht. Nämlich daß ein erneutes 
Abfragen möglich ist.
Ist es also möglich die Interruptroutine wieder und wieder ablaufen zu 
lassen, solange der Taster gedrückt bleibt?
Gast #999626
Lesenswert?

Es handelt sich dabei um ein Warnsystem.

Soll heißen, so lange der Taster aktiv ist, soll eine LED (Bsp.) 
leuchten, sobald der Taster inaktiv (losgelassen) ist, soll die LED 
wieder aus gehen.

Hast du mir einen guten Link zum Thema Timerinterrupt? Dann könnte ich 
mir das lange suchen bis ich gute Infos habe sparen ;-)

Aber es müßte doch auch mit dem normalen Interrupt funktionieren, oder?
Gast #999681
Lesenswert?

Also irgendwie will das nicht...mein Code sieht aktuell so aus:
1
...
2
 if (P2IFG &  BIT1) // P2.1 caused the interrupt?
3
  {
4
  P1OUT = 0x00; //alle LEDs an
5
  wait (); //Unterprogramm Zeit warten
6
  P2IFG &= ~ BIT1; //Reset P2.0 interrupt flag
7
  }
8
...
Und damit lösche ich am Ende das Interruptflag.
Da ist es aber egal, was für einen Zusatnd der Taster hat.
Und ich muß ihn zuerst loslassen und wieder neu drücken, damit der 
Interrupt wieder gesetzt wird.
Persönliche Seite #999702
Lesenswert?

leider hab ich beim msp auch keinen plan davon.. kenn nur avrs...

hier mal im pseudo C
1
void Timer_ISR_Fkt(void)
2
{
3
   if(taster}
4
      LEDan();
5
   else
6
      LEDaus();
7
}
8

9
int main (void)
10
{
11
   Timer_Init(); //So einstellen das der Timer alle x ms einen IRQ auslöst
12

13
   while(1)
14
   {};
15

16
  return 0;
17
}

aber es gibt ja
http://www.mikrocontroller.net/articles/MSP430_Codebeispiele
Gast #1001354
Lesenswert?

Tag,

nachdem ich also am Samstag etwas gefrustet für dieses Wochenende damit 
aufgehört habe, stellt sich mir heute die Frage, wenn ich mit dem 
Interrupt auf eine negative Flanke reagieren (abfragen) kann, dann 
sollte das doch genauso auch auf die positive Flanke gehen?!

Also negative = Taster drücken, negative = Taster loslassen
#1001381
Lesenswert?

Jochen wrote:
> nachdem ich also am Samstag etwas gefrustet für dieses Wochenende damit
> aufgehört habe

Du liest wohl nicht gerne Antworten?

Also nochmal ganz ausführlich:
1
Interrupthandler
2
{
3
  do{
4
    tue etwas 
5
  }while( Taste gedrückt );
6
}

Fertig ist die Laube.


Peter
#1001843
Lesenswert?

Naja, wenn du auch was völlig anderes programmierst, als wir dir hier 
raten, dann wird´s nicht klappen.

Wenn du nur das P2IFG Register abfragst, kannst du den aktuellen Zustand 
des Tasters ja nicht rausbekommen, denn da steht lediglich drin, von 
welchem der 8 Port-Pins der Interrupt ausgelöst wurde. Du musst schon 
das P2IN Register pollen, um zu schauen, ob der Taster noch gedrückt ist 
oder nicht.
1
if (P2IFG &  BIT1) // P2.1 caused the interrupt?
2
{
3
P1OUT = 0x00; //alle LEDs an
4

5
wait (); //Unterprogramm Zeit warten
6

7
while(P2IN & BIT1); //Wenn Taster High-Aktiv ist, warten, bis losgelassen
8

9
P1OUT = 0xFF; //LEDs aus?
10

11
P2IFG &= ~ BIT1; //Reset P2.0 interrupt flag ----> Was jetzt? P2.0 oder 2.1 ???
12

13
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren