Habe gerade ein kleines Programm für Atmega8 in C fertig und bin nun am testen. Leider ist gleich ein Problem aufgetretten. Habe einen PIN als Eingang definiert. PIN B0 low=>springe in den if Abschnit des Programms, PIN B0 high=>springe in den else ABschnit. so hab ich mir das gedacht. Jedoch springt das Programm immer nur in den if-Teil, egal was am Eingang anliegt.. Folgender Code: void main (void) { DDRB &=~(1<<DDB0); while(1) //Endlosschleife für Ausgabe der ADC-Werte { if(~(PINB & (1<<PINB0)) ) { lcd_clear(); set_cursor(x,y); lcd_string("Port-off"); _delay_ms(1500); if(x<=10) x+=2; else x=1-y; if(y==1) y++; else y--; } else {...} } Wahrscheinlich ist nur eine kleinigkeit falsch aber ich komm gerade nciht drauf was das Problem ist.
Einrücken, Posten mit [c] tags, vollständigen, compilierbaren Code posten, der das Verhalten zeigt, beschreiben, wie Du das inkriminierte Verhalten feststellst (Messmittel ?). Kleiner Tip vorab: Entprellung?
Gast1286 schrieb:
> ~(PINB & (1<<PINB0)
PINB ist ein Byte, welches die 8 Portsignale repräsentieren, OK
PINB0 ist einfach nur ein Makro, was durch "0" (ohne Anführungszeiche)
ersetzt wird.
"1<<PINB0" bedeutet "1<<0", und das bedeutet "1".
Also "PINB & 1".
"~" invertiert immer ein ganzes Byte.
Ist PINB0 LOW, so steht da in Binärschreibweise 0b11111111.
Die If-Bedingung (ungleich 0) ist erfüllt und der Block wird ausgeführt.
Ist PINB0 HIGH, so steht da in Binärschreibweise 0x11111110.
Die If-Bedingung (ungleich 0) ist erfüllt und der Block wird ausgeführt.
Noch ein Tip "not" wird als "!" geschrieben.
Oder man prüft direkt auf einen Wert.
Hi >Noch ein Tip "not" wird als "!" geschrieben. >Oder man prüft direkt auf einen Wert. ! Logical Not ~ Bitwise Not also ist '~' richtig. MfG Spess
In diesem Fall nicht ;) Du prüfst ob der Eingang 1 ist (BITWEISES UND) und willst etwas tun wenn er es nicht ist (LOGISCHES NICHT). Gruß, Christian
Hi >Du prüfst ob der Eingang 1 ist (BITWEISES UND) und willst etwas tun wenn >er es nicht ist (LOGISCHES NICHT). '~' wird in dem Programmausschnitt zwei mal benutzt. Für die if-Anweisung hast du natürlich recht. MfG Spess
>"1<<PINB0" bedeutet "1<<0", und das bedeutet "1". >Also "PINB & 1". >"~" invertiert immer ein ganzes Byte. >Ist PINB0 LOW, so steht da in Binärschreibweise 0b11111111. >Die If-Bedingung (ungleich 0) ist erfüllt und der Block wird ausgeführt. >Ist PINB0 HIGH, so steht da in Binärschreibweise 0x11111110. >Die If-Bedingung (ungleich 0) ist erfüllt und der Block wird ausgeführt. OK, das leuchtet mir ein. aber wie kann ich dann auf ein einzelnes Bit prüfen. oder den Stand eines einzelnen Bits in eine Variable kopieren???
So, wie Du es schon gemacht hast, nur nicht mit "~", sonder mit "!". Also
1 | if (!(PINB & (1<<PINB0)) |
2 | {
|
3 | ...
|
4 | }
|
5 | else
|
6 | {
|
7 | ...
|
8 | }
|
Denn: (1<<PINB0) bedeutet 0b00000001 Ist PINB0 LOW, so ergibt (PINB & (1<<PINB0)) den Wert 0b00000000 = 0 Ist PINB0 HIGH, so ergibt (PINB & (1<<PINB0)) den Wert 0b00000001 = 1 Da du den IF-Block bei PINB0 LOW ausführen willst und ein IF ausgeführt wird, wenn die Bedingung zutrifft (also ungleich 0 ist), musst Du die Sache umkehren, also ein logisches NOT (das bedeutet "!") davor.
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.