Forum: Mikrocontroller und Digitale Elektronik C-Biroperationen


von M. T. (cube7)


Lesenswert?

Hallo allesamt,
ich glaube C-Bitoperationen verstehe ich irgendwie falsch.

Dies steht im AVR-GCC Tutorial:
1
#include <avr/io.h>
2
...
3
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */
4
if ( PINC & (1<<PINC1) ) {
5
  /* Aktion */
6
}

Dabei verstehe ich unter PINC1, wenn ich von rechts nach links zähle 
folgenden Binärcode 00000010.
Mit der Maske PINC also 00000001 würde ich aber bei einer 
Linksverschiebung von PINC1 um eine Stelle keine wahre Aussage erhalten.

00000010 (PINC1)
00000001

um eins nach links verschoben

00000100
00000001
----------
00000000  ----> keine wahre Aussage

würde ich allerings von links nach rechts zählen (also parktisch 
falschrum für µC),würde ich folgendes erhalten, was für mich mehr Sinn 
macht*

01000000 (PINC1)
10000000

um eins nach links

10000000
10000000
---------
10000000  ------> wahre Aussage

Kann mir da vllt. jemand auf die Sprünge helfen? XD

von thorstendb (Gast)


Lesenswert?

1
if(PINC & 0x02) {
2
  ...
3
}

von Düsendieb (Gast)


Lesenswert?

if ( PINC & (1<<7) )  PORTD |= _BV(0)  ; else PORTD &=~_BV(0)


so geht es (Abfrage Bit 7)

von Verwirrter Anfänger (Gast)


Lesenswert?

PINC1 ist nicht 00000010 sondern 1 (00000001), und es wird nicht PINC1 
um 1 nach links verschoben, sondern 1 um PINC1 nach links:
1 << 1 = 00000010
bzw:
1
PINC0 = 0
2
PINC1 = 1
3
PINC2 = 2
4
PINC3 = 3
5
PINC4 = 4
6
PINC5 = 5
7
PINC6 = 6
8
PINC7 = 7
9
10
1 << PINC0 = 00000001
11
1 << PINC1 = 00000010
12
1 << PINC2 = 00000100
13
1 << PINC3 = 00001000
14
1 << PINC4 = 00010000
15
1 << PINC5 = 00100000
16
1 << PINC6 = 01000000
17
1 << PINC7 = 10000000

Das ändert nichts daran, das
1
if ( PINC & (1<<PINC1) )
falsch ist, wenn PINC 00000001 ist. Informatiker fangen bei 0 an zu 
zählen, deshalb ist das erste bit an der zweiten Stelle. Wenn PINC 
00000010 ist, ist die Bedingung war.

von Karl H. (kbuchegg)


Lesenswert?

M. T. schrieb:

> Dabei verstehe ich unter PINC1, wenn ich von rechts nach links zähle
> folgenden Binärcode 00000010.

Nein.
PINC1 ist einfach nur 1


    1 << PINC1

oder daher

    1 << 1


ist einfach nur eine binäre 1 (der linke Teil des Ausdrucks)

    00000001

und diese 1 wird um 1 Stelle (der rechte Teil, also das PINC1) nach 
links verschoben.

Aus
    00000001
wird so
    00000010

Wendet man diese Maske nun durch Verunden auf den Inhalt des PIN 
Regstiers an, welches zb diesen Inhalt haben möge

    10110010

&   00000010
   ----------

so wird durch die Maske jede Bitposition auf 0 gesetzt, in der in der 
Maske kein 1 Bit steht. De Facto bleibt daher aus dem PIN Register hier 
nur das eine Bit an der Bitposition 1 (daher ja auch PINC1) übrig. Alle 
anderen Bits sind gezielt auf 0.

Hier ist das Ergebnis dann

   00000010

weil in PIN an besagter Bitposition ebenfalls eine 1 war.

von cst (Gast)


Lesenswert?

Ist genau falschrum Interpretiert, die Maske baust du dir mit 
(1<<PINC1), PINC selbst besteht aus dem was an PortC anliegt.
Also wenn z.B. High an Pin3 und Pin1 anliegt wäre PINC = 00001010.

von M. T. (cube7)


Lesenswert?

Ahh, Leute ihr seid super, ich glaub ich habs begriffen.
Aber wieso schreibt man anstatt PINC1 nicht gleich 1?

Greetz,
M.

von Karl H. (kbuchegg)


Lesenswert?

M. T. schrieb:
> Ahh, Leute ihr seid super, ich glaub ich habs begriffen.
> Aber wieso schreibt man anstatt PINC1 nicht gleich 1?

Weil man auch sinnvollerweise nicht PINC1 schreibt, sondern sich selbst 
einen projektbezogenen Begriff dafür wählt.

Aber im Grunde hast du Recht. PINC1 ist keine so glückliche Bezeichnung 
gewesen. BIT1 wäre besser gewesen. PINC1 suggeriert, dass da irgendwas 
spezielles dahintersteckt, das etwas mit dem PORT C zu tun hat. Dem ist 
nicht so. Zwischen PINC1, PC1, PB1, PINB1, ... gibt es keinen 
Unterschied. Sind allesamt nur andere Schreibweisen für 1


1
#define UP_TASTER    PINC1
2
#define TASTER_REG   PINC
3
4
5
  if( TASTER_REG & ( 1 << UP_TASTER ) )
6
    ...
so macht man das projektbezogen. Dann kann man in der Abfrage nämlich 
schön ersehen, was denn hier eigentlich abgefragt werden soll

* man muss sich die realen Pin Nummern nicht merken
* wenn der Taster an einen andernen Pin umgelötet wird, muss man nur
  an einer Stelle im Code (beim #define) den neuen Pin eintragen

von Achim M. (minifloat)


Lesenswert?

M. T. schrieb:
> C-Biroperationen

Bieroperation mit Bier C: Ich trinke das Dritte Bier(oder Hexadezimal 
mein 12tes) :P

mfg mf

PS:
Karl heinz Buchegger schrieb:
> PINC1 ist keine so glückliche Bezeichnung
> gewesen. BIT1 wäre besser gewesen.

PIN0 - PIN7 sind aber immer vorhanden/definiert, so dass ich z.B. 
Schreiben
kann:
DDRB = (1<<PIN4)|(1<<PIN3)|(1<<PIN0);

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.