PIN - Abfrage ATMega2561

Gast #2124048
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
Gast #2124404
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
Gast #2124586
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren