Forum: Mikrocontroller und Digitale Elektronik Frage zu Code Abarbeitung bei Tasteneingabe und Bitmanipulation


von Alex (Gast)


Lesenswert?

Hallo Leute,
ich hab eine Frage zu meinem Code und zwar.
Ich mache eine entprellte Tasten Abfrage. Wenn Taster gedrückt schiebe 
eine 1 in eine variable an eine bestimmte Stelle.
Dann mache ich eine Switch case  Vergleich.
Wenn
TasterZustand == 0x01 mach was,
TasterZustand == 0x02 mach was anderes,
TasterZustand == 0x03 was ganz anderes
Zustand  die der vergleich bei 0x01 & 0x02 funktioniert. Da ist jeweils 
nur ein Taster gedrückt.
Aber wenn ich die beiden Gleichzeitig drücke passiert da irgendwie nix. 
Wieso?
(Das ich nach den Code dann in der zweiten while Schleife gefangen bin 
ist mir klar. ist nur zum Verständnis  gedacht)
1
  //Schalterzustand Speicherung;
2
  int zRotP=0, zRotM=0, zGrunP=0, zGrunM=0, zBlauP=0, zBlauM=0,x;
3
  uint8_t TasterZustand=0, StufeR=50, StufeB=50, StufeG=50;
4
  
5
    while(1) {
6
  TasterZustand=0;
7
8
      if(taster(PIND, PIND2, &zRotP)==1){
9
        TasterZustand |= (1<<1);
10
      }
11
      if(taster(PINC, PINC0, &zRotM)==1){
12
        TasterZustand |= (1<<0);
13
      }
14
   
15
    switch(TasterZustand){
16
    case 0x01: OCR1A= pgm_read_word(&pwmtable_16[StufeB+=10]);break;
17
    case 0x02: OCR1A= pgm_read_word(&pwmtable_16[StufeB-=10]);break;
18
    case 0x03:
19
      while(1){
20
      farbenwechsel120();
21
    }break;
22
    }
23
24
25
uint8_t taster(uint8_t  TASTERPORT, uint8_t TASTERBIT, volatile int *zustand)
26
{
27
    //static unsigned uint8_t zustand;
28
    uint8_t rw = 0;
29
    if(*zustand == 0 && !(TASTERPORT & (1<<TASTERBIT))){//Taster wird gedrueckt (steigende Flanke)
30
        *zustand = 1;
31
        rw = 1;
32
    }
33
    else if (*zustand == 1 && !(TASTERPORT & (1<<TASTERBIT))){//Taster wird gehalten
34
         *zustand = 2;
35
         rw = 0;
36
    }
37
    else if (*zustand == 2 && (TASTERPORT & (1<<TASTERBIT))){//Taster wird losgelassen (fallende Flanke)
38
        *zustand = 3;
39
        rw = 0;
40
    }
41
    else if (*zustand == 3 && (TASTERPORT & (1<<TASTERBIT))){//Taster losgelassen
42
        *zustand = 0;
43
        rw = 0;
44
    }
45
    return rw;
46
}

Müsste er dann nicht einfach nach einander die Einsen in die Variable 
schieben?
Benutze Atmega32.
Danke in voraus.

von Alex (Gast)


Lesenswert?

Hab noch was vergessen, ka ob es wichtig ist aber ich schreibs mal.
Benutze die Taster als Active High mit internen Pull-UPs

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:

> Aber wenn ich die beiden Gleichzeitig drücke passiert da irgendwie nix.
> Wieso?

Weil es dir kaum gelingen wird, deine beiden Taster exakt in derselben 
Mikrosekunde zu drücken. Irgendeine der beiden drückst du zuerst.

> Müsste er dann nicht einfach nach einander die Einsen in die
> Variable schieben?
Nö, wieso sollte er?
Von der Funktion taster kriegst du genau ein einziges mal eine 1 zurück, 
nämlich in dem Moment, in dem du das Niederdrücken registrierst. Ist 
diese 1 einmal gekommen, kommt sie bis zum Loslassen des Tasters nicht 
mehr.

(Ich spar mir jetzt zu sagen, dass diese Art der Entprellung ungeeigent 
ist)

von Karlheinz F. (bigbyte64)


Lesenswert?

Hallo Alex,

ich denke, das ist ein Timing-Problem: so genau gleichzeitig kannst du 
die Taster wahrscheinlich gar nicht drücken, dass sie in einem 
Schleifendurchlauf als steigende Flanke erkannt werden. Wahrscheinlich 
erkennt die Schleife bei einem Durchlauf nur einen der Taster als 
gedrückt, und TasterZustand enthält 0x01 oder 0x02. Im nächsten 
Durchlauf wird dann der andere Taster erkannt. Aber eben nur der, denn 
beim anderen Taster handelt es sich nicht mehr um eine steigende Flanke.

Ich weiß jetzt nicht genau, was das Programm machen soll, als erste 
Maßnahme würde ich mal auch bei "Taster wird gehalten" rw=1 zurückgeben, 
dann sollte es gehen.

Gruß
Karlheinz

von Stefan E. (sternst)


Lesenswert?

Alex schrieb:
> Aber wenn ich die beiden Gleichzeitig drücke passiert da irgendwie nix.
> Wieso?

Das zeitliche Fenster, in dem dieses "Gleichzeitig" passieren müsste, 
ist verdammt klein. Du schaffst es halt nicht, sie mit der Hand wirklich 
gleichzeitig zu drücken, und das auch noch an der passenden Stelle im 
Code.

Alex schrieb:
> Ich mache eine entprellte Tasten Abfrage.

Wo denn? Ich sehe da nur eine Flankenerkennung, aber keine Entprellung.

von Alex (Gast)


Lesenswert?

Ah misst die Zeit hab ich vergessen. Ja das macht Sinn, dass es so nicht 
klappt.
Danke.

von Peter D. (peda)


Lesenswert?

Für gleichzeitig gibt es doch schon fertige Lösungen:

Beitrag "Re: Universelle Tastenabfrage"


Peter

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.