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:
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:
Hallo Lothar
wollte es in einer Zeile hinbekommen. Möchte damit einen Codierschaltzer
auswerten. Der hat bis zu 4 Ausgänge. 1,2,4,8 zu 10 pol.
Dadurch muss ich bis zu 4 Pins gleichzeitig abfragen.
Dachte dabei an
if ( PINB5 & PINB 6 & PINB7 & PIN ? )(Vereinfacht)
achim
Cian Xang Re schrieb:> MWS schrieb:>> Ein AND & ist kein EXOR ^.>> Warum nicht?
Warum ist Grün nicht Rot?
Und doof nicht intelligent?
Fragen über Fragen...
Achim Seeger schrieb:> Es sollen 2 Eingänge abgefragt werden. Nur wenn beide eingänge entweder> H oder L haben soll geschaltet werden.Achim Seeger schrieb:> Sorry vergesen bzw nicht richtig geschrieben. Entweder H oder L> nicht beide
Deine Problembeschreibung ist wirr.
Möglicherweise beschreibst Du besser, was es am Ende machen soll.
Ganz einfach
Habe Taster 1 und Taster 2 am PB6 und PB7 angeschlossen. Liegen über
einen Widerstand nach Vcc. Wenn ich beide taster betätige (nach Masse)
soll if schalten. Dabei ist es nicht wichtig ob sie entprellt oder
gleichzeitig gedrückt werden
Achim Seeger schrieb:> Ganz einfach> Habe Taster 1 und Taster 2 am PB6 und PB7 angeschlossen. Liegen über> einen Widerstand nach Vcc. Wenn ich beide taster betätige (nach Masse)> soll if schalten. Dabei ist es nicht wichtig ob sie entprellt oder> gleichzeitig gedrückt werden
Eine UND Verknüpfung mit NICHT ODER?
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.
Hallo Lohtar
Die Hardware gibt es noch nicht. Dadurch kann ich alles noch machen.
Da bleibt mir wohl nur die zweite Version. Ein paar gute Sachen stehen
drin. Werde mal alles testen. Danke für deine Hilfe
achim
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...
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
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.
Habe eine relativ einfache Methode gefunden. Alles in einer Zeile drin.
1
//if (!(PINB & 0b11000000 ))
2
if(!(PINB&0xc0))
3
4
return1;
5
else
6
return0;
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
Achim Seeger schrieb:> Habe eine relativ einfache Methode gefunden. Alles in einer Zeile
Nun sollst Du meinen letzten Post genau lesen und über den Unterschied
zwischen den beiden Schreibweisen gleichen Ausdrucks nachdenken ;-)
Gruß,
Marek
Wenn beide Taster immer gleichzeitig gedrückt werden müssen (z.B. um
eine Presse runter zu lassen) kann man auch einfach beide Taster in
Reihe schalten. Quasi eine Hardware-Und-Verschaltung ;) Die Hardware
steht ja noch nicht.
Geht natürlich nicht, wenn auch beim Drücken einer Taste was passieren
soll.
Achim Seeger schrieb:> Habe eine relativ einfache Methode gefunden. Alles in einer Zeile drin.>
1
>//if (!(PINB & 0b11000000 ))
2
>if(!(PINB&0xc0))
3
>
4
>return1;
5
>else
6
>return0;
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
return1;
3
else
4
return0;
((1<<PINB6)|(1<<PINB7)) ergibt dein Bitmaske 0b11000000
if(<Aussage>)
return 1;
else
return 0;
kannst du immer zu return <Aussage> vereinfachen.
Also hier:
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
Lothar Miller schrieb:> Also muss geschaltet werden, wenn beide H sind und wenn beide L> sind...
Das wird schwer, denn entweder hat eine Eingang H oder L -aber beides
zur gleichen Zeit?
Achim schrieb:
> Nur wenn beide eingänge entweder H oder L haben soll geschaltet werden.
Das ist ein XNOR.
MfG Paul