Ich habe bis jetzt in MikroE geschrieben. Da war die Zuweisung ein klein
wenig anders. Ich lese mich auch wenig durch - jedoch stellen sich mir
natürlich einige Fragen, zum Beispiel folgende. Bis jetzt habe ich meine
Portzuweisungen immer Bitweise gemacht, ich könnte dies in AVR Studio
auch so beibehalten, aber möchte natürlich auch andere kennenlernen.
Deshalb frage ich mich was folgende Operatoren genau bedeuten und was
sie machen:
|= , $= und dann die ~ vor den Bitweise Operationen (also z.b. ~(1<<PB1) )
Mein Beispiel gerade:
1
// Port Settings (Input)
2
DDRB&=~(1<<PB0)|~(1<<PB1)|~(1<<PB2);// Set Input PB0,PB1,PB2
Draco schrieb:> Deshalb frage ich mich was folgende Operatoren genau bedeuten und was> sie machen:> |= , $= und dann die ~ vor den Bitweise Operationen (also z.b. ~(1<<PB1) )
Im Ernst: lies ein C-Buch. Irgendeines.
Alternativ sieh dort nach:
https://de.wikibooks.org/wiki/C-Programmierung:_Ausdrücke_und_Operatoren
Kleinigkeit am Rande: einen $= Operator gibt es nicht...
So ich hab zu dem Thema wieder mal eine Frage: :D
Ich habe ein selbsterstelltes Byte im EEProm in welchen ich Nutzerdaten
ablege. Dies sieht z.b. so aus:
0b10101000
nun möchte ich nur Bit 5,4 und 3 daraus extrahieren - da gehe ich wie
folgt vor:
1
uint8_teePromVar=0b10101000;//Nur als Beispiel, wird sonst aus EEProm gelesen
2
uint8_teeCalcVar=0xff;
3
4
eeCalcVar=eePromVar&0b11000111;// Löscht die unnötigen Bits Ergebnis: 0b00101000
somit habe ich schonmal die unnötigen Bits die ich zur
weiterverarbeitung nicht benötige gelöscht. Nun möchte ich aber den
Ihnhalt komplett nach rechts schieben das ich am Ende von 0b00101000 auf
0b00000101 komme - quasi drei Stellen nach rechts schiebe den ganzen
Byte - ich finde aber nur Infos wie man einen Bit schiebt. Kann mir da
jemand auf die Sprünge helfen?!
Ich meine ich kann meine weiteren Rechnungen auch mit der DEC 40 statt
der DEC 5 weitermachen, das spielt ja auf einem 8-Biter keine Rolle und
spart auch noch den einen Takt zum schieben und Flash, aber es würde
mich halt dennoch interessieren wenn ich einmal vor dem Problem stehe.
> Ich habe ein selbsterstelltes Byte im EEProm
Ich stell mir gerade einen Steinmetz vor, der ein Byte in Stein meißelt
:-)
> eeCalcVar = eePromVar & 0b11000111 // Löscht die unnötigen Bits> Ergebnis: 0b00101000
Das ist falsch, es muss so heissen:
eeCalcVar = eePromVar & 0b00111000
Nach rechts schieben geht so:
eeCalcVar = eeCalcVar >> 3;
Stefan U. schrieb:>> eeCalcVar = eePromVar & 0b11000111 // Löscht die unnötigen Bits>> Ergebnis: 0b00101000>> Das ist falsch, es muss so heissen:>> eeCalcVar = eePromVar & 0b00111000>> Nach rechts schieben geht so:>> eeCalcVar = eeCalcVar >> 3;
Dann ist aber das Beispiel hier im AVR Tutorial auch falsch :D
"...Ist PORTB vorher z. B. 0b01111111, dann ist der Inhalt nach der
Operation 0b01111111 and 0b11111010 = 0b01111010, die gewünschten Bits 0
und 2 sind somit gelöscht...."
https://www.mikrocontroller.net/articles/Bitmanipulation
@Ingo
Danke für das Beispiel... ja die Schiebeoperatoren kenn ich ja schon,
aber ich wusste nicht ob man halt eine kompletten Inhalt schieben kann
oder nur ein Bit :) Ja ich werde wohl mal auf die Suche gehen müssen,
gibt es da ein Standardwerk was man empfehlen kann?!
Das Beispiel stimmt schon.
0b10101010
und 0b11110000
= 0b10100000
Eine 1 kommt nur an der Stelle raus wo erstes UND zweites Byte eine 1
haben.
Viele Grüße Michael
Deine Deutschkenntnisse scheinen unzureichend zu sein. Der von Dir
zitierte Satz ist völlig richtig.
> die gewünschten Bits 0 und 2 sind somit gelöscht
Gewünscht ist hier, die Bits 0 und 2 zu ENTFERNEN.
Du benutzt das Wort "gewünscht" genau anders herum. Du wünscht, die Bits
5, 4 und 3 zu BEHALTEN.
> ich wusste nicht ob man halt eine kompletten Inhalt schieben> kann oder nur ein Bit
Nochmal: Lies ein C Buch.
Denn dann wüstest du, dass es in C überhaupt keine Befehle gibt, die
einzelne Bits ansprechen oder manipulieren.
Es geht immer mindestens um Bytes.
Die einzige Ausnahme dazu sind Bitfelder
(http://www.c-howto.de/tutorial-strukturierte-datentypen-bitfelder.html).
Die habe ich allerdings in realen Programmen noch nie zu Gesicht
bekommen.
Stefan U. schrieb:>> ich wusste nicht ob man halt eine kompletten Inhalt schieben>> kann oder nur ein Bit>> Nochmal: Lies ein C Buch.>> Denn dann wüstest du, dass es in C überhaupt keine Befehle gibt, die> einzelne Bits ansprechen oder manipulieren.
In diesem Fall würde sogar ein bischen mitdenken reichen.
Welchen Sinn soll es haben ein einzelnes Bit zu schieben?
Ok. Hier ist ein Bit: 1
jetzt schieb es nach links oder nach rechts.
Was soll denn da jetzt der Sinn der Sache sein?
Stefan U. schrieb:> Nochmal: Lies ein C Buch.>>Draco schrieb:> Ja ich werde wohl mal auf die Suche gehen müssen,> gibt es da ein Standardwerk was man empfehlen kann?!
Stefan U. schrieb:> Deine Deutschkenntnisse scheinen unzureichend zu sein.
Deine aber auch:
> Gewünscht ist hier, die Bits 0 und 2 zu ENTFERNEN.
Man kann keine Bits entfernen. Würde man Bit 0 und 2 entfernen,
blieben von einem Byte nur noch Bit 1, 3, 4, 5, 6 und 7 übrig. Was soll
sowas darstellen!
Man kann sie auf 0 setzen, also löschen, oder auf 1 setzen.
> Du wünscht, die Bits 5, 4 und 3 zu BEHALTEN.
Muß er so oder so, weil er sie eh nie loswird.
Draco schrieb:> Draco schrieb:>> Ja ich werde wohl mal auf die Suche gehen müssen,>> gibt es da ein Standardwerk was man empfehlen kann?!
Erlenkötter ist gut. Nimm beide und du wirst bald eine Menge mehr
verstehen.
Super, die zwei sind im Warenkorb, gibt es noch eine Kurzreferenz (ich
weiß nicht genau wie man das nennt, halt quasi ein "Duden" mit
Standardbefehlen) die man Empfehlen kann?
Draco schrieb:> Super, die zwei sind im Warenkorb, gibt es noch eine Kurzreferenz (ich> weiß nicht genau wie man das nennt, halt quasi ein "Duden" mit> Standardbefehlen) die man Empfehlen kann?
Vergiss es. Derartige Dinge taugen nichts bzw. die brauchst du nicht.
Wonach willst du suchen, wenn du nicht weisst, wie es heisst?
Und die paar Schlüsselwörter hast du schnell intus. Das ist nicht dein
Problem. Die Anzahl der 'Schlüsselwörter' bzw. Operatoren ist auch in C
überschaubar.
Das Problem ist das Problem eines Schach-Lernenden. Wie die Figuren
ziehen können, hast du in 2 Stunden gelernt - wenn du dich doof
anstellst. Den Rest des Lebens verbringst du damit, die Wirkung von
Zug-Kombinationen in bestimmten Situationen zu studieren. Eine Referenz,
wie Figuren ziehen können, hilft dir da genau gar nichts.
Eine Referenz über die zur Verfügung stehenden Funktionen der
Standard-Library ist sowieso in jedem halbwegs ernst zu nehmenden C-Buch
enthalten. Und auch hier gilt: die wichtigsten 15 hast du schnell intus,
weil sie in den im Buch gestellten Aufgaben alle Nase lang vorkommen.
Und für den Rest gibt es das Web. Über Google hast du die Dinge
schneller zum Nachlesen gefunden, als du das INhaltsverzeichnis deines
Buches aufschlagen kannst. Aber: Das funktioniert nur fürs Nachlesen!
Wenn du kein Stichwort hast, weil du das Thema nicht schon mal vorher
gehört hast, dann hilft dir das genauso wenig wie eine gedruckte
Referenz.
Ich bin zwar sehr für gedruckte Bücher. Aber derartige Referenzwerke
(ja, es gibt sie), sind m.M.n. rausgeschmissenes Geld.
Karl H. schrieb:> Das Problem ist das Problem eines Schach-Lernenden. Wie die Figuren> ziehen können, hast du in 2 Stunden gelernt - wenn du dich doof> anstellst. Den Rest des Lebens verbringst du damit, die Wirkung von> Zug-Kombinationen in bestimmten Situationen zu studieren. Eine Referenz,> wie Figuren ziehen können, hilft dir da genau gar nichts.
Karl Heinz, mich haut die Klarheit deiner Worte immer wieder um.
Ich bin ein echter Fan von (den meisten) deinen Beiträgen.
Ich glaube treffender hätte man das nicht ausdrücken können.
Auch wenn du hier Vorgehensweisen beim Programmieren erklärt hast, das
ist immer alles so klar und verständlich.
Musste ich mal wieder sagen. :-)
F. F. schrieb:> Draco schrieb:>> Draco schrieb:>>> Ja ich werde wohl mal auf die Suche gehen müssen,>>> gibt es da ein Standardwerk was man empfehlen kann?!>> Erlenkötter ist gut. Nimm beide und du wirst bald eine Menge mehr> verstehen.
Oh nein bitte nicht Erlenkötter, der ist fehlerhaft und zum Teil
veraltet. Eine Schande, dass der sich gut verkauft, die wenigsten werden
die Codeteile mal selber abgetippt haben und wegen den Warnungen des
Kompilers recherchiert haben, anders kann ich mir die guten Rezessionen
nicht erklären.
Eine Ausführung gibts hier:
http://www.amazon.de/gp/customer-reviews/ROZ4C4VOPXZ0B/ref=cm_cr_pr_viewpnt?ie=UTF8&ASIN=3499600749#ROZ4C4VOPXZ0B
F. F. schrieb:> TriHexagon schrieb:>> Eine Ausführung gibts hier:>>> http://www.amazon.de/gp/customer-reviews/ROZ4C4VOPXZ0B/ref=cm_cr_pr_viewpnt?ie=UTF8&ASIN=3499600749#ROZ4C4VOPXZ0B>> Der Typ hat ALLE Bücher in den Keller gerissen.> Da gabs auch irgendwo etwas über diesen Typen zu lesen.
Tja trotzdem hat er recht, das Buch strotzt nur so von Fehlern. Und da
sind durchaus gravierende Fehler drin, was einen zweifeln lässt ob der
Autor überhaupt selbst C verstanden hat (was er ja offensichtlich nicht
tut).
Dass das auf gefühlt alle deutschsprachigen C-Bücher zutrifft, kann er
doch nix dafür.
F. F. schrieb:> Natürlich wendet man da vieles auf seine eigenen Sachen an und schreibt> nicht ab. Es geht ja um das Verstehen.
Hallo? Mal abgesehen von dem ganzen undefinierten Verhalten was er da
einen beibringt, da gibts z.B. eine Stelle an der er einen Zeiger auf
eine lokale Variable zurück gibt. Sowas lernt man sich als Anfänger an,
weils einem im Buch so beigebracht wird. Viel Spaß dann bei der
Fehlersuche, sehr Anfängerfreundlich.
Ich habe das nur gebraucht, um den Einstieg und das Verständnis für die
µC Programmierung zu lernen. Da sind die Bedingungen doch eh häufig
anders und ich muss auch sagen, dass ich eher bescheidene Sachen mit den
µC's gemacht habe. Bisher hatte ich nicht den Bedarf für sehr komplexe
Sachen.
Vielleicht sehe ich das hinterher ja anders, aber immerhin haben ihm ne
Menge Leute 5 Sterne gegeben und es ist das am besten bewertete (kleine)
Buch zur C-Programmierung.
F. F. schrieb:> Ich habe das nur gebraucht, um den Einstieg und das Verständnis für die> µC Programmierung zu lernen. Da sind die Bedingungen doch eh häufig> anders und ich muss auch sagen, dass ich eher bescheidene Sachen mit den> µC's gemacht habe. Bisher hatte ich nicht den Bedarf für sehr komplexe> Sachen.
Ich hab C damit auch "gelernt", der Schaden hielt sich zum Glück in
Grenzen. Ich konnte schon recht gut C# und hab parallel selber dann viel
rumprobiert, vor allem habe ich die Warnungen nicht ignoriert, habe
nachgeforscht warum diese Warnungen kommen und was diese bedeuten. Ach
ja das Standardwerk "Programmieren in C" hatte ich auch noch.
F. F. schrieb:> Vielleicht sehe ich das hinterher ja anders, aber immerhin haben ihm ne> Menge Leute 5 Sterne gegeben und es ist das am besten bewertete (kleine)> Buch zur C-Programmierung.
Wie sollen Anfänger so ein Buch auch bewerten können? Da muss man sich
schon besser auskennen und dann braucht man das Buch auch nicht. Allein
wegen den Fehlern hat das Buch definitiv keine 5 Sterne verdient.
Ich werf mal noch den Schmitt in die Runde:
http://www.amazon.de/Mikrocomputertechnik-Controllern-Atmel-AVR-RISC-Familie-Programmierung/dp/3486577174
Insbesondere dass er alle Beispiele parallel in Assembler und C umsetzt,
ist außerordentlich hilfreich.
(Anm.: Ist allerdings noch aus den Anfangstagen des GCC, was man hier
und da auch mal merkt. Insgesamt tuts dem aber keinen Abbruch.
Mittlerweile ist der GCC schon ausgereifter.)
Karl H. schrieb:> Vergiss es. Derartige Dinge taugen nichts bzw. die brauchst du nicht.> Wonach willst du suchen, wenn du nicht weisst, wie es heisst?> Und die paar Schlüsselwörter hast du schnell intus. Das ist nicht dein> Problem. Die Anzahl der 'Schlüsselwörter' bzw. Operatoren ist auch in C> überschaubar.>> Das Problem ist das Problem eines Schach-Lernenden. Wie die Figuren> ziehen können, hast du in 2 Stunden gelernt - wenn du dich doof> anstellst. Den Rest des Lebens verbringst du damit, die Wirkung von> Zug-Kombinationen in bestimmten Situationen zu studieren. Eine Referenz,> wie Figuren ziehen können, hilft dir da genau gar nichts.>> Eine Referenz über die zur Verfügung stehenden Funktionen der> Standard-Library ist sowieso in jedem halbwegs ernst zu nehmenden C-Buch> enthalten. Und auch hier gilt: die wichtigsten 15 hast du schnell intus,> weil sie in den im Buch gestellten Aufgaben alle Nase lang vorkommen.> Und für den Rest gibt es das Web. Über Google hast du die Dinge> schneller zum Nachlesen gefunden, als du das INhaltsverzeichnis deines> Buches aufschlagen kannst. Aber: Das funktioniert nur fürs Nachlesen!> Wenn du kein Stichwort hast, weil du das Thema nicht schon mal vorher> gehört hast, dann hilft dir das genauso wenig wie eine gedruckte> Referenz.>> Ich bin zwar sehr für gedruckte Bücher. Aber derartige Referenzwerke> (ja, es gibt sie), sind m.M.n. rausgeschmissenes Geld.
Danke für die klaren Worte! Und ja, das verstehe ich - das ist quasi wie
mit den Baggerfahrern: Einen Bagger fahren kann jeder, aber Baggerfahren
macht die Erfahrung. Da gibt es auch nur vier Hebel und drei Pedale, was
die machen lernt man schnell - damit umzugehen und sie richtig
einzusetzen ist eine lange Lernphase - und man braucht ein Gefühl und
ein Gespür dazu.
Das leuchtet ein. Also... Referenzwerk bei Seite legen. Danke :)
Draco schrieb:> Das leuchtet ein. Also... Referenzwerk bei Seite legen. Danke :)
Ein kleiner Zettel mit den wichtigsten Stichworten drauf schadet aber
zumindest für den Einstieg nicht. :-)