www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik if anweisung bit abhängig


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich habe eine Frage ich möchte eine if Anweisung erstellen die 
immer dann "startet" wenn bestimmte bit bedingungen erfüllt sind.

z.B. egal was in messwerte steht wenn an der stelle 0b.......1 eine 1 
ist und bei messwerte[2] an  der stelle 0b.......1. soll die die 
begingung erfüllt sein egal was die anderen bits machen.

messwerte[1] = PINB;
if ( messwerte )
{
Programm
}

messwerte[2] = PINC;
if ( messwerte )
{
Programm
}

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if(messwerte[1] & 0x01) { ... }

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt e da nicht eine schönere lösung

Autor: 11833 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt e nicht.
ist schön enug.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>gibt e da nicht eine schönere lösung
Was gibt es denn daran auszusetzen? Das ist genau das, was Du wolltest. 
Nach dem & schreibst Du den Wert für das Bit, das Du abfragen willst. 
Ganz einfach. Und leserlich ist dann Dein Code auch noch.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann man eine bestimmet stelle des 0b........ auch auf 0 abfragen.

z.B. 0b..0..1.. das messwert an diesen stellen genau das haben soll.
oder besser gesagt egal wie der code aussieht er soll immer das dritte 
bit ausblenden.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Daniel N. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
x = x & 0b11111011 löscht das dritte Bit.

Und jetzt schnapp dir bitte ein C Buch und zudem Literatur zu
logischen Verknüpfungen.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey ich gebe auf messwerte eine 0b00101110 aber ich komme einfach nicht 
in die if anweisung.
if ((messwerte[2]&0b00001000) == 0b00001000)
{
}

Das mit der Bitmanipulation habe ich geschaft.

Autor: unbedarfter_no1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> if ((messwerte[2]&0b00001000) == 0b00001000)

besser so:
if ((messwerte[2]&0b00001000) == 1)
oder so:
if (messwerte[2]&0b00001000)

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unbedarfter_no1 wrote:

> besser so:
if ((messwerte[2]&0b00001000) == 1)

hast Du dass nicht so gemeint?
if ((messwerte[2]&0b00001000) > 0)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unbedarfter_no1 wrote:

> besser so:
if ((messwerte[2]&0b00001000) == 1)

Das ist immer False.

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> kann man eine bestimmet stelle des 0b........ auch auf 0 abfragen.

Ein Bit ist genau dann 0, wenn es nicht 1 ist.

if(!(messwerte[1] & 0x01)) { ... }

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und was kann ich machen wenn ich nur eine bit nicht abfragen will z.B.
0b00101111 die bedibgung soll immer erfüllt sein wenn bit 0,1,2 und 5 
eine 1 hat egal was an bit 3 ist

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (messwerte[2] >= 79) ...

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (messwerte[2] & 0xf7) ....

wird TRUE wenn Bit 0,1,2,4,5,6,7 = 1 ist. Bit 3 spielt keine Rolle

Gruss Helmi

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das richtig das alle Zeichen außer die letzten 3 Bit mit einer 1 
überschreiben werden

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wird mit der Maske 11110111 maskiert

Also

Eingangsbyte    10100110
Maske           11110111
Ergebnis        10100110  -> mindestens ein bit 1 und damit True

Eingangsbyte    00001000
Maske           11110111
Ergebnis        00000000  -> kein Bit 1 und damit False

Gruss Helmi

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verarscht ihr ihn jetzt alle, oder hab ich ein Brett vorm Kopf? (Aus dem 
Standardumgangston hier im Forum schließe ich leider wohl mal eher auf 
ersteres...)

Mein Vorschlag wäre:
if (messwerte[2]&&0b00001000)
Noch schönere Alternative (und exakt gleichwertig, aber lesbarer):
if (messwerte[2]&&(1<<3))

Das sollte theoretisch reichen, oder? Von sowas wie
if ((messwerte[2]&0b00001000) == 0b00001000)
würde ich allerdings abraten, da das höchstwahrscheinlich messwerte[2] 
verändert.

Bei AVRs (kann ohne Controllerangabe ja nur raten...) gibt es aber auch 
den sbrs-Befehl (*S*kip if *B*it in *R*egister is *S*et). Wie man das in 
C direkt einbaut weiß ich allerdings nicht.


Für den Test, ob das Bit nicht gesetzt ist, bietet sich die Negation an:
if (!(messwerte[2]&&(1<<3)))

Gruß, CowZ

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>if (messwerte[2]&&0b00001000)
                 ^^

Das ist ein logisches UND
was du hier brauchst ist ein binaeres UND

also

if (messwerte[2]&0b00001000)

Gruss Helmi

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lasse S. wrote:

> Das sollte theoretisch reichen, oder? Von sowas wie
>
if ((messwerte[2]&0b00001000) == 0b00001000)
> würde ich allerdings abraten, da das höchstwahrscheinlich messwerte[2]
> verändert.

Sorry, aber das ist einfach nur Blödsinn. messwerte[2] wird dabei 
keinesfalls verändert.

Autor: unbedarfter_no1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, sorry, in meinen Programmen mache ich es doch auch richtig. 
***kopfschüttel***
if ((messwerte[2]&0b00001000) != 0)

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups,

steinigt mich, ich hätte es verdient...

ich bitte vielmals um Entschuldigung... War also doch das Brett vor 
meinem Kopf... Sorry.

Gruß, CowZ

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geh hin in deine Ecke und schaem dich. Fuer die naechsten 2 Wochen 
darfst du keine Schleifen mehr programmieren sondern must den Code 
100mal abtippen.

Gruss Helmi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.