Bitoperator?!

Gast #2669154
"<<" 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
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
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
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
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
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
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 #2670283
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.
Gast #2670378
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
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
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
> 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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.