Forum: Mikrocontroller und Digitale Elektronik Bitoperator?!


von Michel (Gast)


Lesenswert?

Hey,
kurze, wohl auch simple Frage
if (!(PINA & (1<<PA0)))
{
irgendwas
}

was genau passiert in der if-Abfrage? Ich steig nicht dahinter.
Vielen Dank :)

von Patrick (Gast)


Lesenswert?

"<<" shiftet den Wert "1" um "PA0" Stellen nach links. PA0 ist 0, d. h. 
das gibt in Binärschreibweise 00000001.
Mit "&" wird das bitweise verUNDet mit dem Inhalt von PINA. Das Ergebnis 
wird logisch (NICHT bitweise!)invertiert, d. h. es wird 0, falls es 
vorher != 0 war, und 1, wenn es vorher 0 war.
Du brauchst ein C-Buch. Steht aber auch hier im Tutorial.

von Thomas (Gast)


Lesenswert?

Hey,

also in deinem PINA-Register stehen die "Eingangszustände" von dem Port 
A. diese werden jetzt mit der UND-Funktion verknüpft.

1<<PA0, PA0 ist natürlich irgendwo definiert, und wenn man das 
aufschlüsselt, steht da 1<<0, was wiederum 1 ist (oder Binär: 
0000.0001). Wenn man das nun mit dem PINA Register über & Verknüpft sind 
also alle Bits 0, außer das LSB: 0000.000?. Ob das LSB1 oder 0 ist, 
hängt davon ob, wie das LSB im PINA Register war.

Vielleicht hilft dir das auf die Sprünge?

Thomas

von goo (Gast)


Lesenswert?

Er testet das PA0te Bit in PINA. Wenn es gesetzt ist, überspringt er 
"irgendwas".

von Falk B. (falk)


Lesenswert?


von Michel (Gast)


Lesenswert?

Jo stimmt,
jetzt seh ich es auch, vielen Dank an alle!!

von Michel (Gast)


Lesenswert?

goo schrieb:
> Er testet das PA0te Bit in PINA. Wenn es gesetzt ist, überspringt er
> "irgendwas".

Ich nochmal:
also ich hab mir das noch mal angeschaut und in Keil uVision 4 getestet.
also so sollte es doch sein?
if(1)
{
Aktion ausführen
}
if(0)
{
Aktion überspringen
}
und in Keil ist es genau umgekehrt
if(0)
{
Aktion ausführen
}
if(1)
{
Aktion überspringen
}

von B. L. (b8limer)


Lesenswert?

Du hast die If-Abfrage noch nicht verstanden:

Wenn (im Englischen "If") der Ausdruck in der Klammer 1 ergibt (besser 
gesagt ungleich 0 ist), dann wird die Anweisung die in den geschweiften 
Klammern {} steht ausgeführt. Ansonsten wird das was in {} steht 
schlicht und ergreifend ausgelassen und das Programm fährt an der 
nächsten Anweisung nach der "}" fort.

von Karl H. (kbuchegg)


Lesenswert?

Michel schrieb:

> und in Keil ist es genau umgekehrt

Nicht 'in Keil'

Es hängt davon ab, wie die Tasten angeschlossen sind!
Welcher Pegel liegt am EIngang an, wenn der Taster
  * nicht gedrückt
  * gedrückt
ist?

Und das hängt nicht vom Compiler ab. Logik ist immer gleich, unabhängig 
vom dem der sie interpretiert.

  Da kommt ein Byte vom Eingangsport
  dieses Byte wird 'durch eine Maske geschossen', so dass nur das Bit
  übrig bleibt, welches interessiert. Und dann lautet die Frage, ist
  das jetzt 0 oder nicht 0.


  Byte vom Port         01001001

  Maske                 -------v     ( die Maske lässt nur bei v durch
                                       an den Stellen - wird das Byte
                                       nicht 'durchgelassen' und statt
                                       dessen kommt sicher eine 0 an
                                       das Ergebnisbit

  Ergebnis              00000001

Das Ergebnis ist nicht 0, weil im 'Byte vom Port' das Bit 0 schon 1 war.

von Michel (Gast)


Lesenswert?

B. Limer schrieb:
> Du hast die If-Abfrage noch nicht verstanden:
>
> Wenn (im Englischen "If") der Ausdruck in der Klammer 1 ergibt (besser
> gesagt ungleich 0 ist), dann wird die Anweisung die in den geschweiften
> Klammern {} steht ausgeführt. Ansonsten wird das was in {} steht
> schlicht und ergreifend ausgelassen und das Programm fährt an der
> nächsten Anweisung nach der "}" fort.

Ja, das ist mir klar, nur wenn ich in das in uVision 4 so ausprobiere, 
unabhängig von irgendeinem Port, dann wird bei if(1) die Anweisung 
übersprungen und bei if(0) die Anweisung ausgeführt.

von Michel (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Michel schrieb:
>
>> und in Keil ist es genau umgekehrt
>
> Nicht 'in Keil'
>
> Es hängt davon ab, wie die Tasten angeschlossen sind!
> Welcher Pegel liegt am EIngang an, wenn der Taster
>   * nicht gedrückt
>   * gedrückt
> ist?
>
Sry Zitat musste gekürzt werden

Also in meinem Bsp ist das so: DDRA = 0x00 --> als Eingang definiert
wenn ich jetzt am PINA ein Signal drauf gebe, ist PINA = 1 und PA0 = 1; 
das gemeinsam UND-verknüpft ergibt eine 1 und negiert (!) macht daraus 
eine Null; demnach if-Anweisung ÜBERSPRINGEN, aber in meinem Fall wird 
sie ausgeführt.

von Michel (Gast)


Lesenswert?

Ah, bevor ich es vergesse
also
DDRA = 0x00;
PORTA = 0xFF;
hat das PORTA Einfluss darauf?
weil ich kann mir den Vorteil vom sogenannten "Pull Ups" ziehen nicht 
klar machen.

von Rolf Magnus (Gast)


Lesenswert?

Michel schrieb:
> wenn ich jetzt am PINA ein Signal drauf gebe, ist PINA = 1 und PA0 = 1;

Hast du das irgendwie überprüft, z.b. durch Ausgabe des Wertes?

> das gemeinsam UND-verknüpft ergibt eine 1 und negiert (!) macht daraus
> eine Null;

Genau so geschrieben, wie in deinem ersten Posting?

> demnach if-Anweisung ÜBERSPRINGEN, aber in meinem Fall wird
> sie ausgeführt.

Wie hast du das getestet?

Michel schrieb:
> PORTA = 0xFF;
> hat das PORTA Einfluss darauf?

Nein. Dadurch sollte auch schon, wenn du gar nichts angeschlossen hast, 
das Bit 1 sein, da der Pull-up den Pegel hochzieht (daher ja auch 
"Pull-up").

> weil ich kann mir den Vorteil vom sogenannten "Pull Ups" ziehen nicht
> klar machen.

Pull-ups sind dazu da, daß der Pin einen definierten Wert hat, wenn ihn 
von außen nichts auf einen solchen zieht. Ansonsten würde der Pin ja "in 
der Luft" hängen und irgendeinen undefinierten Wert annehmen.

von Michel (Gast)


Lesenswert?

Hallo Rolf;
um die if-Anweisung mit der 1 & 0 zu testen, habe ich nur folgenden 
Quellcode benutzt:
if(1)
{
printf("Beispiel 1 \n");
}
if(0)
{
printf("Beispiel 2 \n");
}
Die Ausgabe zeigte "Beispiel 2" und war unabhängig von Ports und 
dergleichen geprüft.
Das andere mit:
if (!(PINA & (1<<PA0))){}
ist so im Originalquellcode. Also DDRA = 0x00 & PORTA = 0xFF
und weiter im Quellcode sind exakt 2 if-Abfragen
if (!(PINA & (1<<PA1))){}
if (!(PINA & (1<<PA0))){}
und das Programm funktioniert auch. Weil er mit der if-Abfrage nur die 
Schalterstellung des DIP-Schalters abfragt und in die richtige 
ifAnweisung springt.

von Cyblord -. (cyblord)


Lesenswert?

Michel schrieb:
> Hallo Rolf;
> um die if-Anweisung mit der 1 & 0 zu testen, habe ich nur folgenden
> Quellcode benutzt:
> if(1)
> {
> printf("Beispiel 1 \n");
> }
> if(0)
> {
> printf("Beispiel 2 \n");
> }
> Die Ausgabe zeigte "Beispiel 2"

Das ist merkwürdig. In C sollte alles was nicht 0 ist = wahr sein.
Was passiert wenn du auf (1==1) bzw. (1==0) testest?

gruß cyblord

von Michel (Gast)


Lesenswert?

> Das ist merkwürdig. In C sollte alles was nicht 0 ist = wahr sein.
> Was passiert wenn du auf (1==1) bzw. (1==0) testest?
>
> gruß cyblord

haha, jetzt wird das gemacht, was auch logisch ist
if(1)
{
printf("Beispiel 1 \n");
}
if(0)
{
printf("Beispiel 2 \n");
}
Ausgabe: "Beispiel 1"

und bei
if(1==1)
{
printf("Beispiel 1 \n");
}
if(1==0)
{
printf("Beispiel 2 \n");
}
Ausgabe: "Beispiel 1"

frag mich nicht wieso das jetzt aufeinmal passiert

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.