Forum: Mikrocontroller und Digitale Elektronik If-Ausdruck bei Switch-Abfrage


von Bastelopa (Gast)


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

: Bearbeitet durch User
von Rolf Magnus (Gast)


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

von Bastelopa (Gast)


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 ;)

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.