Problem mit if-Anweisung

Gast #4335574
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
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.
Gast
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
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
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.
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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.