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?
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.
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?
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
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.
dann nimm einen timer der immer wieder den taster abfragt und dann passend die Bits setzt...
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 ;-)
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
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
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.
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.