Problem mit if-Anweisung

Gast #4335574
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
Gast #4335596
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.
#4335602
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
#4335634
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.
Gast #4335770
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.
#4335906
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.