Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage zu PINC+Taster


von Azubi (Gast)


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?

von Karl H. (kbuchegg)


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.

von Azubi (Gast)


Lesenswert?

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


Danke das hat sehr weitergeholfen

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.