Hi Leutz,
bislang war die IF-Abfrage mit einem Eingang eigentlich nie ein Problem,
aber nun möchte ich gerne 2 Eingänge gleichzeitig abfragen. Nur wenn
BEIDE Eingänge 1-Signal haben, soll ein Ausgang geschaltet werden.
Dabei sollen natürlich die restlichen Bits nicht in die Auswertung mit
einfließen, da diese ebenfalls durch Eingangssignale veränderbar sind.
Folgende Zeile schaltet scheinbar schon den Ausgang, wenn einer der
beiden Eingänge ein 1-Signal hat:
if (PIND & 0b00010010)
{
PORTB|= (1 << PB0);
}
Habe auch noch einige andere Befehlszeilen ausprobiert, aber scheinbar
scheine ich die Auswertung noch nicht richtig verstanden zu haben.
Wäre hier für nen Tipp dankbar.
Daniel
Der if-Block wird ausgeführt, wenn die Bedingung wahr ist, in C, wenn
der ausgewertete Ausdruck nicht 0 ist. Wenn jetzt einer der beiden
Eingänge 1 ist, ist das Ergebnis des Und größer als 1 und damit wahr. In
deinem Fall könntest du zum Beispiel schreiben:
1
if(PIND&0b00010010==18)
2
{
3
}
Wenn beide Eingänge 1 sind, ist das Ergebnis genau 18.
Eine verständlichere Möglichkeit wäre:
Wobei man bei der von Noname geposteten Lösung darauf hinweisen sollte,
dass dies so nicht Standardkonform ist und "nur" mit dem avr-gcc
funktioniert. Im Normalfall wird man daher die Hex-Notation verwenden.
@ Karol Babioch
>Wobei man bei der von Noname geposteten Lösung darauf hinweisen sollte,>dass dies so nicht Standardkonform ist und "nur" mit dem avr-gcc>funktioniert. Im Normalfall wird man daher die Hex-Notation verwenden.
Meine Lösung wirft das Problem nicht auf. Es besteht es schon im vom TO
geposteten Code. Das eigentlich ursächliche Problem hat damit garnichts
zu tun.
Danke erstmal für die schnellen Antworten.
An die Dezimalauswertung habe ich auch schon gedacht, habe aber heute
nicht soweit gedacht, daß die 18 hier eigentlich nur durch eben DIESE
EINE Konstellation möglich ist.
Allen noch einen schönen (hoffentlich sonnigen) (Fußball)sonntag :-).
Daniel
Da haben wir es. Jetzt ist er auf einer falschen Spur.
Das Problem, Danny ist nicht ob Dezimal, Hexdezimal oder Binär.
Das Problem ist, das Du nicht verstanden hast, was
1
if(x)...
2
if(x&y)...
eigentlich macht.
Die Bedingung "x" ist dann wahr, wenn x ungleich 0 ist. Das ist aber für
drei der vier möglichen Kombinationen Deines Ports wahr (lässt man die
restlichen 6 Bits ausser Acht).
Du willst hingegen auf EINE Kombination hin testen. Also musst Du nicht
nur die beiden Bits mit & ausmaskieren sondern noch das Ergebnis prüfen.
Ob Dezimal oder was auch immer ist hier am Rande interessant.
Du hast Recht Noname,
daher kam natürlich dann bei meiner ersten Zeile schon der Ausgang als
nur ein Eingang 1-Signal lieferte. Die erste Verknüpfung (PIND &
0b00010010)
ist also in dem Falle, wenn ich das nun richtig verstanden habe, nur ein
Ausmaskieren der Bits.
Angenommen, PIND hätte momentan den Zustand 11111111:
Wäre also:
11111111
& 00010010
= 00010010
Mein vorheriges Ergebnis "vergleichst" Du ja nochmals mit dem
==0b00010010.
Und dieses wird eben nur wahr, wenn 0b00010010 == 0b00010010.
Danke Dir :-).
Habe gerade nochmal mein Buch herausgekramt und dort steht es so auch.
Zitat:
"In Verbindung mit der Programmiersprache C ist alles wahr, was einen
Wert ungleich 0 besitzt. Dagegen wird unwahr zurückgeliefert, wenn der
Wert gleich 0 ist. Zwischenwerte gibt es nicht, eine Bedingung ist stets
wahr oder unwahr..."
Würde es genauso machen wie Noname
if ((PIND & 0b00010010) == 0b00010010)
{
PORTB|= (1 << PB0);
}
Relevante pins mit & heraussuchen und mit == vergleichen.
Daniel Lo schrieb:> ""... Zwischenwerte gibt es nicht, eine Bedingung ist stets> wahr oder unwahr..."
Na, das ist doch mal 'ne klare Aussage, die man sich über'n Monitor
hängen kann. Fuzzylogik lassen wir jetzt mal außen vor, damit die
gewonnene Klarheit nicht gleich wieder flöten geht ;-)