Forum: Compiler & IDEs Anfängerfrage zu Avr UND verknüpung


von stefan (Gast)


Lesenswert?

hallo, habe da noch mal ne kleine Frage. Im Avrggc-tut steht jda, das 
eine Und verknüpfung einfach mit einem & gemacht wird und oder mit |. 
jetzt bekomm ich es aber einfach nicht hin dieses UND einzubringen

 if( ( PIND & ((1<<PD4) )

ich möchte das Und in diese if schleife einbinden, und zwar möchte ich, 
dass 2 taster gedrückt sein müssen, damit sie wahr wird. habe schon 
einige varianten ausprobiert, aber dann sind immer alle ausgänge 
geschaltet. hab schon unter anderem so versucht:

 if( (PIND & ((1<<PD4) & (1<<PD3))

aber dann sind wie schon gesagt alle ausgänge geschalten.
könnt ihr mir helfen???
ist sicher voll ne blöde und einfache frage aber ich komm nich drauf ^^

von Sven P. (Gast)


Lesenswert?

stefan wrote:
> ich möchte das Und in diese if schleife einbinden,
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


>  if( (PIND & (1<<PD4)) && (PIND & (1<<PD3)) )

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sven P. wrote:
> stefan wrote:
>> ich möchte das Und in diese if schleife einbinden,
> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>
>
>>  if( (PIND & (1<<PD4)) && (PIND & (1<<PD3)) )

Das kann auch war sein, wenn nur je 1 Taster gedrückt ist. Daher ist die 
Abfrage so zu formulieren, daß nur einmal auf das SFR zugegriffen 
wird:
1
if ((PIND & ((1 << PD4) | (1 << PD3))) == ((1 << PD4) | (1 << PD3)))

Der erste Schnippsel wird zwar nur selten fehlerhaftes Verhalten zeigen 
und für Taster wird's eh egal sein, man sollte sich der Fußangel aber 
zumindest bewusst sein und sich sowas erst garnicht angewöhnen.

Johann

von stefan (Gast)


Lesenswert?

ja ok aber wenn ich das jetzt so machen wie du mir das vorgeschlagen 
hast, da kann ich PD3 oder PD4 drücken und die ausgänge werden 
geschaltet. aber nich wie sie eig sollen, also nur wenn sie zusammen 
gedrückt werden.
???

von Karl H. (kbuchegg)


Lesenswert?

stefan wrote:
> ich möchte das Und in diese if schleife einbinden,

if ist keine Schleife. Eine Schleife zielt potentiell auf Wiederholungen 
ab. If ist einfach eine Auswahl aus 2 Alternativen.


> geschaltet. hab schon unter anderem so versucht:
>
>  if( (PIND & ((1<<PD4) & (1<<PD3))
>
> aber dann sind wie schon gesagt alle ausgänge geschalten.
> könnt ihr mir helfen???

Sicher.
Wie lautet deine Bedingung.

  Wenn Taster1 gedrückt ist UND Taster2 gedrückt ist

Wie stellst du fest, dass Taster1 gedrückt ist.
Indem du dir das entsprechende Bit für Taster1 ansiehst.
In Code sieht das so aus   PIND & ( 1 << PD4 )

Wie stellst du fest, dass Taster2 gedrückt ist.
Indem du dir das entsprechende Bit für Taster2 ansiehst.
In Code sieht das so aus   PIND & ( 1 << PD3 )

Und jetzt beides zusammen (du brauchst hier übrigens ein logisches UND 
und kein binäres)
1
   if(                                // Wenn
2
       ( PIND & ( 1 << PD4 ) )        // Taster 1 gedrückt
3
        &&                            // UND
4
       ( PIND & ( 1 << PD3 ) )        // Taster 2 gedrückt
5
     )

PS: Bist du sicher, dass das entsprechende Bit 1 wird, wenn die Taste 
gedrückt ist?

von stefan (Gast)


Lesenswert?

ja ich gebe da eine 1 raus.
danke es klappt wunderbar ;-) find ich echt gut von euch das einem hier 
so schnell und verbindlich geholfen wird. weiter so.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

>  if( (PIND & (1<<PD4)) && (PIND & (1<<PD3)) )
>
> Das kann auch war sein, wenn nur je 1 Taster gedrückt ist.

Ach? Wie soll das gehen?

von Sven P. (Gast)


Lesenswert?

Johann L. wrote:
> Das kann auch war sein, wenn nur je 1 Taster gedrückt ist. Daher ist die
> Abfrage so zu formulieren, daß nur einmal auf das SFR zugegriffen
> wird:
Da hast du absolut Recht.

von Stefan E. (sternst)


Lesenswert?

Rufus t. Firefly wrote:
>>  if( (PIND & (1<<PD4)) && (PIND & (1<<PD3)) )
>>
>> Das kann auch war sein, wenn nur je 1 Taster gedrückt ist.
>
> Ach? Wie soll das gehen?

Er meint damit nacheinander. Das PIND-Register wird ja zweimal gelesen. 
Es kann sein, dass beim ersten Lesen PD4 1 ist (aber nicht PD3), und 
beim zweiten Lesen dann umgekehrt. So gibt es ein True, ohne dass die 
Taster gleichzeitig gedrückt waren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ja, das kann natürlich zutreffen. Wobei der Fall "Taster 2 wird binnen 
weniger µs nach dem Loslassen von Taster 1 gedrückt" ein sehr 
akademisches Konstrukt ist und in der Realität auch schlicht als das 
angesehen werden kann, als was es interpretiert würde - als 
gleichzeitiges Tastendrücken.

Dennoch ist der Hinweis gerechtfertigt - es könnte ja auch was anderes 
als ausgerechnet Taster ausgewertet werden.

von Zyniker (Gast)


Lesenswert?

>> Das kann auch war sein, wenn nur je 1 Taster gedrückt ist. Daher
>> ist die Abfrage so zu formulieren, daß nur einmal auf das SFR
>> zugegriffen wird:
> Da hast du absolut Recht.

Ja, wobei ich dann nicht so einen komplizierten Konstrukt draus machen, 
sondern PIND einfach zuerst in eine lokale Variable lesen und dann damit 
arbeiten würde.

von Oliver (Gast)


Lesenswert?

Wenn wir schon bei den nicht-akademischen Lösungen sind:

Für mechanische Taster ist natürlich keine der bisher aufgeführten 
Lösungen geeignet. Da fehlt die Entprellung. Damit erübrigt sich dann 
auch die Diskussion über "gleichzeitig" und "Mikrosekunden".

Oliver

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.