Wert PIN abfrage

OP #1076441
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.
Gast #1076459
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.
#1076565
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.
Gast #1076864
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.
OP #1078893
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. :)

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