Hallo zusammen, ich bekomme von einen Touch-Controller über I2C Tastsignale, mit denen ich als Variable im Mikrocontrollerprogramm arbeiten kann. Konkret nimmt die Variable für die 4 verschiedenen Taster (T1,T2,T3,T4) die Werte 1,2,3,4 an. Wird keine Taste gedruckt, ist die Variable 0. Für jede Taste habe ich eine bestimmte Programmfunktion vorgesehen. Um dies zu gewerkstelligen kann ich ja über eine if-Bedingung oder case-Struktur eben diesen Programmteil durchlaufen lassen. Das Problem ist jetzt nur, dass diese Programmfunktion eben nicht mehr durchlaufen wird, wenn die Taste nicht mehr gedrückt ist. Es sollte aber so sein, dass der Schaltzustand gehalten wird (auch wenn die Taste nicht mehr gedrückt wird (Variable =0), und erst wechselt, wenn ich eine andere Taste drücke. Letztlich will ich also den Schaltzustand einer "Tastvariablen" halten, wie bei einen Wechselschalter, nur das ich eben 4 Schalzustände habe. Ich steh da im Moment total auf den Schlauch. Vielleicht kann mir da jmd. ein Stichwort geben. Danke, Michael
Mit einer zweiten Var. zum merken :P da ja ein Wahr/Falsch reicht für jede Taste eine Boolean Var. anlegen mfg Manfred
jonas biensack schrieb: > Variable speichern ? ja genau, aber wie ? jonas biensack schrieb: > Welche Programmiersprache? C, mit Atmega168 Controller
Sowas vielleicht: unsigned char neueTaseterWerte; unsigned char alteTaseterWerte; neueTaseterWerte = LeseTaster(); if (neueTaseterWerte != alteTaseterWerte) { alteTaseterWerte = neueTaseterWerte; switch(alteTasterWerte) { case .... } }
jonas biensack schrieb: > Sowas vielleicht: Ich würde die Mehtode mit den Flags machen:
1 | unsigned char Touchwert; |
2 | unsigned char Tasten; |
3 | :
|
4 | if (Touchwert==1) then Tasten|=0b0001; // Flag für Taste 1 setzen |
5 | if (Touchwert==2) then Tasten|=0b0010; |
6 | if (Touchwert==3) then Tasten|=0b0100; |
7 | if (Touchwert==4) then Tasten|=0b1000; |
8 | :
|
9 | :
|
10 | // irgendwo anders
|
11 | if (Tasten&0b0001) { |
12 | // mach das, was zur Taste 1 gehört
|
13 | Tasten &= ~0b0001; // Flag zurücksetzen |
14 | }
|
15 | if (Tasten&0b0010) { |
16 | // mach das, was zur Taste 2 gehört
|
17 | Tasten &= ~0b0010; // Flag zurücksetzen |
18 | }
|
Vielen Dank für eure schnellen Antworten, ich werde das gleich mal alles durchtesten!
Lothar Miller schrieb: > Ich würde die Mehtode mit den Flags machen: > ...... Ich glaube, das mit "Flag zuruecksetzen" wollte er NICHT. Er wollte doch den Tastenwert speichern.
1 | unsigned char Touchwert; |
2 | unsigned char Tasten; |
3 | |
4 | if (Touchwert==1) then Tasten =0b0001; // Flag für Taste 1 setzen |
5 | if (Touchwert==2) then Tasten =0b0010; // Flag für Taste 2 setzen |
6 | if (Touchwert==3) then Tasten =0b0100; // ... |
7 | if (Touchwert==4) then Tasten =0b1000; // ... |
8 | :
|
9 | :
|
10 | // irgendwo anders
|
11 | if (Tasten&0b0001) { |
12 | // mach das, was zur Taste 1 gehört
|
13 | }
|
14 | if (Tasten&0b0010) { |
15 | // mach das, was zur Taste 2 gehört
|
16 | }
|
NurEinGast schrieb: > Ich glaube, das mit "Flag zuruecksetzen" wollte er NICHT. > Er wollte doch den Tastenwert speichern. Ich will eigentlich nur einen Tastzustand halten, bis ein anderer Tastzustand eintritt.
Michael schrieb: > Ich will eigentlich nur einen Tastzustand halten, bis ein anderer > Tastzustand eintritt. Eben deshalb das Flag nicht nach der Bearbeitung zurücksetzen, sondern erst durch eine anderen Taste überschreiben lassen. Dann kannst Du zwar nicht feststellen, wenn keine Taste betätigt ist. Aber dass musst Du wissen, was in Deiner Anwendung sinvoll ist.
NurEinGast schrieb: > Dann kannst Du zwar nicht feststellen, wenn keine Taste betätigt ist. > Aber dass musst Du wissen, was in Deiner Anwendung sinvoll ist. Das ist erstmal nicht weiter ein Problem, wenn ich den Zustand "kein Tastendruck" nicht erkennen kann. Das Problem ist jetzt im Moment, nachdem ich den Code-Schnipsel mal ausgetestet habe, dass die drei unteren if-Schleifen zeitlich alle nacheinander durchlaufen werden. Habe ich alle 3 Tasten einmal gedrückt, wird erst die erste, dann die zweite dann die dritte untere if-Schleife durchlaufen. Habe ich zum Beispiel nur die erste und die dritte Taste einmal gedrückt, dann läuft nacheinander die erste und die dritte Schleife untere if-Schleife durch. Muss ich da doch noch die Variable zurücksetzten ? while (1) { if (get_button_touchreg()==1) {Tasten|=0b0001;} // Flag für Taste 1 setzen if (get_button_touchreg()==2) {Tasten|=0b0010;} if (get_button_touchreg()==3) {Tasten|=0b0100;} if (get_button_touchreg()==4) {Tasten|=0b1000;} // irgendwo anders if (Tasten&0b0001) { // mach das, was zur Taste 1 gehört //tval_s = (calc_bar_position()); PWM_Ausgang (3,10); } if (Tasten&0b0010) { // mach das, was zur Taste 2 gehört PWM_Ausgang (3,50); } if (Tasten&0b0100) { // mach das, was zur Taste 2 gehört PWM_Ausgang (3,150); }
Darf ich mal das Wort "C-Buch" in den Raum werfen? Da steht auch drin, wie man eine Variable benutzt...
NurEinGast schrieb: > Mach mal aus > > Tasten|=0b0001 > > ein > > Tasten =0b0001 Vielen Dank, jetzt funktioniert es !
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.