ATmega2560 if(PINE7==1)

Gast #474682
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
Gast #474689
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.
Gast #474690
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.
#474697
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.
Gast #474702
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?!-)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.