www.mikrocontroller.net

Forum: Compiler & IDEs sbi und cbi fkt. umschreiben


Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe einen etwas älteren C Code der mit dem Funktionen sbi und cbi
arbeitet.
Kann mir jemand sagen wie ich diesen Teil umschreiben muss, damit der
neue gcc das compilierne kann?
Hier ein Beispiel:

sbi(PORTD, PD3);
cbi(PORTD, PD2);

Danke vorab,
Adam

Autor: Quix01 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTD |= (1<<3)  // set bit 3
PORTD &= ~(1<<3) // clear bit 3

Ciao Thomas.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTD |= 1 << PD3;
PORTD &= ~(1 << PD3);

Autor: Quix01 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da waren wir gleichschnell und haben beide den Fehler drin, dass PD2
gelöscht werden soll grins

Ciao Thomas.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh yeah, aber ich denke, das wichtigste ist das Prinzip...

Autor: Quix01 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ johnny.m
seh ich genau so.

Ich hab meist folgendes Makro zum Bit-Löschen definiert, um mir die
Schreibarbeit bissel zu vereinfachen:
#define DEL(X)  &= ~(X)

Im Code:
  PORTD DEL(1<<PD2)

Ciao Thomas.

Autor: Quix01 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit Semikolon natürlich

  PORTD DEL(1<<PD2);


Die Hitze, stöhn...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann lieber gleich

#define SBI(REG, BIT) REG |= 1 << BIT
#define CBI(REG, BIT) REG &= ~(1 << BIT)
...
SBI(PORTD, PD3);
CBI(PORTD, PD2);

Gruß

Johnny

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okey, danke Jungs :)

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, das stimmt das Prinzip ist das Wichtigste...
Aber ich verstehe es nicht, vielleicht fehlen mir einfach die nötigen
Grunkenntnissse, könnt mir jemand vielleicht erklären warum

PORTD |= 1 << PD3;
PORTD &= ~(1 << PD3);

das mach was es macht?


Dankeschön Andre

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PD3  kommt von einem ordinären
#define PD3  3

überall wo also PD3 steht, ersetzt der Präprozessor
diesen Text 'PD3' mit '3'

damit wird   1 << PD3
zu           1 << 3

und das macht: nimm eine 1 und schieb diese 1 binär dreimal
nach links. Aus  0b00000001  wird also  0b00001000

A |= B
ist die Kurzform für   A = A | B

wobei | eine ODER Verknüpfung darstellt. Im Gegensatz zu
|| wird diese aber auf Bitebene durchgeführt, dh. die
gleichwertigen Bits der beiden Partner werden miteinander
ODER-Verknüpft.
Du weist schon:

    A    B   |   A | B
  -----------+---------
    0    0   |     0
    1    0   |     1
    0    1   |     1
    1    1   |     1

In dieser Tabelle ist im Ergebnis genau dann eine 1, wenn
entweder A ODER B ODER Beide 1 waren. Und genau das will
man hier.

Wenn ich

   PORTD = PORTD | 0b00001000;

mache, dann wird an die Bitposition 3 auf jeden Fall eine 1
gesetzt, gleichgültig was vorher in PORTD stand. (Die anderen
Bits bleiben so wie sie sind. Schau in die Tabelle: Wenn B 0
ist, dann ist das Ergebnis identisch mit dem Zustand von A)

---------------------------------

PORTD &= ~( 1 << PD3 );

~ macht eine binäre Negation. D.h. alle Bits werden umgedreht.
aus  0b00001000  wird also  0b11110111
A &= B ist wieder eine Kurzform. Diesmal für A = A & B

und das & steht für binäres UND

    A    B   |  A&B
   ----------+------
    0    0   |   0
    1    0   |   0
    0    1   |   0
    1    1   |   1

Das Ergebnis ist genau dann 1, wenn A UND B 1 waren.
Schau dir die Tabelle genauer an. In den Zeilen in
denen B 0 ist, ist das Ergebnis auf jeden Fall 0.
In den Zeilen in denen B einen Wert von 1 hat, ist
der Ergebnis identisch mit dem Zustand von A.

Jetzt sollte schon klar sein, was

   PORTD = PORTD & 0b11110111

macht. Überall dort wo in der Maske 0b11110111 eine 1
steht, ist das Ergebnis identisch mit PORTD an dieser
Bitposition. Überall dort wo in der Maske eine 0 steht,
wird das betreffende Bit im Ergebnis auf jeden Fall auf
0 gesetzt.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz:
Wann kommt eigentlich Dein Buch raus??? Hast Du irgendwo ne Datenbank,
in der für jede Frage so ne schön erklärte Antwort steht? Und dann
immer diese schönen Beispiele aus dem täglichen Leben...

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz
Super, danke für die wirklich gut verständliche Erklärung und die Mühe
die du dir gemacht hast.

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.