Forum: Mikrocontroller und Digitale Elektronik Tastzustand einer Variable halten


von Michael (Gast)


Lesenswert?

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

von jonas biensack (Gast)


Lesenswert?

Variable speichern ?

von jonas biensack (Gast)


Lesenswert?

Welche Programmiersprache?

von M. J. (manfred-64)


Lesenswert?

Mit einer zweiten Var. zum merken :P
da ja ein Wahr/Falsch reicht für jede Taste eine Boolean Var. anlegen

mfg
Manfred

von Michael (Gast)


Lesenswert?

jonas biensack schrieb:
> Variable speichern ?

ja genau, aber wie ?

jonas biensack schrieb:
> Welche Programmiersprache?

C, mit Atmega168 Controller

von jonas biensack (Gast)


Lesenswert?

Sowas vielleicht:

unsigned char neueTaseterWerte;
unsigned char alteTaseterWerte;

neueTaseterWerte = LeseTaster();

if (neueTaseterWerte != alteTaseterWerte)
{
    alteTaseterWerte = neueTaseterWerte;
    switch(alteTasterWerte)
    {
       case ....
    }
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
}

von Michael (Gast)


Lesenswert?

Vielen Dank für eure schnellen Antworten,
ich werde das gleich mal alles durchtesten!

von NurEinGast (Gast)


Lesenswert?

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
 }

von Michael (Gast)


Lesenswert?

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.

von NurEinGast (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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);


}

von Klaus (Gast)


Lesenswert?

Darf ich mal das Wort "C-Buch" in den Raum werfen?  Da steht auch drin, 
wie man eine Variable benutzt...

von NurEinGast (Gast)


Lesenswert?

Mach mal aus

Tasten|=0b0001

ein

Tasten =0b0001

von Michael (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.