mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Biroperationen


Autor: M. T. (cube7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allesamt,
ich glaube C-Bitoperationen verstehe ich irgendwie falsch.

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

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

Autor: thorstendb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if(PINC & 0x02) {
  ...
}

Autor: Düsendieb (Gast)
Datum:

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


so geht es (Abfrage Bit 7)

Autor: Verwirrter Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
PINC0 = 0
PINC1 = 1
PINC2 = 2
PINC3 = 3
PINC4 = 4
PINC5 = 5
PINC6 = 6
PINC7 = 7

1 << PINC0 = 00000001
1 << PINC1 = 00000010
1 << PINC2 = 00000100
1 << PINC3 = 00001000
1 << PINC4 = 00010000
1 << PINC5 = 00100000
1 << PINC6 = 01000000
1 << PINC7 = 10000000

Das ändert nichts daran, das
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: cst (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M. T. (cube7)
Datum:

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

Greetz,
M.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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


#define UP_TASTER    PINC1
#define TASTER_REG   PINC


  if( TASTER_REG & ( 1 << UP_TASTER ) )
    ...
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

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht 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);

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.