Forum: Mikrocontroller und Digitale Elektronik AVR Tasterabfrage


von Andreas S. (baud)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich hoffe mir kann jemand weiterhelfen.
Habe folgendes Programm geschrieben. Mit Taster1 schalte ich eine LED an
mit Taster2 zwei LED´s an und mit Taster1 und Taster2 alle drei LED´s
das funktioniert aber nur dann wenn ich als erstes mit der abfrage
if( ! (PIND & (1<<PD2 |1<<PD3))) beginne sonst funktioniert das Programm 
nicht. Warum?
1
/* PD2(Taster1) PD3(Tatser2)   PB0-PB2(LED´s)  */
2
3
DDRB|=(1<<PB0)|(1<<PB1)|(1<<PB2);   
4
DDRD=0x00;
5
PORTD|=(1<<PD2)|(1<<PD3);            
6
  
7
  
8
  
9
   while(1)
10
  {
11
   
12
     
13
  
14
     
15
     if( ! (PIND & (1<<PD2 | 1<<PD3)) )
16
     {
17
     
18
        PORTB|=(1<<PB0)|(1<<PB1)|(1<<PB2);   
19
     
20
     }
21
     
22
     
23
     else if(!(PIND & (1<<PD2)  ) )
24
     {
25
     
26
     
27
       PORTB|=(1<<PB0);
28
       PORTB&=~( (1<<PB1)|(1<<PB2) );
29
      
30
      
31
     }
32
     
33
     else if( ! (PIND & (1<<PD3) ))
34
     {
35
     
36
       PORTB|=(1<<PB0)|(1<<PB1);
37
       PORTB&=~(1<<PB2);
38
       
39
     
40
     }
41
     
42
     
43
      else
44
      {
45
      
46
         PORTB&=~(  (1<<PB0)|(1<<PB1)|(1<<PB2));
47
      
48
      
49
      }

: Bearbeitet durch User
von Christian (Gast)


Lesenswert?

Vielleicht funktioniert das Programm, aber die Taster prellen?!

von Mike (Gast)


Lesenswert?

Christian schrieb:
> Vielleicht funktioniert das Programm, aber die Taster prellen?!

Und wie soll bei nicht-sequentieller Logik ein Prellen stören?

Das mußt du mal erklären. Da hast du wohl wieder ein Buzz-Wort 
aufgeschnappt und meinst das munter verteilen zu müssen?

von Peter D. (peda)


Lesenswert?

Schreib mal Kommentare hinter die Zeilen, dann sollte es klar werden.

Kommentare sind kein Schnulli, sondern für einen selber da. Spätestens, 
wenn man den Code nach einem Monat nochmal verstehen will.

Und las das Leerzeilen schinden, das macht es nur schwer lesbar. Ich hab 
ne ganze Weile scrollen müssen.

Und C-Programme heißen nicht *.txt, sondern *.c, wer hätte das gedacht.

: Bearbeitet durch User
von Cube_S (Gast)


Lesenswert?

Was ist denn das Symptom genau? Ohne das erste if hat PB2 kaum Chancen 
jemals das Licht der Welt zu erblicken, da es in den anderen Varianten 
immer durch ein
1
PORTB &= ...(1<<PB2) ...

gestraft wird

von Cube_S (Gast)


Lesenswert?

Nachtrag: Ohne das erste if landest Du bei zwei gedrückten Tasten 
zusätlich auch ausnahmlos immer im
1
if(!(PIND & (1<<PD2)  ) ) ...

Wahrscheinlich wolltest Du das nachfolgende else einfach weglassen.

von Peter D. (peda)


Lesenswert?

@Cube_S (Gast)

Spielverderber.
So lernt er systematisches Programmieren nie.

von Andreas S. (baud)


Lesenswert?

Ja ohne else geht es. Ich war schon am verzweifeln denn die bedingungen 
sind
im prinzip klar formuliert. Hab mit C erst angefangen.

von Andreas S. (baud)


Lesenswert?

Ich hab mir das problem mit der else if anweisung nochmal genauer 
angeschaut.
Solbald die If anweisung am anfang zutrifft werden die restlichen 
anweisungen mit else if anscheindend übersprungen das führt dann zu der 
fehlfunktion des Programm. Ist meine vermutung so richtig?

von Peter D. (peda)


Lesenswert?

Andreas Soen schrieb:
> das führt dann zu der
> fehlfunktion des Programm. Ist meine vermutung so richtig?

Nein.

2 Bedingungen sind unvollständig, der andere Taster ist jeweils egal. 
Das ist aber nicht das, was Du willst. Mit einem Kommentar wäre das 
bestimmt auch aufgefallen.

Die richtige Lösung wäre, in jeder Bedingung alle Taster auszuwerten.

von Andreas S. (baud)


Lesenswert?

Ich hab das jetzt aber nochmal ausprobiert und mit der abfrage von PD3 
angefangen drücke ich beide Taster leuchten zwei LED's. Die 
nachfolgenden else if anweisungen werden nicht mehr geprüft

von Cube_S (Gast)


Lesenswert?

Andreas Soen schrieb:
> Ist meine vermutung so richtig?

Das ist richtig. In einer Kette

if ( ... )
 ...
else if ( ... )
 ...
else if ( ... )
 ...
else
 ...

kommt genau ein Zweig zur Ausführung.

von Mike (Gast)


Lesenswert?

Wenn du es dir ganz einfach machen möchtest, liest du dein drei Taster 
als die unteren 3 Bit in eine Integrer Variable ein, sorgst dafür das 
die oberen Bits alle 0 sind und nimmst das dann als Index für ein array, 
wo der zugehörige Zustand der LED drin steht. Mit diesem 
Tabellenverfahren kommst du ganz um die If-Then-Else Sucherei drum rum 
und das ganze wird auch noch schnell und kurz.

von Michael L. (michaelx)


Lesenswert?

Andreas Soen schrieb:
> Ich hab mir das problem mit der else if anweisung nochmal genauer
> angeschaut.
> Solbald die If anweisung am anfang zutrifft werden die restlichen
> anweisungen mit else if anscheindend übersprungen das führt dann zu der
> fehlfunktion des Programm. Ist meine vermutung so richtig?

Ja logisch. Man muss sich eben mal die Bedeutung von "else" (-> sonst) 
klar machen, statt das einfach nur so hin zu schreiben.

;-)

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.