Forum: Mikrocontroller und Digitale Elektronik bit_is_clear bit_is_set


von Peter A. (Gast)


Lesenswert?

Hallo Leute,
ich bin neu hier und auch neu in C. Ich beginne derzeit schulisch einen 
µC zu programmieren und habe eine verständnissfrage:

bit_is_clear <- schaltet laut unserem lehrer eine led an
und bit_is_set die led aus.

(gemäß dem fall, dass bit_is_clear und bit_is_set für einen taster 
benutzt werden, also einn eingang)

wie kann ich mir denn erklären, warum clear etwas "ein"schaltet und set 
(setze) etwas ausschaltet?

lieben gruß Pete

von Michael H. (michael_h45)


Lesenswert?

Peter A. schrieb:
> wie kann ich mir denn erklären, warum clear etwas "ein"schaltet und set
> (setze) etwas ausschaltet?
Gar nicht.

Was sollen denn bit_is_clear und bit_is_set sein? Funktionsrümpfe? 
Makros?
Es sind jedenfalls keine C-Conditionals, sondern irgendetwas 
selbstgeschriebenes.

Und erst, wenn du das herzeigst, kann man dir erklären, was es ist.

von TestX .. (xaos)


Lesenswert?

wenn es um AVRs und AVR-GCC geht machen die beiden funktionen etwas GANZ 
anderes, die geben 1 zurück wenn die bedingung erfüllt ist aber sie 
setzen NICHTS dh schalten keine ausgänge !!

hier gibts die doku dazu (avr gcc)
http://www.nongnu.org/avr-libc/user-manual/group__avr__sfr.html

von Oliver J. (skriptkiddy)


Lesenswert?

Peter A. schrieb:
> bit_is_clear <- schaltet laut unserem lehrer eine led an
> und bit_is_set die led aus.

Da hast du sicher was falsch verstanden.

Das sind Makros zum Testen, ob in einem 8-Bit-Wort ein Bit gesetzt ist 
der nicht. Also allenfalls zum Prüfen ob eine Taste gedrückt wurde oder 
nicht. Allerdings nur auf Special Function Register (SFR) anwendbar. Das 
heißt auf sowas wie DDRD oder PORTD. Diese Makros sind aber nicht 
C-spezifisch und existieren soweit ich weiß in der avr-libc.

Für setzen und löschen gibt es afaik keine Makros in der avr-libc. Da 
müsste man sich selber was schreiben:
1
#define set_bit(byte, bit) byte = byte |  (1 << bit)
2
#define clr_bit(byte, bit) byte = byte & ~(1 << bit)

Gruß Oliver

von Peter A. (Gast)


Lesenswert?

hier mal der quelltext aus unserem schulscript:
1
#include <avr/io.h>
2
void main( void ) 
3
{ 
4
5
DDRC  = 0b00000000; // Datenrichtung C2 auf EINGANG
6
PORTC = 0b00000100; // internen Pull-Up-Widerstand an C2
7
8
DDRB  = 0b00000001; // Port B, Pin 0 als AUSGANG definieren
9
PORTB = 0b00000000; // Port B, Pin 0 auf LOW (0 V) setzen, LED aus
10
11
   while ( 1 ) 
12
   {
13
      if ( bit_is_clear ( PINC,2 ) ) 
14
         { 
15
            PORTB = 0b00000001;                    // LED an
16
         }
17
18
      if ( bit_is_set ( PINC,2 ) ) 
19
         {
20
            PORTB = 0b00000000;                    // LED aus
21
         }
22
   }
23
}

ich wollte halt verstehen, warum bei clear (lösche) etwas auf AN geht 
und bei set (setze) auf aus.
ich habe da ein kleines verständnisproblem.

von Michael H. (michael_h45)


Lesenswert?

Peter A. schrieb:
> ich wollte halt verstehen, warum bei clear (lösche) etwas auf AN geht
> und bei set (setze) auf aus.
Tut es da noch nicht.
1
>    while ( 1 )
while heißt während. In Klammern steht die Bedingung für das "während".
1 ist z.B. immer wahr, 0 ist z.B. immer nicht-wahr.
while ( 1 ) heißt also "für immer".
1
>    {
2
>       if ( bit_is_clear ( PINC,2 ) )
if heißt falls. In Klammern wieder die Bedingung. Falls bit 2 in PINC 
nicht gesetzt (also clear) ist...
1
>          {
2
>             PORTB = 0b00000001;                    // LED an
... führ diesen Anweisungsblock aus. Dieser Block erst setzt in PORTB 
bit 0 an und alle anderen aus.

von J.-u. G. (juwe)


Lesenswert?

Peter A. schrieb:
> ich habe da ein kleines verständnisproblem.

Um das zu verstehen werden keinerlei Programmierkenntisse benötigt. 
Einfach vom Englichen ins Deutsche übersetzen:
1
falls ( Bit_ist_geloescht(PINC,2) )
2
  {
3
    PORTB = 0b00000001;                    // LED an
4
  }
5
falls ( Bit_ist_gesetzt ( PINC,2 ) ) 
6
  {
7
    PORTB = 0b00000000;                    // LED aus
8
  }

von amateur (Gast)


Lesenswert?

Hallo Peter,

an deinen C-Kenntnissen musst Du wohl noch ein bisschen feilen.

Die Sequenz, in einer Endlosschleife hat, in Worten ausgedrückt die 
folgende Funktion:

Ist das Bit gelöscht?
So schalte es ein.

Ist das Bit eingeschaltet?
So schalte es aus.

>if ( bit_is_clear ( PINC,2 ) )
Ist eine Abfrage und keine Funktion.

>PORTB = 0b00000001;
Enthält die Funktionalität.

In der Praxis wird diese Schleife allerdings nicht richtig 
funktionieren, denn am Ende ist das Bit immer zurückgesetzt. Der Ausgang 
wird also mit maximaler Geschwindigkeit ein und wieder ausgeschaltet. 
Das ist wahrscheinlich nur mit einem Oszilloskop zu sehen oder als LED 
die ein bisschen leuchtet.

von Thomas E. (thomase)


Lesenswert?

Michael H. schrieb:
> Was sollen denn bit_is_clear und bit_is_set sein?
Oliver J. schrieb:
> Für setzen und löschen gibt es afaik keine Makros in der avr-libc.
Das sind Makros aus der avr/sfr_defs.h, die mit der avr/io.h included 
wird.

Peter A. schrieb:
> ich wollte halt verstehen, warum bei clear (lösche) etwas auf AN geht
> und bei set (setze) auf aus.
The bit is clear. Zu deutsch: Das Bit ist gelöscht.
The bit is set. Von to set, set, set. Das Bit ist gesetzt.
Das mal zum Sprachverständnis.

Warum ist das Bit Clear und die Lampe geht an?
Weil das so programmiert ist. Und warum so?
Weil der Eingang, wie 98,97342% aller Tastereingänge Active Low ist.
D.h. wenn der Taster gedrückt wird, liest der Controller eine 0, also 
Clear.
Warum ist das so? Man legt einen Pullup-Widerstand auf den Portpin, der 
ist heutzutage normalerweise eingebaut. Früher war das nicht immer so, 
da musste man den aussen anlöten. Dann kommt vom Taster ein Anschluss 
auf GND und der andere an den Port. Bei Taster offen liest der 
Controller 1, bei geschlossen 0.

mfg.

von Michael H. (michael_h45)


Lesenswert?

amateur schrieb:
> Ist das Bit gelöscht?
> So schalte es ein.
>
> Ist das Bit eingeschaltet?
> So schalte es aus.
aber nein!
du kannst nicht einfach "es" schreiben, sonst bezieht sich das auf das 
bit von der zeile davor.
und das wäre doch käse, oder?

bitte keine wischi-waschi antworten an einen anfänger.

von Michael H. (michael_h45)


Lesenswert?

Thomas Eckmann schrieb:
> Das sind Makros aus der avr/sfr_defs.h, die mit der avr/io.h included
> wird.
kenne ich... aber es war ja nicht klar, dass es hier um AVRs geht. ist 
für schulen auch eher ungewöhnlich.

von Michael H. (michael_h45)


Lesenswert?

amateur schrieb:
> In der Praxis wird diese Schleife allerdings nicht richtig
> funktionieren,
eine schleife kennt kein "nicht richtig funktionieren"...

> denn am Ende ist das Bit immer zurückgesetzt. Der Ausgang
> wird also mit maximaler Geschwindigkeit ein und wieder ausgeschaltet.
> Das ist wahrscheinlich nur mit einem Oszilloskop zu sehen oder als LED
> die ein bisschen leuchtet.
einfach nur komplett falsch...
wem soll so etwas helfen?

von Peter A. (Gast)


Lesenswert?

@Thomas Eckmann danke für deine Erklärung,
am Ende hat´s dann gefunkt!

Ich habe im AVRGCC Tut zum Thema Pullup nachgelesen.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Interne_Pull-Up_Widerst.C3.A4nde

und verstanden was du meintest!

danke dafür!

von Thomas E. (thomase)


Lesenswert?

Michael H. schrieb:
> kenne ich... aber es war ja nicht klar, dass es hier um AVRs geht. ist
> für schulen auch eher ungewöhnlich.
Das ist richtig. Eigentlich erwartet man da eher 8051.
Mir wurde aber um 21:43h ein Vorteil verschafft: #include <avr/io.h>

mfg.

von Reinhard Kern (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Das ist richtig. Eigentlich erwartet man da eher 8051.

Das ist pädagogisch gesehen völlig richtig. Aber irgendwann werden die 
Schüler aufmüpfig, wenn sie meinen, sie würden mit der Steinzeit 
abgespeist, wo sie doch so geile Multicore-Prozessoren in ihrem 
Smartphone haben. In Kürze wird auch jeder als vertrottelt gelten, der 
seine Finger auf eine Taste legt statt auf einen Touchscreen.

Gruss Reinhard

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter A. schrieb:
> bit_is_clear
Das ist mal ein blöder Funktionsname...  :-o

Thomas Eckmann schrieb:
> The bit is clear. Zu deutsch: Das Bit ist gelöscht.
Das heißt übersetzt: Das Bit ist klar (alternativ sauber, rein, usw.)
http://translate.google.de/#en/de/The%20bit%20is%20clear

Aber "Das Bit ist gelöscht" heißt auf englisch: The bit is cleared
http://translate.google.de/#en/de/The%20bit%20is%20cleared

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.