Hallo, ich habe ein Problem mit meiner if-Anweisung. Die if-Anweisung soll einfach Überprüfen ob der Taster gedrückt ist oder nicht. Ist er gedrückt soll die LED eingeschaltet werden. Ich habe es so gemacht: if (PINB & (1<<PB6)) { "LED einschalten" } Die LED leuchtet aber schon, bevor ich den Taster gedrückt habe. Wie muss die if-Anweisung aussehen? MfG
Helpme91 schrieb: > Wie muss die if-Anweisung aussehen? Gegenfrage: Wie schaltet der Taster? Nach GND oder nach VCC?
Da dein Taster die Spannung am Pin durch einen Pullup-Widerstand auf
Masse zieht (?), wohl invertiert:
if (!(PINB & (1<<PB6)))
{
"LED einschalten"
}
else
{
"Led ausschalten"
}
Helpme91 schrieb: > Die LED leuchtet aber schon, bevor ich den Taster gedrückt habe. > > Wie muss die if-Anweisung aussehen? Der Fehler liegt in den Zeilen, die Du nicht zeigen willst. Denn wenn die LED schon vorher leuchtet, kann es ja nicht an der If-Anweisung liegen.
Funktioniert, danke! Gibt es da eine bessere schreibweise wie:"if (!(PINB & (1<<PB6)))" oder "if (PINB & (1<<PB6))"? Ich versteh das mit dem "&" in der mitte nicht ganz. Für mich ist das "&" wie ein UND aus der Boolschen Algebra.
PINB ist ein Lesen vom Port. Also gibt es sowas wie 11000010.
Deine Maske hat z. B. 10000000.
Dann sind 11000010 & 10000000 = 10000000.
Das ! fragt demnach, ob es KEINE Übereinstimmung gibt, also
PINB & 10000000 = 00000000
Ich persönlich mag folgendes lieber:
if ( (PINB & (1<<PB3)) != 0) { ... }
Zum &:
x = 10101010 & 10100000
x = 10100000
Sorry, ich meinte:
if (PIN_PB6 == 1)
{
"LED einschalten"
}
So kann man es bei MPLAB machen.
Keine Ahnung, ob der MPLAB-Compiler das macht. Aber bei AVRs (PINB und PORTB usw. kenne ich nur von denen) gibt es meines Wissens nach keinen direkten Zugriff auf einzelne Pins in der Form wie du es vorhin geschrieben hast.
Helpme91 schrieb: > So kann man es bei MPLAB machen. Wenn dein C irgendwann einmal besser wird und du bei Bitfeldern angekommen bist, dann kannst du so etwas ähnliches machen. Aber im Moment solltest du mit den binären Operationen & | und ~ üben, damit du mit ihnen nicht auch noch weiterhin auf Kriegsfuss stehst. Denn die brauchst du auch weiterhin alle Nase lang. Edit: Es gäbe auch noch eine Variante, wie man mit Makros die gewünbschte Schreibweise erreichen kann. Aber wie gesagt: erst mal muss dein C sich um ein paar Größenordnungen verbessern. Je mehr du von den Möglichkeiten deiner Programmiersprache kennst, desto besser kannst du sie auch zu deinem Vorteil nutzen.
Karl H. schrieb: > Aber im Moment solltest du mit den binären Operationen & | und ~ üben, > damit du mit ihnen nicht auch noch weiterhin auf Kriegsfuss stehst. Denn > die brauchst du auch weiterhin alle Nase lang. @TO: da hat kbuchegg ganz recht! > Wenn dein C irgendwann einmal besser wird und du bei Bitfeldern > angekommen bist, dann kannst du so etwas ähnliches machen. Wenn dem dann so ist, dann suche mal im Forum nach der sbit.h im Zusammenhang mit Peter Dannegger.
Was bedeutet eigentlich der Teil: 1<<PB6 Heißt dies, dass der PIN "PB6" auf 1 gesetzt wird? MfG
Helpme91 schrieb: > Was bedeutet eigentlich der Teil: > > 1<<PB6 > > Heißt dies, dass der PIN "PB6" auf 1 gesetzt wird? nein. << ist die C Schreibweise für eine Operation, die man mit "schiebe den linken Operanden um die im rechten Operanden angegebene ANzahl an Bits nach links" beschreiben könnte. PB6 ist nichts anderes als ein Makro, welches für die Zahl 6 steht. 1 << PB6 Du nimmst also eine 1, in Binärschreibweise 0b00000001 und schiebst alle Bits um 6 Stellen nach links 0b00000001 Original 0b00000010 1 mal geschoben 0b00000100 2 mal geschoben 0b00001000 3 mal geschoben 0b00010000 4 mal geschoben 0b00100000 5 mal geschoben 0b01000000 6 mal geschoben Das Ergebnis ist also ein Byte, welches genau an der Bitposition 6 ein 1-Bit aufweist und ansonsten lauter 0-Bits. > Heißt dies, dass der PIN "PB6" auf 1 gesetzt wird? Das heisst erst mal überhaupt nichts. Das ganze ist ein Ausdruck, so wie auch 3+2 ein arithmetischer Ausdruck ist. Erst dann, wenn du mit diesem Ergebnis irgendetwas machst, kann man von 'das heisst das ...' sprechen. Aber vorher ist es einfach nur ein Ergebnis, das aus einer arithmetischen Operation entsteht. Links schieben (oder rechts schieben) ist in C genauso eine arithmetische Operation, wie Addition oder Multiplikation oder Vergleiche. Du brauchst ein C Buch
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.