2 Taster abfragen

Gast #3247031
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
#3247046
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.
Gast #3247047
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.
Gast #3247196
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
Gast #3247250
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
Moderator (Firma: Titel) Persönliche Seite #3247265
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?
#3247266
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.

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