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


von stefan (Gast)


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.

1
uint8_t Speicher;  
2
Speicher = PINC;   // 8 bit aus Pin C in die Variable laden 
3
4
  if (Speicher)   // Hier soll stehen das die if anweisung nur reagiert -
5
   {              // wenn das 1 Bit in der Variable Speicher eine 1 ist -
6
                  // egal wie die anderen Bits sind.
7
    Programm teil
8
   }

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

von crazy horse (Gast)


Lesenswert?

if (speicher & 0x01)
 ...

von Dennis B. (higret)


Lesenswert?


von Niels H. (monarch35)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

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

von stefan (Gast)


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

von Johannes M. (johnny-m)


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!

von SF (Gast)


Lesenswert?

Aller Anfang ist schwer. Und Bitmanipulationen in C sind etwas 
gewöhnungsbedürftig. Normalerweise würde man das so machen:
1
// in einer .h  Datei
2
#define BIT_TO_TEST 1
3
4
// in der .c Datei
5
if ( PINC & (1<<BIT_TO_TEST) ){
6
     // do something if bit is set
7
8
}

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
1
0b10101010
2
0b00000010
3
----------
4
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:
1
0b10101000
2
0b00000010
3
----------
4
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.

von stefan (Gast)


Lesenswert?

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

von Wegstaben V. (wegstabenverbuchsler)


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 
....

von Matthias L. (Gast)


Lesenswert?

Das hier:
1
if (speicher & 0x01)

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

von Simon K. (simon) Benutzerseite


Lesenswert?

Matthias Lipinsky wrote:
> Das hier:
>
1
> if (speicher & 0x01)
2
>
>
> ist die Kurzform für:
>
1
> if (  (speicher & 0b00000001 == 0b00000001  )
2
> {
3
> ...
4
>

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

von Johnny (Gast)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

@ Simon K. (simon)
Das ist dasselbe.

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

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.