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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.