Forum: Mikrocontroller und Digitale Elektronik ATmega2560 if(PINE7==1)


von Greenhorn (Gast)


Lesenswert?

Hallo,

ich habe eine Frage zu nachfolgenden Source Code.

Ich versuche den PINE7 abzufragen , mit einer IF Schleife..

if(PINE7==1)
{
senden();
}
else
{
}


Doch leider klappte es nur wenn ich als Argument für if schreibe..

if(PINE & (1<<PINE7)
{
senden();
}
else
{
}


Kann mir jemand erklären warum? Danke

von johnny.m (Gast)


Lesenswert?

1.: Es gibt keine if-Schleife! if ist eine Abfrage und keine Schleife.
2.: Wenn Du mit WINAVR programmierst, dann ist PINE7 in der Headerdatei 
als Zahl 7 definiert. Und 7 ist nunmal nicht 1, weshalb die Bedingung 
nie wahr sein kann.
3.: Schau Dir im AVR-GCC-Tutorial mal das entsprechende Kapitel an. Da 
steht alles drin.

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

>IF Schleife..

Schleifen haben etwas wiederholendes... Es ist eine ABFRAGE!

>if(PINE7==1)
Das würde bei Codevision auch nicht unbdeingt gehe: Da wird die falsche 
Bezeichnung benutzt.

>Kann mir jemand erklären warum? Danke
Weil das beim AVR-GCC nun mal so ist?!

Der Compiler unterstützt keine Einzelbitbehandlung.

>if(PINE7==1)

Dürfte immer falsch sein. PINE7 ist eine Konstante (7), die von 1 
verschieden ist.

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

Mal wieder das Johnny.m-Voodoo-Püppchen rauskramt...

von Philipp S. (philipp)


Lesenswert?

PINE7 ist eine Konstante (nämlich 7).
PINE ist dagegen das Leseregister des Ports E.

Ob das siebente Bit dieses Ports gesetzt ist, erfährt man durch ein 
logisches ODER von PINE und dem auszulesenden Bit (binär 1000000). Eine 
andere Schreibweise dafür ist (1<<PINE7), also 00000001 sieben mal nach 
links verschoben. Achtung: das Ergebnis ist dann auch nicht 1, sondern 
128!

Auf den ersten Blick umständlich, aber man gewöhnt sich dran. Für viele 
Fälle ist es übersichtlicher, sich anwendungsbezogene Defines zu machen:

// Bit 7 an Port E ist die Taste 1
#define TASTE_1   (PINE & (1<<PORTE7))
...
if (TASTE_1)
...


Dann weiß man auch nächstes Jahr beim Lesen gleich, was los ist, ohne 
erst nachschlagen zu müssen.

Und man kann nach einem Redesign einfach das define anpassen, wenn Taste 
1 dann woanders hängt.

von johnny.m (Gast)


Lesenswert?

> Mal wieder das Johnny.m-Voodoo-Püppchen rauskramt...
...sich mal wieder vor Schmerzen windet... Aaaauuuu...

von fieser, klugscheissender Rahul (Gast)


Lesenswert?

>#define TASTE_1   (PINE & (1<<PORTE7))
>if (TASTE_1)...

Gilt ja eigentlich nur für +-schaltende Tasten. Die meisten werden aber 
gegen Masse geschaltet. Dann sollte man eher

#define TASTE_1   (!(PINE & (1<<PORTE7)))

schreiben...(Nur so als Ergänzung...na, Johnny, tut's schon weh?!-)

von Greenhorn (Gast)


Lesenswert?

ok, vielen dank für die schnelle Antwort

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.