Forum: Mikrocontroller und Digitale Elektronik Problem mit if-Anweisung


von Helpme91 (Gast)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

Helpme91 schrieb:
> Wie muss die if-Anweisung aussehen?

Gegenfrage: Wie schaltet der Taster? Nach GND oder nach VCC?

von Felix A. (madifaxle)


Lesenswert?

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"
}

von Schalter (Gast)


Lesenswert?

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.

von Schalter (Gast)


Lesenswert?

Eventuell liegt es auch an R42.

von Helpme91 (Gast)


Lesenswert?

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.

von Felix A. (madifaxle)


Lesenswert?

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

von Helpme91 (Gast)


Lesenswert?

So geht es also nicht?

if (PB6 == 1)
{
  "LED einschalten"
}

usw.

von Helpme91 (Gast)


Lesenswert?

Sorry, ich meinte:

if (PIN_PB6 == 1)
{
  "LED einschalten"
}

So kann man es bei MPLAB machen.

von Felix A. (madifaxle)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

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.

von Helpme91 (Gast)


Lesenswert?

Was bedeutet eigentlich der Teil:

1<<PB6

Heißt dies, dass der PIN "PB6" auf 1 gesetzt wird?


MfG

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.