Forum: Compiler & IDEs Ausgangs Port einlesen mit (PIND & (1<<PIN7))


von Anton A. (bingo_)


Lesenswert?

Hallo

Ausgabe: Mode 0 1
1
//  PORTD |=  (1<<PIN7);    //  einschalten
2
    PORTD &= ~(1 << PIN7);    //  ausschalten
3
4
    lcd_put_string(FONT_PROP_8, 0, "Mode ");
5
    lcd_put_long(  (PIND & (1<<PIN7))  );
6
    lcd_put_string(FONT_PROP_8, 0, " ");
7
    lcd_put_long(  (!(PIND & (1<<PIN7)))  );


Ausgabe: Mode 128 0
1
    PORTD |=  (1<<PIN7);    //  einschalten
2
//  PORTD &= ~(1 << PIN7);    //  ausschalten
3
4
    lcd_put_string(FONT_PROP_8, 0, "Mode ");
5
    lcd_put_long(  (PIND & (1<<PIN7))  );
6
    lcd_put_string(FONT_PROP_8, 0, " ");
7
    lcd_put_long(  (!(PIND & (1<<PIN7)))  );

Kann mir einer verraten warum wenn der Pin7 eingeschalten ist die 
Abfrage "(PIND & (1<<PIN7))" schief geht?

Eigentlich hatte ich immer 0 oder 1 erwartet...
128 scheint ein negativ overflow zu sein, blos warum???

von Hmm (Gast)


Lesenswert?

>Kann mir einer verraten warum wenn der Pin7 eingeschalten ist die
>Abfrage "(PIND & (1<<PIN7))" schief geht?

>Eigentlich hatte ich immer 0 oder 1 erwartet...

So? Warum? Hat Dir das ne böse Fee an der Ecke verkauft?

Pin7 hat den den Wert 7.
1 << PIN7 hat dann den Wert 128. (Uiii. Nachtigall, ick hör Dir 
trapsen.)

PIND hat, je nachdem ob Pin 7 gesetzt oder gelöscht ist, den Wert 128 
oder 0 plus irgendeinen Wert der von den unteren Bits bestimmt wird.

Das beides nun Und-verknüpft gibt: 128 oder 0.

OK.

So. Nun gibst Du das lcd_put_long als Parameter.

Zu was wird das? Dazu guck mal in Dein C-Buch unter integer Promotion.

von Hmm (Gast)


Lesenswert?

Achja: Was hat das oberste Bit von bestimmten Datentypen, sagen wir z.B. 
int für eine spezielle Bedeutung?

von klaus (Gast)


Lesenswert?

Hmm schrieb:
> Achja: Was hat das oberste Bit von bestimmten Datentypen, sagen wir z.B.
> int für eine spezielle Bedeutung?

aber du benutzt doch lcd_put_long, ist der datentyp nicht dann long und 
hat 16-bit ? dann ist der dezimalwert 128 doch gar nicht das oberste bit

von Walter S. (avatar)


Lesenswert?

Hmm schrieb:
> Achja: Was hat das oberste Bit von bestimmten Datentypen, sagen wir z.B.
> int für eine spezielle Bedeutung?

bei anderen als den bestimmten Datentypen hat es keine besondere 
Bedeutung,
so wie in diesem Fall, deshalb wird ja auch wie zu erwarten 128 
ausgegeben

von Anton A. (bingo_)


Lesenswert?

Danke für die Hilfe, das hat es natürlich erklärt...
Ich brauchte es für einen Zweipunktregler.
Ich habe einfach die Funktionierenden Abfragen verwendet und das ganze 
per #define gemacht.
1
#define Heizung_DDR   DDRD
2
#define Heizung_PORT  PORTD
3
#define Heizung_Pin  (1<<PIN7)
4
#define Heizung_PIN   PIND
5
#define Heizung_EIN()   Heizung_PORT |=  Heizung_Pin    // Heizung einschalten
6
#define Heizung_AUS()     Heizung_PORT &= ~Heizung_Pin    // Heizung ausschalten
7
#define Heizung_Mode_AUS  !(Heizung_PIN & Heizung_Pin)      // wenn wahr wird 1 zurück gegeben
8
9
// Zweipunktregler für die Wassertemperatur
10
if ((T_ist < T_soll) & Heizung_Mode_AUS)
11
   Heizung_EIN();
12
if((T_ist > T_soll) & (Heizung_Mode_AUS==0))
13
   Heizung_AUS();

von Karl H. (kbuchegg)


Lesenswert?

Anton Aus tirol schrieb:

>    .... Heizung_Mode_AUS==0

Gewöhn dir solche Abfragen, die letzten Endes auf irgendwelchen 
Bitwerten beruhen ganz schnell ab.

Wir vergleichen nicht mit 0 oder 1, sondern

Ist der Pin gesetzt:
1
   if( Pin_Ausdruck )

Ist der Pin nicht gesetzt:
1
   if( !Pin_Ausdruck )


mit derartigen Abfragen auf explizit 0 und ganz speziell auf explizit 1 
schiesst du dir ganz schnell sauber selbst ins Knie.

von Karl H. (kbuchegg)


Lesenswert?

1
// Zweipunktregler für die Wassertemperatur
2
if ((T_ist < T_soll) & Heizung_Mode_AUS)
3
   Heizung_EIN();

auch denke ich ehrlich gesagt nicht, dass du hier ein binäres Und haben 
willst. Ein logisches Und && würde eventuell sogar Sinn machen, wenn da 
nicht die Bezeichnung 'Heizung_Mode_AUS' wäre.
Da steht mehr oder weniger:
  Wenn die Temperatur zu niedrig ist UND die Heizung ausgeschaltet ist
     Dann schalte die Heizung ein.


Lass dir nochmal den Teil mit dem Heizung_Mode durch den Kopf gehen. Das 
ist nicht logisch. Heute magst du noch wissen, das das genau verkehrt 
rum ist. Aber in 2 Monaten weißt du es nicht mehr.


1
if((T_ist > T_soll) & (Heizung_Mode_AUS==0))
2
   Heizung_AUS();

Überleg dir nochmal, was dieses & (das eigentlich ein logisches Und && 
sein sollte) hier bedeutet?

AUsserdem: sicher, dass dich hier überhaupt interessiert ob die Heizung 
eingeschaltet ist? Denn: ausschalten darfst du eine Heizung doch immer. 
Egal, ob der Hauptschalter eingeschaltet ist oder nicht.

von Walter S. (avatar)


Lesenswert?

Karl Heinz Buchegger schrieb:
> if((T_ist > T_soll) & (Heizung_Mode_AUS==0))
>    Heizung_AUS();

vielleicht meinte er auch
if( (T_ist > T_soll) || (Heizung_Mode_AUS) )
    Heizung_AUS();

wäre zumindest sinnvoller

von Karl H. (kbuchegg)


Lesenswert?

Walter S. schrieb:
> Karl Heinz Buchegger schrieb:
>> if((T_ist > T_soll) & (Heizung_Mode_AUS==0))
>>    Heizung_AUS();
>
> vielleicht meinte er auch
> if( (T_ist > T_soll) || (Heizung_Mode_AUS) )
>     Heizung_AUS();
>
> wäre zumindest sinnvoller


Hab ich mir auch überlegt.
Es gibt jedoch auch noch eine 2.te Interpretation dieses Schalters: Egal 
was dein Tempertur-Sensor sagt - heize!

Man könnte diesen Schalter als den 'Frauen-Schalter' bezeichnen.

Was er mit diesem Schalter bezwecken will, weiß ich nicht. Der Einbau 
ist recht unlogisch. Angenommen das wäre der Heizungs-Hauptschalter, 
dann würde ich das sowieso so schreiben
1
  ...
2
3
    if( Heizung_Mode_AUS )        // Hauptschalter steht auf AUS
4
      Heizung_AUS();
5
6
    else                          // Hauptschalter: EIN
7
    {
8
      if( T_ist < T_soll - T_Hysterese )        // zu kalt?
9
        Heizung_EIN();
10
11
      else if( T_ist > T_soll + T_Hysterese )   // zu warm?
12
        Heizung_AUS();
13
    }
14
...
So finde ich das (in diesem Fall) viel leichter lesbar als mit diesen 
ganzen Verknüpfungen, die man erst mühsam auf die zugrundeliegende Logik 
analysieren muss.


Die T_Hysterese benötigt man, damit die Heizung bei Temperaturen am 
Umschaltpunkt nicht alle paar Sekunden/Minuten ständig ein/aus klappert. 
Eine Raumtemperatur im Wohnbereich kann ruhig im Bereich von 1 bis 2 
Grad schwanken, ohne dass das jemandem groß auffällt. Wenn sie bei unter 
16 Grad einschaltet und erst bei 18 wieder ausschaltet und dann die 
Temperatur wieder auf 16 Grad abfallen lässt, ehe sie das nächste mal 
einschaltet, dann ist das vertretbar.

von MaWin (Gast)


Lesenswert?

> Kann mir einer verraten warum wenn der Pin7 eingeschalten ist die
> Abfrage "(PIND & (1<<PIN7))" schief geht?

Wie ist denn PIN7 definiert ?

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.