Bitoperator?!

Gast #2669154
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.
Gast #2669156
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
Gast #2670249
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
}
#2670253
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.
#2670254
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.
Gast #2670264
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.
Gast #2670267
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.
Gast #2670378
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.
Gast #2670737
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.
#2670742
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
Gast #2670761
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren