2 Eingänge abfragen

#3972364
Lesenswert?

Hallo
seit 2 h Stunden lese ich mein C Buch und versteh es nicht. 
Wahrscheinlich nur ein Denkfehler.
Es sollen 2 Eingänge abgefragt werden. Nur wenn beide eingänge entweder 
H oder L haben soll geschaltet werden. Bisher habe ich dazu:
1
if (!(PINB & (1<<PINB6) && (1<<PINB7) ))
2
    return 1;
3
    else
4
    return 0;
Kann mir jemand auf die Sprünge helfen?
achim
Moderator (Firma: Titel) Persönliche Seite #3972419
Lesenswert?

1
PINB & (1<<PINB6) && (1<<PINB7)
Sowas sollte man nur dann machen, wenn man ganz ausgezeichnet die 
Prioritäten der Operatoren & und && weiß, und somit wenigstens grob 
abschätzen kann, was dabei herauskommt...

Achim Seeger schrieb:
> Es sollen 2 Eingänge abgefragt werden. Nur wenn beide eingänge entweder
> H oder L haben soll geschaltet werden.
Dann würde ich dir Vorschlagen, erst einmal jeden Einzelnen der beiden 
Eingänge einzulesen. Und anschließend in einem getrennten 
Rechenschritt auszuwerten. Also etwa so:
1
 if (PINB & (1<<PINB6)) e1 = 1;
2
 else                   e1 = 0;
3

4
 if (PINB & (1<<PINB7)) e2 = 1;
5
 else                   e2 = 0;
6

7
 if (e1==e2) Schalten();
Das kapiert jeder...
Moderator (Firma: Titel) Persönliche Seite #3972531
Lesenswert?

Achim Seeger schrieb:
> wollte es in einer Zeile hinbekommen
Tja, dann wirst du wohl ein wenig mehr Nachdenken müssen. Probier mal 
aus, ob du folgen kannst:
Dein Schalter wird in geschickter so an dem Port angeschlossen, dass die 
Bitwertigkeiten aufsteigend sind. Also z.B. 1-PB4, 2-PB5, 4-PB6 und 
8-PB7. Dann liest du den Port ein, markierst das obere Nibble aus und 
schiebst den Wert um 4 Bits nach rechts. Fertig.

Wenn du beim Schaltplan nicht aufgepasst hast, musst du die Bits eben 
überall her zusammenklauben.

Und vergiss einfach diese "alles-in-einer-Zeile" Programmiererei. Das 
ergibt nur obfuscated Code, den nicht mal du selbst nach 3 Monaten noch 
kapierst.
Moderator (Firma: Titel) Persönliche Seite #3972781
Lesenswert?

Wenn man jetzt schon mit unnötig kryptischen C-Code um sich schmeißen 
muss, dann schlage ich das vor:
1
return !!(PINB & PINB6) == !!(PINB & PINB7);
Aber Achtung: bei all diesen "Einzeilern" ist ausser an der 
Übersichtlichtkeit an nichts gespart. Der erzeugte und ausgeführte 
Code ist gleich umständlich oder noch umständlicher...
#3972922
Lesenswert?

achim schrieb:
> Wenn beide Taster gedrückt werden oder sogar 3 Taster
1
#define TasterPort PINB
2

3
//Taster 1 an PORTB Pin 1, nach Masse schaltend
4
#define Taster1 1
5

6
//Taster 2 an PORTB Pin 2, nach Masse schaltend
7
#define Taster2 2
8

9
//Taster 1 an PORTB Pin 4, nach Masse schaltend
10
#define Taster3 4
11

12

13
// ist "True" wenn alle Schalter gleichzeitig gedrückt worden sind:
14
#define SCHALTEN (!(TasterPort & ((1<<Taster1) | (1<<Taster2) | (Taster3))))
15

16

17
...
18

19
if SCHALTEN 
20
 schere_an();

darum gings?
#3972935
Lesenswert?

Ingo schrieb:
> Grummel schrieb:
>> Steht denn schon eigentlich unzweideutig fest, wann jetzt bei if
>> geschaltet werden soll?
>
> Achim Seeger schrieb:
>> Nur wenn beide Eingänge entweder H oder L haben soll geschaltet werden


Was Ingo meint:

Ja, was denn jetzt?
Wenn beide Taster gedrückt wurden, oder wenn beide Eingänge denselben 
Zustand haben.
Das ist nicht dasselbe. Denn die beiden Eingänge haben auch dann 
denselben Zustand, wenn die beiden Taster nicht gedrückt sind.

Ehe man etwas programmiert sollte einem die zu erzielende Logik klar 
sein. Denn sonst kommt man ganz unweigerlich mit den && bzw. || 
durcheinander, mit denen man Teilausdrücke miteinander verknüpft.

Ganz abgesehen davon sollte man sich darüber im klaren sein, dass so 
etwas wie '2 Taster gleichzeitig gedrückt' immer eine etwas knifflige 
Sache ist. Denn für deinen µC sind Zeiten kleiner als Millisekunden 
überhaupt kein Problem. Für dich als Mensch ist es aber praktisch 
unmöglich, 2 Taster in exakt derselben Hunderstel-Sekunde zu drücken. 
D.h. für deinen µC wird es immer so aussehen, dass zuerst die eine Taste 
gedrückt wird und erst dann die andere Taste. Wenn also bereits ein 
einfacher Tastendruck einer der beiden Tasten jeweils eine Aktion 
auslöst, dann wirst du praktisch immer in dieser Einzelaktion landen, 
weil du es nicht schaffst, die beiden Tasten so zu drücken, dass der µC 
sie als tatsächlich gleichzeitig niedergedrückt erkennt.
Ausser natürlich du spickst dein Programm mit diversen Delays. Aber auch 
dann ist es mehr zufällig, ob das klappt oder nicht. Ganz abgesehen 
davon, dass man die Delays nicht haben will.
#3973623
Lesenswert?

Habe eine relativ einfache Methode gefunden. Alles in einer Zeile drin.
1
//if (!(PINB & 0b11000000 ))
2
    if (!(PINB & 0xc0 ))
3
    
4
    return 1;
5
    else
6
    return 0;
Es müüsen beide Tasten gedrückt sein damit return 1 ist. Drücke ich nur 
eine Taste, hat es keinen Einfluss.
Die beiden ersten Zeilen sind gleich, nur anders geschrieben. Damit kann 
ich ohne Problem auch andere Eingänge einbinden.
achim
#3973957
Lesenswert?

Achim Seeger schrieb:
> Habe eine relativ einfache Methode gefunden. Alles in einer Zeile drin.
>
1
> //if (!(PINB & 0b11000000 ))
2
>     if (!(PINB & 0xc0 ))
3
> 
4
>     return 1;
5
>     else
6
>     return 0;
7
>
> Es müüsen beide Tasten gedrückt sein damit return 1 ist. Drücke ich nur
> eine Taste, hat es keinen Einfluss.
> Die beiden ersten Zeilen sind gleich, nur anders geschrieben. Damit kann
> ich ohne Problem auch andere Eingänge einbinden.
> achim

Damit man aber noch lesen kann, welcher Pin gemeint ist:
1
if (  !(PINB &   ((1<<PINB6)|(1<<PINB7))   )  )
2
    return 1;
3
    else
4
    return 0;

((1<<PINB6)|(1<<PINB7)) ergibt dein Bitmaske 0b11000000

if(<Aussage>)
  return 1;
else
  return 0;

kannst du immer zu return <Aussage> vereinfachen.

Also hier:
1
return !(PINB & ((1<<PINB6)|(1<<PINB7)) )
Moderator (Firma: Titel) Persönliche Seite #3978605
Lesenswert?

Achim Seeger schrieb:
> Es müüsen beide Tasten gedrückt sein damit return 1 ist.
Das ist aber ganz was Anderes als das, was dort gefordert war:
Achim Seeger schrieb:
> Nur wenn beide eingänge entweder H oder L haben soll geschaltet werden.
Also muss geschaltet werden, wenn beide H sind und wenn beide L 
sind...

Du solltest bei der Problembeschreibung ein wenig weg kommen vom 
Umgangssprachlichen und definierte Angaben machen.

MWS schrieb:
> Lothar Miller schrieb:
>> return !!(PINB & PINB6) == !!(PINB & PINB7);
> Na, Lothar, so ganz sicher nicht. Fehlt da nicht etwas? ;-)
Uuups, ich korrigiere und schreibe dazu noch alles ohne Leerzeichen:
1
  // Wenn beide gleich: 1 zurückgeben. Wenn ungleich: 0
2
  return !!(PINB&(1<<PINB6))==!!(PINB&(1<<PINB7));

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