www.mikrocontroller.net

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


Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ^^

Autor: Sven P. (haku) Benutzerseite
Datum:

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


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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
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

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
???

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)
   if(                                // Wenn
       ( PIND & ( 1 << PD4 ) )        // Taster 1 gedrückt
        &&                            // UND
       ( PIND & ( 1 << PD3 ) )        // Taster 2 gedrückt
     )



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

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Zyniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.