Forum: Mikrocontroller und Digitale Elektronik MSP430 Interruotroutine wiederholen bis Taster losgelassen wird


von Jochen (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und wozu soll das gut sein?
Tasten wertet man nicht im Interrupt aus, sondern man pollt sie mit 
einem Timerinterrupt. Damit kann man sie a) leicht entprellen und b) hat 
man auch gleich Zeitinformationen, mit denen sich ein Autorepeat 
realisieren lässt.

von Jochen (Gast)


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?

von Peter D. (peda)


Lesenswert?

Bei den meisten MCs kann man einen Interruptpin immer auch direkt 
abfragen.
Mach also einfach ne Schleife um den Interrupthandler, die erst bei Pin 
= Losgelassen verlassen wird.


Peter

von Jochen (Gast)


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.

von ... .. (docean) Benutzerseite


Lesenswert?

dann nimm einen timer der immer wieder den taster abfragt und dann 
passend die Bits setzt...

von Jochen (Gast)


Lesenswert?

OK...was Timer angeht hab ich wirklich noch null Ahnung...

Hast du mir dazu bitte ein Beispiel?

Evtl. anmeinem Code ein Beispiel...das ist ja nur n Teil des Ganzen ;-)

von ... .. (docean) Benutzerseite


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

von Jochen (Gast)


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

von Christian R. (supachris)


Lesenswert?

Dass ein Taster nicht genau eine Flanke beim Drücken/Loslassen erzeugt, 
hast du noch nicht gehört, oder? Das musst entprellt werden. Am besten 
macht man das in einem Timer-Interrupt. Fertig. Manuell betätigte 
mechanische Kontakte fragt man nicht per Interrupt ab.

von Peter D. (peda)


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

von Jochen (Gast)


Lesenswert?

Klar lese ich gerne Antworten...
Das habe ich versucht durch Maskieren der Bits...das wollte auch nicht 
:-(

Na gut...ich werds heut abend nochmals versuchen...

von Christian R. (supachris)


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
}

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.