If-Ausdruck bei Switch-Abfrage

Gast #3565471
Lesenswert?

Hallo, wieder einmal eine Einsteigerfrage.
Gegeben ist ein STK500 mit mega8, PortB mit LEDs verbunden, PortD mit 
Switches verbunden und folgender Codeausschnitt (nur der Inhalt der 
Main-Funktion):
1
....
2

3
DDRB = 0xFF;
4

5
PortD = 0xFF;
6
DDRD = 0x00;
7

8
while(1)
9
{
10
   PortB = 0x00;
11

12
   if (PinD0 == 1)           (A)
13
   if (PinD & (1<<PinD0))    (B)
14

15
      {
16
         _delay_ms(10);
17
      }
18
   else
19
      {
20
         _delay_ms(1000);
21
      }
22

23
   PortB = 0xFF;
24
   _delay_ms(500);
25
}
Wenn ich die IF-Anweisung (A) benutze, wird immer nur der Else-Zweig 
durchlaufen, egal ob der Taster gedrückt ist oder nicht.

Wenn ich die IF-Anweisung (B) benutze, wird bei nicht gedrücktem Taster 
der erste Zweig durchlaufen und bei gedrücktem Taster wird der 
Else-Zweig durchlaufen. 

Warum darf ich nicht den pin0 vom PortD direkt auf 1 (bzw. auch nicht 
auf 0) abfragen ?

Vielen Dank und viele Grüße 
Paul
Gast #3565488
Lesenswert?

Bastelopa schrieb:
> Wenn ich die IF-Anweisung (A) benutze, wird immer nur der Else-Zweig
> durchlaufen, egal ob der Taster gedrückt ist oder nicht.

Ist PinD0 das gleiche wie PIND0?

> Wenn ich die IF-Anweisung (B) benutze, wird bei nicht gedrücktem Taster
> der erste Zweig durchlaufen und bei gedrücktem Taster wird der
> Else-Zweig durchlaufen.
>
> Warum darf ich nicht den pin0 vom PortD direkt auf 1 (bzw. auch nicht
> auf 0) abfragen ?

Darfst du schon. PIND0 ist aber 0 (Im passenden I/O-Header steht ein 
#define PIND0 0 drin), daher ist natürlich das Ergebnis des Vergleichs 
mit 1 immer false, und du landest im else-Zweig.
Ich empfehle AVR-GCC-Tutorial: Zugriff auf IO-Ports
Gast #3565515
Lesenswert?

Hallo Rolf,

Danke für den Schubs in die richtige (Denk)Richtung. pinD0 ist ja nicht 
der Wert des Pins 0 des physikalischen Ports D ! Es ist ja nur ein 
Synonym/Ersetzung für den Wert 0.

seufz ja, C lernen dauert halt etwas ...

Vielen Dank für die hilfreiche und superschnelle Anwort

Grüße vom Bastelopa ;)

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