Forum: Compiler & IDEs PIN - Abfrage ATMega2561


von Markus (Gast)


Lesenswert?

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

von Bitty (Gast)


Lesenswert?

Denk mal hierüber nach:
PORTB |= 0x00;

von Markus (Gast)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

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

von Bitty (Gast)


Lesenswert?

ODER vielleicht doch?

von Bitty (Gast)


Lesenswert?

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...!

von Matthias L. (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.