mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik if anweisung in abhängikeit eines Bit in einer Variable


Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo wie kann man eine if Anweisung in C programmieren die nur auf ein 
Bit ein einer Variablen reagiert ich habe ein atmega16 z.B.

uint8_t Speicher;  
Speicher = PINC;   // 8 bit aus Pin C in die Variable laden 

  if (Speicher)   // Hier soll stehen das die if anweisung nur reagiert -
   {              // wenn das 1 Bit in der Variable Speicher eine 1 ist -
                  // egal wie die anderen Bits sind.
    Programm teil
   }           
                  

Danke schon mal bitte in leicht erklären bin noch neu in diesem Wasser 
:-)

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (speicher & 0x01)
 ...

Autor: Dennis B. (higret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Da steht alles, was du für den Anfang brauchst.

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>if (speicher & 0x01)

Hier müssen die anderen bit aber 0 sein die if anweisung soll aber 
starten egal was die anderen bits machen!

oder habe ich das nicht richtig verstanden

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

Bewertung
0 lesenswert
nicht lesenswert
stefan wrote:
>>if (speicher & 0x01)
>
> Hier müssen die anderen bit aber 0 sein
Nein.

> die if anweisung soll aber
> starten egal was die anderen bits machen!
Das tut die auch! Bitte schau mal in einem C-Buch oder im 
AVR-GCC-Tutorial nach, was der &-Operator macht!

> oder habe ich das nicht richtig verstanden
Hast Du nicht.

Und lies Dir mal die Forenregeln durch bzw. den Artikel zum Thema 
Netiquette. Groß- und Kleinschreibung und Zeichensetzung sind kein 
Luxus!

Autor: SF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aller Anfang ist schwer. Und Bitmanipulationen in C sind etwas 
gewöhnungsbedürftig. Normalerweise würde man das so machen:
// in einer .h  Datei
#define BIT_TO_TEST 1

// in der .c Datei
if ( PINC & (1<<BIT_TO_TEST) ){
     // do something if bit is set

}

Das & ist eine Bitweise UND-Verknüpfung. Wenn PINC zum Beispiel 
0b10101010 wäre, dann ist (1<<BIT_TO_TEST) gleich 0b00000010 und als 
Ergebnis der UND-Verknüpfung kommt dann
0b10101010
0b00000010
----------
0b00000010

heraus. Dies ist ungleich 0 also TRUE und der Anweisungsteil der If 
Anweisung wird ausgeführt.

Wäre PINC = 0b10101000 dann würde folgendes herauskommen:
0b10101000
0b00000010
----------
0b00000000

Dies ist gleich 0 also FALSE und der Anweisungsteil der If Anweisung 
wird nicht ausgeführt.

Es wird also wie gewollt nur das Bit 1 getestet.

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Johannes M. wie gesagt ich habe noch nicht die meiste Ahnung von 
solchen Sachen.

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan

naja, die elementaren Binär-Operatoren oder Gatterfunktionen (AND, OR, 
NOT, XOR) sind ja weder C noch Mikrocontroller-spezifisch.

Daher ist ja der Artikel zu "Bitmanipulationen" eigentlich elementares 
Basiswissen, sofern du dich mit Binärlogik noch nicht so genau auskennst 
....

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier:
if (speicher & 0x01)

ist die Kurzform für:
if (  (speicher & 0b00000001 == 0b00000001  )
{
...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias Lipinsky wrote:
> Das hier:
>
> if (speicher & 0x01)
> 
>
> ist die Kurzform für:
>
> if (  (speicher & 0b00000001 == 0b00000001  )
> {
> ...
> 

Wohl eher
if ((speicher & 0b00000001) != 0b0000000)

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, ein "if" in C prüft den Ausdruck nur auf nicht 0, wird also wahr 
wenn Ausdruck ungleich 0 ist.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Simon K. (simon)
Das ist dasselbe.

Ich hab nur ne Klammer-Zu vergessen:
if (  (speicher & 0b00000001) == 0b00000001  )

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.