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
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.
>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.
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.
> Mal wieder das Johnny.m-Voodoo-Püppchen rauskramt...
...sich mal wieder vor Schmerzen windet... Aaaauuuu...
>#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?!-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.