AVR Tasterabfrage

OP #3666943
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
      }
Angehängte Dateien:
#3667014
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.
Gast #3667017
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
Gast #3667022
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.
OP #3667694
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?
Gast #3667840
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.
#3668158
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.

;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren