Hey, kurze, wohl auch simple Frage if (!(PINA & (1<<PA0))) { irgendwas } was genau passiert in der if-Abfrage? Ich steig nicht dahinter. Vielen Dank :)
"<<" 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.
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
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 }
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.
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.
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.
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.
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.
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.
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.
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.