mikrocontroller.net

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


Autor: Jochen (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Jochen (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also irgendwie will das nicht...mein Code sieht aktuell so aus:
...
 if (P2IFG &  BIT1) // P2.1 caused the interrupt?
  {
  P1OUT = 0x00; //alle LEDs an
  wait (); //Unterprogramm Zeit warten
  P2IFG &= ~ BIT1; //Reset P2.0 interrupt flag
  }
...
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.

Autor: ... ... (docean) Benutzerseite
Datum:

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

Autor: Jochen (Gast)
Datum:

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

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leider hab ich beim msp auch keinen plan davon.. kenn nur avrs...

hier mal im pseudo C

void Timer_ISR_Fkt(void)
{
   if(taster}
      LEDan();
   else
      LEDaus();
}

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

   while(1)
   {};

  return 0;
}

aber es gibt ja
http://www.mikrocontroller.net/articles/MSP430_Codebeispiele

Autor: Jochen (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:
Interrupthandler
{
  do{
    tue etwas 
  }while( Taste gedrückt );
}

Fertig ist die Laube.


Peter

Autor: Jochen (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.
if (P2IFG &  BIT1) // P2.1 caused the interrupt?
{
P1OUT = 0x00; //alle LEDs an

wait (); //Unterprogramm Zeit warten

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

P1OUT = 0xFF; //LEDs aus?

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

}

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.