Forum: Mikrocontroller und Digitale Elektronik Einzelnen Portpin lesen


von Marcel (Gast)


Lesenswert?

Hallo,

ich würde gerne lesen was an einem einzelenen Portpin für ein Signal 
anliegt.
Ich würde es gerne über ein
1
#define
 machen. Zuerst dachte ich ich könnte
1
#define MEINPORTPIN    PINK2
 sagen. Das geht aber nicht. Hat jemand eine elegante lösung für mich. 
Wie mache ich das?
1
//ATmega2560
2
#define MEINPORTPIN   ((PINK & 0x04)>>2)
3
4
5
void main(void)
6
{
7
 DDRK&=0xFB;PORTK&=0xFB   // Port K, Bit 2 -> INPUT, TRISTATE
8
9
10
 while(1)
11
 {
12
  if (MEINPORTPIN == 1)
13
  {
14
    //mache das
15
  }
16
  else if (MEINPORTPIN == 0)
17
  {
18
    //mache das
19
  }
20
}

Grüße

von Marcel (Gast)


Lesenswert?

Das hier:

#define MEINPORTPIN   ((PINK & 0x04)>>2)

funktioniert. Geht es aber auch übersichtlicher. Würde gerne mit PINK2 
also arbeiten. PINK2 ist einfach die Konstante 2, deshalb lag ich mit 
meinem ersten Gadanke falsch, richtig?

von Thomas E. (thomase)


Lesenswert?

1
#define MEINPIN (!!(PINK & (1 << PINK2)))

Ja, PINK2 ist eine Konstante mit dem Wert 2.

Das "!!" sorgt dafür, daß der gelesene Wert vom PIN_Register, wenn PINK2 
High ist, 1 beträgt. Ist aber in den meisten Fällen unnötig, da man 
üblicherweise nicht so
1
if(MEINPIN == 1)
2
{
3
}
4
else if(MEINPIN == 0)
5
{
6
}

sondern so
1
if(MEINPIN)
2
{
3
}
4
else
5
{
6
}

abfragt.

Dann ist egal, wo es steht. Die Abfrage lautet dann auf 0 oder !0.

: Bearbeitet durch User
von Marcel (Gast)


Lesenswert?

Stimmt, danke. Auf den ersten Blick würde ich sagen die zwei 
Ausrufezeichen bringen überhaut nichts. Doppelte Negation sozusagen. Ich 
mache es so und prüfe dann auf !0.

Danke

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Marcel schrieb:
> Auf den ersten Blick würde ich sagen die zwei Ausrufezeichen bringen
> überhaut nichts.

O doch, die bringen was.

Der Ausdruck

PINK & (1 << PINK2)

ist entweder 0 oder aber (1 << PINK2), d.h. nicht 1.

Um daraus eine 1 zu erhalten, ist die doppelte Negation nötig.

Sinnvoller ist es, nicht mit 1 zu vergleichen, sondern die in C übliche 
Wahrheitsdefinition zu verwenden - alles ist wahr, was nicht 0 ist.

Statt mit 1 zu vergleichen, testet man nur, ob es nicht 0 ist.

Und damit ist

if (PINK & (1 << PINK2))

ausreichend.

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.