Hallo, ich habe an PORTA einen 8-Pol Dip-Schalter (gegen GND mit aktivierten Pull-Ups) und an PORTB LED´s. DDRA=0x00; //Eingang DIP-Schalter PORTA = 0xFF; //Pull-Ups ziehen DDRF=0x00; //Eingang AD-Konverter DDRB=0xFF; //LED Test; lowactivce PORTB = 0x00; //LED AN Nachmessen mit dem Multimeter ergibt 5 Volt am Eingang, wenn ich den Schalter in OFF-Stellung bringe, 0V in ON-Stellung. ich versuche durch folgenden Code: int main() { while(1) { if (PINA & (1<<PA2)) //PA2=1 =OFF --> LED AUS PORTB |= 0xFF; //AUS if (!(PINA & (1<<PA2))) //Schalter ON --> LED AN PORTB |= 0x00; } die LEDS an und aus zu schalten. Allerdings kann ich die LEDs lediglich EINMAL ausschalten, nachdem sie nach der Initialisierung auf 'ON' standen. Wieso nicht AN/AUS/AN/AUS? Gruß Markus
Das "|" ist nur um EINZELNE Bits zu setzten wie "PORTB |= (1<<PB2);"? Wieso funktioniert dann "PORTB |= 0xFF;" für alle LED AN? Ob PORTB=0x00; funktioniert wird morgen getestet...
Markus schrieb: > Das "|" ist nur um EINZELNE Bits zu setzten Nö. Mittels | kannst du beliebig viele Bits setzen. Aber: Mit einem Oder kannst du sie nur SETZEN! Du musst sie aber LÖSCHEN, wenn du die einzelnen Bits wieder von 1 auf 0 zurück bringen willst. Und das geht nun mal nicht mit einem Oder.
Okay, danke für die Wiederholung der Grundlektionen... Jetzt ist mir das mit der ganzen Schreibweise auch einleuchtend geworden... aus PORTB |= 0x00; wird ja PORTB = PORTB OR 0b00000000; und da PORTB entweder 0xFF oder 0x00 war ändert sich durch ein 'oder' das Endergebnis von PORTB nicht. Das mit dem 'und' und 'invertierend' ist mir auch klar geworden nach ein paar Beispielrechnungen. Auf den ersten Blick wirkt das jedoch alles wahllos zusammengewürfelt. Also kann man auf diese Arten Ports löschen: PORTB = 0x00; PORTB &= 0x00; //=alle Bits null, egal ob Bits von PORTB vorher 0 oder 1 waren PORTB &= ~((1<<PB0) | (1<<PB1) ... (1<<PB7)); //das gleiche wie eine Zeile drüber, nur dass Bits von PORTB erst mit 1 beschrieben werden, und dann invertiert werden zu 0.... und in verkürzter schreibweise PORTB &= ~0xFF; //~0b11111111
nebenbei gesagt verstehe ich nicht, warum du deine Abfragen nicht in eine if-else packst...das sind doch zwei Zustände die einander ausschließen...!
>PORTB &= ~((1<<PB0) | (1<<PB1) ... (1<<PB7)); //das gleiche wie eine >Zeile drüber, nur dass Bits von PORTB erst mit 1 beschrieben werden, und >dann invertiert werden zu 0.... Nicht ganz. Die Invertierung findet vor dem Schreiben statt. Und zwar beim COmpilieren.
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.