Einzelnen Portpin lesen

Gast #5008850
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
Gast #5008859
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?
#5008866
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.
Persönliche Seite #5008931
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.

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