Verständnisfrage zu PINC+Taster

Gast #3007275
Lesenswert?
• ▲
▼
Hallo

Ich habe eine Verständnisfrage und zwar habe ich folgenden Code 
geschrieben:

 #include <avr/io.h>


 int main(void)
 {
   DDRD|= (1<<PD0);
   PORTC|=(1<<PC0);    //Aktivierung des Pull-up
   PORTD=0xFF;      //Alles LEDS aussschalten

   while(1)
   {
     if (!(PINC&(1<<PC0)))
     {

      PORTD&= ~((1<<PD0));    //LED ein;

     }
  }


}

Der Taster an PC0 wird gerdrückt und die LED an PD0 leuchtet das klappt 
auch.Ich verstehe aber nicht wieso, deswegen erkläre ich mal kurz wie 
ich das alles verstanden habe:

PINC= ist binär 0b'0000 0000' wird eine Taste gedrückt wird aus
PINC= 0b'0000 0001' setze ich dieses in meine if-anweisung

if(!(PINC&(1<<PC0)))--> if(!(0b'0000 0001'&(0b'0000 0001')))

0b0000 0001 & 0b0000 0001 = 0000 0001 dann wird das ganze negiert durch 
!

und ich erhalte 1111 1110??? Wieso leuchtet die LED trotzdem ich hätte 
erwartet das sie nur bei 0b'1111 1111' leuchtet. Kann mir einer das 
genau erklären damit ich es in den Kopf krieg?
#3007287
Lesenswert?
• ▲
▼
Azubi schrieb:

> PINC= ist binär 0b'0000 0000'

eher nicht.
Tasten werden so angeschlossen, dass sie ein 1 Bit liefern, wenn sie 
nicht gedrückt sind und den Portpin auf 0 ziehen, wenn sie gedrückt 
sind.

> if(!(PINC&(1<<PC0)))--> if(!(0b'0000 0001'&(0b'0000 0001')))
>
> 0b0000 0001 & 0b0000 0001 = 0000 0001 dann wird das ganze negiert durch
> !

Nicht ganz.
Bits negieren wäre ~

! ist aber die logische Nagation

 Aus 0 mach 1
 Aus allem ungelich 0 mach 0

denn
0 ist logisch falsch
alles ungelich 0 ist logisch wahr.

> und ich erhalte 1111 1110??? Wieso leuchtet die LED trotzdem ich hätte
> erwartet das sie nur bei 0b'1111 1111' leuchtet.

Das wiederrum wäre egal.
Denn sowohl 1111 1110 als auch 1111 1111 sind ungleich 0 und somit für 
die if-Abfrage gleichermassen mit 'wahr' zu bewerten.

Also:
neue Ausgangssituation:
   der Pin ist auf 1 wenn die Taste NICHT gedrückt ist
und von dieser Ausgangssituation alles nochmal neu durchgehen.

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.