Forum: Compiler & IDEs Wert PIN abfrage


von Oliver S. (eragon)


Lesenswert?

Also ich habe folgende frage. Wen ich den Wert eines Eingangs auslesen 
will mach ich das ja über das Register PINx.

Bin aber über etwas gestolpert:

Wen ich die Abfrage so schreibe dan funktioniert das.
if ((PINC&0x04)==0)


So leider nicht.
if ((PINC&0x04)==1)

Pullups sind eingeschaltet. Taster ligt an Eingang und ist and GND 
angeschlossen.
Wieso hat er mit ==1 ein Problem?

switch(PINC&0x04)
{
    case 0:
    LED_1_on;

    case 1:
    LED_1_off;
}

Funktioniert wiederum.

Also sind och beide Werte vorhanden. Was hab ich da bei der IF abfrage 
nicht gescheckt?

Da PINC&0x04 ==> 1 oder 0 ist

(1 oder 0) == 1

Das muss doch in einem Fall true sein.

Danke für eure Hilfe.
Seh grad vor lauter Bäumen den Wald nicht mehr.

von gast (Gast)


Lesenswert?

PINC&0x04 ergibt 0 und 4 und nicht 0 und 1 !!!
versuche mal das hier:
if ((PINC&0x04)==0x04)
...

von Sven H. (Gast)


Lesenswert?

gast hat es schon gesagt.

Anscheind hast Du die Operation an sich nicht verstanden.

& = bitweise und verknüpfung

Port c (z.b.) 00101100
      &
Maske 00000100


= 00000100 oder 0000000


In der Regel funktioniert auch folgendes:

if (PINC&0x04)
{

}


Da alles ungleich 0 wahr ist.

von Johannes M. (johnny-m)


Lesenswert?

Sven H. wrote:
> In der Regel funktioniert auch folgendes:
>
> if (PINC&0x04)
> {
>
> }
Nicht nur "in der Regel". Es sollte in solchen Fällen grundsätzlich die 
"erzwungene" Auswertung als Wahrheitswert benutzt werden. Erstens 
erspart das Schreib- und Nachdenkarbeit, zweitens ist damit auch 
gewährleistet, dass es keine Schwulitäten mit der integer promotion 
gibt.

von Hmm... (Gast)


Lesenswert?

> switch(PINC&0x04)
> {
>     case 0:
>     LED_1_on;
>
>     case 1:
>     LED_1_off;
> }

Kann mir nicht vorstellen, dass das so funktioniert. Mal abgesehen davon 
dass LED1_on/off hier keine Funktionen sondern Makros sind, sollte die 
LED mit diesem Code immer aus sein. Jeder case-Zweig muss mit einer 
'break'-Anweisung beendet werden, sonst rauscht dein Controller 
ungebremst in den nächsten Case-Zweig.

von Johannes M. (johnny-m)


Lesenswert?

Hmm... wrote:
> Kann mir nicht vorstellen, dass das so funktioniert.
Stimmt, das kann so nicht funktionieren.

von Oliver S. (eragon)


Lesenswert?

Also da hab ich was schönes angerichtet. Der Grund für meine frgae oben 
war: Ha ca. 1 jahr nix mehr programmiert. Und dan wollte das irgendwie 
nicht. Ihr habt natürlich recht. Switch-case ist schrott so.

Nun hab ich das Problem auch gefunden. Hab da aber noch ne frage: Ich 
hab das mit schönen Macros programmiert. Wie macht ihr das?


// LED 1
#define LED_1_port      PORTC
#define LED_1_ddr      DDRC
#define LED_1_bit      0

// Taster 1
#define taster_1_port      PORTC
#define taster_1_pin      PINC
#define taster_1_ddr      DDRC
#define taster_1_bit      2


#define LED_1_on      LED_1_port  &= ~_BV(LED_1_bit)
#define LED_1_off      LED_1_port  |=  _BV(LED_1_bit)


#define taster_1_get    (taster_1_pin   &   _BV(taster_1_bit))

Mit meiner Tasterabfrage erhalte ich einfach 0 oder 1,2,4,8,16.

Solange man das weis. Wusst ich leider nicht mehr. :)

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.