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
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.
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:
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.
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:
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.
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.
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.
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.
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?
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.
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