Frage zu Code Abarbeitung bei Tasteneingabe und Bitmanipulation

Gast #2702845
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.
#2702882
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)
#2702883
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
#2702884
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.