Forum: Mikrocontroller und Digitale Elektronik 2 Taster abfragen


von iuser (Gast)


Lesenswert?

Hey,
es ist Freitag und ich komm nicht weiter :(

Möchte 2 Taster abfragen mit einer if-Anweisung.

Also
1
if ((PIND & (1<<PD0)) && (PIND & (1<<PD1)))

&& müsste hier doch auch funktionieren oder?
Jetzt leuchten meine LED´s egal welche Taste ich drücke und nicht nur 
wenn beide betätigt sind.

Bitte helft mir.
Anfänger frage ich weiß. Aber ich komm nicht dahinter :(

Danke

von Nico (nico123)


Lesenswert?

Schau dir mal die Klammersetzung an!

von Peter II (Gast)


Lesenswert?

iuser schrieb:
> if ((PIND & (1<<PD0)) && (PIND & (1<<PD1)))

sieht eigentlich gut aus, aber wie sind denn die Taster verschaltet?

Was passiert wenn du beide drückst, geht dann die lampe aus?

von Nico (nico123)


Lesenswert?

Nico ... schrieb:
> Schau dir mal die Klammersetzung an!

Die Klammern sind schon okay, hab mich verguckt...das zum Thema Freitag. 
Sorry!

Die Taster an PD0 und PD1 werden nach Vcc geschaltet und Du hast 
Pulldown-Widerstände dran?

von Karl H. (kbuchegg)


Lesenswert?

iuser schrieb:

>
1
> if ((PIND & (1<<PD0)) && (PIND & (1<<PD1)))
2
>
>
> && müsste hier doch auch funktionieren oder?

Das kommt drauf an, was du unter funktionieren verstehst.

> Jetzt leuchten meine LED´s egal welche Taste ich drücke und nicht nur
> wenn beide betätigt sind.

Kann es sein, dass deine Taster eben nicht ein 1 Bit liefern, wenn sie 
gedrückt werden, sondern ein 0 Bit?

> Bitte helft mir.
> Anfänger frage ich weiß. Aber ich komm nicht dahinter :(

Ich denke, dass deine Taster bzw. LED genau anders rum funktionieren als 
du eigentlich glaubst.

Deine Taster liefern ein 1 Bit, wenn sie nicht gedrückt sind.
Deine LED leuchten, wenn man ein 0 Bit am Port ausgibt.


Und daraus folgt, dass dann eben genau alles anders rum funktioniert und 
&& falsch ist. Denn bei dir steht dann umgangssprachlich (restlichen 
nicht gezeigten Code geraten)
1
   wenn ( Taste 1 nicht gedrückt && Taste 2 nicht gedrückt )
2
     schalte LED aus
3
   else
4
     schalte LED ein
und damit ist dann auch klar, dass es reicht 1 Taste zu drücken um die 
LED zum Leuchten zu kriegen.

von Mikesch (Gast)


Lesenswert?

Wie hast du die Taster geschaltet?

Gedrückt = high
Nicht gedrückt = low?

das wäre richtig.

Wenn du aber mit Taster Auf Masse und Pullups arbeitest, dann kann das 
so nicht klappen, weil das PIN Bit 0 ist, wenn du den Taster drückst und 
nicht 1.

von iuser (Gast)


Lesenswert?

Also danke erstmal für die vielen Beiträge.
Ich arbeite mit einem STK500. Die Taster liefern ein 0 Signal wenn sie 
gedrückt sind.

PIND & (1<<PD0) frägt ja auch nach 0 ab wenn ich mich nicht irre.

Hier mal der Code:
1
#include <avr/io.h>
2
int main(void)
3
{
4
while(1)
5
{  
6
DDRB=255;  // PortB als Ausgang
7
PORTB=255; // LED´s setzen => alle aus
8
DDRD=0;     // PortD als Eingang
9
10
if ((PIND & (1<<PD0)) && (PIND & (1<<PD1)))
11
{
12
  PORTB |= (1<<0); // PINB.0 zurücksetzen - LED an
13
}
14
else
15
{
16
  PORTB &= ~(1<<0); // PINB.0 setzen - LED aus
17
}
18
}
19
return 0;
20
}

wenn ich nur eine Bedingung drin habe funktioniert es ja auch :(
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
while(1)
6
{  
7
DDRB=255;
8
PORTB=255;
9
DDRD=0;
10
   
11
  if(PIND & (1<<PD0)) {PORTB |= (1 << 0);}
12
  else {PORTB &=  ~(1 << 0);}

Total verwirrt gerade

von over f. (sasserbaer)


Lesenswert?

schau dir nochman den 2. post an

von Langewhile (Gast)


Lesenswert?

Du setzt jedes mal in der Whileschleife PortB und PortD, ob das so 
gewollt ist ?

Außerdem :
x |= (1 << Bitnummer);  // Hiermit wird ein Bit in x gesetzt
x &= ~(1 << Bitnummer); // Hiermit wird ein Bit in x geloescht

PORTB=255; // LED´s setzen => alle aus
PORTB |= (1<<0); // PINB.0 zurücksetzen - LED an
PORTB &= ~(1<<0); // PINB.0 setzen - LED aus

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


Lesenswert?

iuser schrieb:
> PIND & (1<<PD0) frägt ja auch nach 0 ab wenn ich mich nicht irre.
Das frägt gar nichts ab.

Es maskiert einfach nur das Bit 0 vom PIND Register aus. Und wenn der 
Pin low ist, kommt da 0x00 raus. Wenn der Pin high ist, kommt da 0x01 
raus...

Beim (PIND & (1<<PD1)) ist das noch interessanter. Eine Frage an dich: 
welchen Wert bekommst du da, wenn der Pin 1 low ist? Und welchen Wert, 
wenn der Pin 1 high ist?

von Karl H. (kbuchegg)


Lesenswert?

iuser schrieb:

> Ich arbeite mit einem STK500. Die Taster liefern ein 0 Signal wenn sie
> gedrückt sind.

Gut


>
> PIND & (1<<PD0) frägt ja auch nach 0 ab wenn ich mich nicht irre.

Du irrst.
1
  if( PIND & (1<<PD0) )
2
    xxxx

xxxx wird ausgeführt wenn der Pin auf 1 ist. Eine Abfrage auf 0 wäre
1
  if( !(PIND & (1<<PD0)) )
2
    xxxx
(man beachte das !, welches die Bedingung verneint)

> if ((PIND & (1<<PD0)) && (PIND & (1<<PD1)))
> {
>   PORTB |= (1<<0); // PINB.0 zurücksetzen - LED an

Eben nicht.
Wenn
PORTB=255;
alle LED ausschaltet, dann kann das setzen eines 1 Bits nicht plötzlich 
die LED einschalten.
Du schaltest hier tatsächlich die LED aus ....

> }
> else
> {
>   PORTB &= ~(1<<0); // PINB.0 setzen - LED aus

... und hier ein.

> }

> wenn ich nur eine Bedingung drin habe funktioniert es ja auch :(
>

>   if(PIND & (1<<PD0)) {PORTB |= (1 << 0);}
>   else {PORTB &=  ~(1 << 0);}[/c]


Da steht
1
   wenn die Taste nicht gedrückt ist
2
      dann schalte die LED aus
3
   ansonsten
4
      schalte die LED ein

In Summe ergibt das wieder die von dir erwartete Logik: Die LED geht an, 
wenn du auf die Taste drückst.

> Total verwirrt gerade

Deine Denkweise ist genau verkehrt rum.
Bei nur einem Taster und einer LED heben sich die beiden Denk-Fehler 
gegenseitig auf und es passiert das was du erwartest.
Nur in dem Moment in dem du anfängst Dinge zu kombinieren, passt es dann 
mit der falsch-rum-Denkweise nicht mehr.

von iuser (Gast)


Lesenswert?

Okay danke Leute.
Jetzt leuchtet es mir ein.

Die korrekte Abfrage für einen Taster am STK500 muss negiert sein.

Jetzt funktioniert die &&-Abfrage auch :)

Danke dafür. Schöne Woche

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.