Forum: Mikrocontroller und Digitale Elektronik wie komme ich an die einzelnen Bits? ( C )


von Antoli B. (allister)


Lesenswert?

Hallo,

wie komme ich an jedes einzelne Bit eines Bytes? Ich will keine anderen 
Codes lesen o.ä. sondern es selber hinbekommen.

Also, ich habe z.b. das Byte 0 das sind ja dann 8 Bits a 0 also auf Byte 
0 und Bits 00000000

Ich hoffe ich habe das so richtig erklärt. Ich weiss "eigentlich" was 
ich brauche jedoch habe ich kA wie das heisst bzw. wonach ich suchen 
muss.

Also weiter.

Ich habe nun eine Zahl von 0 - 255. Diese Zahl muss ich nun auf den 
Ausgang "tickern" also bei 0 muss ich 8 (acht) nullen auf den Pin 
schreiben usw.

Eine Funktion die mir das Timing macht habe ich, diese funktioniert 
auch.
1
write_one();
2
write_zero();

Wenn ich jetzt das Byte 0 habe dann entspricht das ganze folgendem
1
write_zero();  //Bit 1
2
write_zero();  //Bit 2
3
write_zero();  //Bit 3
4
write_zero();  //Bit 4
5
write_zero();  //Bit 5
6
write_zero();  //Bit 6
7
write_zero();  //Bit 7
8
write_zero();  //Bit 8

So klappt das ganze auch, jedoch muss ich das so schreiben. Das ganze 
soll aber "automatisch" passieren, also ich schicke ihm per RS232 eine 
Zahl zwischen 0 und 255 und den rest macht der Code. Der zerlegt das 
Byte dann in einzelne Bits und macht für jedes Bit dann eine if abfrage 
wenn eine 0 dann write_zero() und wenn eine 1 dann write_one().

Also,

1. Wie kriege ich aus dem Byte acht Bits?
2. Wie kriege ich zugriff auf jedes einzelne Bit?

Also man ende muss dann rauskommen:

ist das erste Bit eine 1 schreibe 1 sonst 0
ist das zweite Bit eine 1 schreibe 1 sonst 0
ist das dritte Bit eine 1 schreibe 1 sonst 0
...
...
...

Ich hoffe ihr versteht wie und was ich meine.

von Peter D. (peda)


Lesenswert?

Antoli B. schrieb:
> Ich will keine anderen
> Codes lesen

Solltest Du aber.
Jeder Soft-SPI Code macht sowas.
In einer Schleife maskieren (&) und schieben (>>).

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


Lesenswert?

Antoli B. schrieb:
> wie komme ich an jedes einzelne Bit eines Bytes? Ich will keine anderen
> Codes lesen o.ä. sondern es selber hinbekommen.
Dann musst du die Programmiersprache selber erfinden oder ein Buch dazu 
lesen. Oder halt ewig und drei Tage herumbasteln.

Antoli B. schrieb:
> 1. Wie kriege ich aus dem Byte acht Bits?
> 2. Wie kriege ich zugriff auf jedes einzelne Bit?
Mein Tipp: du brauchst logische VerUNDung und/oder VerODERung.
Siehe Bitmanipulation

> 1. Wie kriege ich aus dem Byte acht Bits?
Der Trick dabei ist: ein Byte besteht aus 8 Bits, die einfach 
entsprechend ihrer Wertigkeit hintereinander gereiht sind.
> Wenn ich jetzt das Byte 0 habe dann entspricht das ganze folgendem
> write_zero();  //Bit 1
> write_zero();  //Bit 2
> write_zero();  //Bit 3
> write_zero();  //Bit 4
> write_zero();  //Bit 5
> write_zero();  //Bit 6
> write_zero();  //Bit 7
> write_zero();  //Bit 8
Deine Nummerierung ist falsch. Das LSB ist das Bit 0. Denn 2^0 ist 1, 
und das höchswertige Bit hat die Nummer 7, denn 2^7 ist 128. Du solltest 
dir unbedingt das binäre Zahlenformat ansehen.

: Bearbeitet durch Moderator
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Antoli B. schrieb:
> Ich will keine anderen
> Codes lesen o.ä. sondern es selber hinbekommen.

Gut. Dann lies das auf keinen Fall, wenn du das LSB zuerst haben willst. 
(Willst du das MSB zuerst, dann darfst du das natuerlich auch nicht 
lesen).
1
void do_not_read_me(unsigned char c) {
2
    unsigned char i;
3
    for (i=0;i<8;i++) {
4
        (c & 0x01)?write_one():write_zero();
5
        c>>=1;
6
    }
7
}

Gruss
WK

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


Lesenswert?

Ich würde das statt mit write_one() und write_zero() mit einer Funktion 
write_bit() machen, die 0 oder 1 übergeben bekommt:
1
     for (uint8_t i=0x01;i;i<<=1) write_bit(c&i?1:0);
Oder noch besser mit einer Funktion write_bit(), die Null oder "ungleich 
Null" übergeben bekommt:
1
     for (uint8_t i=0x01;i;i<<=1) write_bit(c&i);

@Antoli Berg
das hilft dir jetzt nicht weiter, weil du ja keinen Code lesen willst...

: Bearbeitet durch Moderator
von Antoli B. (allister)


Lesenswert?

Es geht um die ws2812b.

Also da muss ich ja 24 Bits, 8pro Byte/Farbe schicken. Wenn ich das von 
"hand" mache also 24 mal write_zero() oder write_one() mache dann geht 
das oder 24mal durcheinander dann kommen bunte Farben raus.

Nur genau das soll eben der Code machen. Und da mir Copy & Paste nichts 
bringt muss ich achon wissen wie das genau heisst etc pp um mich darüber 
einzulesen.

Timing etc habe ich alles schon hinbekommen. Nur die "automatisierung" 
fehlt mir eben noch.

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


Lesenswert?

Antoli B. schrieb:
> Nur die "automatisierung" fehlt mir eben noch.
Du siehst an allen geposteten Beispielen, dass du für die 
Automatisierung eine Maske (= ein Byte, in dem nur 1 Bit gesetzt ist), 
einen Schiebeoperator sowie ein logisches Und brauchst.

: Bearbeitet durch Moderator
von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Antoli B. schrieb:
> Ich will keine anderen
> Codes lesen o.ä. sondern es selber hinbekommen.

Umgekehrte Psychologie und alle fallen drauf rein :D

von Brummbär (Gast)


Lesenswert?

Md M. schrieb:
> Antoli B. schrieb:
>> Ich will keine anderen
>> Codes lesen o.ä. sondern es selber hinbekommen.
>
> Umgekehrte Psychologie und alle fallen drauf rein :D

Ich lese da eher raus, dass Antoli keine fertigen Codes verwenden, 
sondern selber lernen will. Das ist, finde ich zumindest, sehr 
lobenswert.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Antoli B. schrieb:
> Timing etc habe ich alles schon hinbekommen. Nur die "automatisierung"
> fehlt mir eben noch.

 Dir fehlt ein bisschen mehr als nur das.
 Sowohl Dergute W. als auch Lothar M. haben dir funktionierende
 Beispiele geschickt.

 Du musst nur die Reihenfolge umdrehen aber nicht mal das kannst du
 erkennen.

 Keiner von beiden meldet sich, sieht für mich so aus als hätten die
 dich einfach fallen lassen, aus welchen Gründen auch immer...

 P.S.
 Ich kann mir einen Grund denken, will aber nicht das dieser Beitrag
 gelöscht wird...

: Bearbeitet durch User
von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Antoli B. schrieb:
> Hallo,
>
> wie komme ich an jedes einzelne Bit eines Bytes? Ich will keine anderen
> Codes lesen o.ä. sondern es selber hinbekommen.
>

Wenn Du einen ARM Cortex hast, kannst Du über Bit Banding für jedes Bit 
in bestimmten Bereichen einen Byte Alias benutzen. Such mal nach ARM 
Cortex "Bit Banding."

von Theor (Gast)


Lesenswert?

Antoli B. schrieb:
> Hallo,
>
> wie komme ich an jedes einzelne Bit eines Bytes? Ich will keine anderen
> Codes lesen o.ä. sondern es selber hinbekommen.
> [...]

Was Du an Grundlagen dafür brauchst, wird in einem C-Buch unter den 
Stichworten "Bitweise logische Operatoren" (das sind '&', '|', '^' und 
'~') und "Schiebeoperationen" (das sind ">>" und "<<") behandelt.

In diesem Artikel wird das teilweise abgehandelt: 
https://www.mikrocontroller.net/articles/Bitmanipulation#Standard_C_4

Oder auch heir: 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/006_c_operatoren_005.htm#mj8665462fba73385942e5ef4e23cddef6

Die Kodierung von Vorzeichenlosen, ganzen Zahlen setze ich als bekannt 
voraus.

Eventuell kannst Du mit diesen Kenntnissen allein zum Ziel kommen. 
Ansonsten frage gerne nochmal nach. Nur eben lies erst mal das und 
probiere es aus.

von Dieter F. (Gast)


Lesenswert?

Brummbär schrieb:
> Ich lese da eher raus, dass Antoli keine fertigen Codes verwenden,
> sondern selber lernen will. Das ist, finde ich zumindest, sehr
> lobenswert.

Problematisch dabei ist jedoch, dass er auch keine Bücher / Artikel 
lesen will (Vermutung) sondern sich das lieber in einem Forum vorkauen 
lässt. Auch eine Methode - besonders Freitags.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ruediger A. schrieb:
> Wenn Du einen ARM Cortex hast, kannst Du über Bit Banding für jedes Bit

 Ist zwar gut gemeint, übersteigt aber bei weitem sein Wissen...

von Stefan F. (Gast)


Lesenswert?

> Ich will keine anderen Codes lesen o.ä.
> sondern es selber hinbekommen.

Wenn du das ernst meinst, dann hättest du hier nicht gefragt, denn du 
willst es ja selber hinbekommen.

von Brummbär (Gast)


Lesenswert?

Dieter F. schrieb:
> keine Bücher / Artikel

Er schreibt nur "keine anderen Codes"
Hier schreibt er zumindest, dass er nachlesen möchte:

Antoli B. schrieb:
> Und da mir Copy & Paste nichts
> bringt muss ich achon wissen wie das genau heisst etc pp um mich darüber
> einzulesen.

von Antoli B. (allister)


Lesenswert?

Dieter F. schrieb:
> Brummbär schrieb:
>> Ich lese da eher raus, dass Antoli keine fertigen Codes verwenden,
>> sondern selber lernen will. Das ist, finde ich zumindest, sehr
>> lobenswert.
>
> Problematisch dabei ist jedoch, dass er auch keine Bücher / Artikel
> lesen will (Vermutung) sondern sich das lieber in einem Forum vorkauen
> lässt. Auch eine Methode - besonders Freitags.

Genau so ist es. Ich will lesen und es selber hinbekommen mit lesen, der 
schaltung und osziloskop.

Nein ich will keine fertigen codes lesen wenn ich sie ja eh nicht 
verstehe. Ich möchte wissen wie das genau heisst und WAS ich LESEN und 
LERNEN muss.

Da bringt es mir nichts Code zu lesen wenn ich ihn nicht verstehe.

von Dieter F. (Gast)


Lesenswert?

Brummbär schrieb:
> Er schreibt nur "keine anderen Codes"
> Hier schreibt er zumindest, dass er nachlesen möchte:
>
> Antoli B. schrieb:
>> Und da mir Copy & Paste nichts
>> bringt muss ich achon wissen wie das genau heisst etc pp um mich darüber
>> einzulesen.

Dann muss ich ihm halt den genialen Link dazu vermitteln:

https://www.google.de/?gws_rd=ssl

Hier im Forum werden umfangreiche Grundlagen vermittelt (wenn man denn 
lesen will) - es gibt x andere Quellen (Google), die man auch anzapfen 
kann (lesend).

Außerdem gibt es lokale Leihbüchereien, die auch gerne weiterhelfen.

von Dieter F. (Gast)


Lesenswert?

Antoli B. schrieb:
> Ich möchte wissen wie das genau heisst und WAS ich LESEN und
> LERNEN muss

Antoli B. schrieb:
> Eine Funktion die mir das Timing macht habe ich, diese funktioniert
> auch.

Womit?

Antoli B. schrieb:
> Es geht um die ws2812b

Fein.

Alles, was mit dem von Dir verwendeten MC und WS2812B zu tun hat.

-> Google

Ansonste tippe ich auf einen Troll (schon wieder Freitag ?)

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


Lesenswert?

Antoli B. schrieb:
> Da bringt es mir nichts Code zu lesen wenn ich ihn nicht verstehe.
Dann versuch doch genau das. Wenn ein "Code" in 1 einzige Zeile passt, 
dann kann er nicht kompliziert sein. Und deshalb solltest du in der Lage 
sein, ihn zu verstehen.
Oder wie willst du selber einen Quellcode schreiben, wenn du nicht mal 
einen anderen einfachen Code lesen kannst?
Oder wie willst du selber einen Brief in einer neuen Sprache schreiben, 
wenn du noch nicht mal einen einfachen Text lesen kannst?

: Bearbeitet durch Moderator
von Possetitjel (Gast)


Lesenswert?

Lothar M. schrieb:

> Wenn ein "Code" in 1 einzige Zeile passt, dann kann er
> nicht kompliziert sein.

Nun ja, es koennte sich auch einfach um eine Programmiersprache
handeln, die fuer Sonderzeichenwuesten bekannt ist.

von Dieter F. (Gast)


Lesenswert?

Dieter F. schrieb:
> Ansonste tippe ich auf einen Troll (schon wieder Freitag ?)

Na, immerhin kann er -1 verteilen :-)

von Dieter F. (Gast)


Lesenswert?

Dieter F. schrieb:
> a, immerhin kann er -1 verteilen :-)

qed

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Marc V. schrieb:
> Keiner von beiden meldet sich, sieht für mich so aus als hätten die
>  dich einfach fallen lassen, aus welchen Gründen auch immer...
>
>  P.S.
>  Ich kann mir einen Grund denken, will aber nicht das dieser Beitrag
>  gelöscht wird...

Aha. Soso. Naja. Um die Mutmassungen ueber Gruende nicht zu sehr ins 
Kraut schiessen zu lassen:
* Ich bin nicht 24/7 hier dabei, manchmal muss ich auch arbeiten, pipi, 
kaka oder bubu machen. Oder Super-Hi-Speed-DSP-Anwendungen auf attinys 
designen. Oder. Oder.
* Ich werd' nicht fuers Posten bezahlt, also poste ich nur dann, wenn 
ich Bock hab'. Da fang' ich weder jemanden auf, noch lass ich jemanden 
fallen. Ich bin sogar so kackfrech, ich nehm mir einfach das Recht raus, 
voellig unabhaengig von Threaderoeffner und Mitpostern selbst zu 
entscheiden, ob ich einen Beitrag schreibe oder nicht.

Gruss
WK

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


Lesenswert?

Sind wir wieder kindisch heute?
Oder müsste jetzt ein Tätäätätäätätäää kommen,  wegen Fasching...

von W.S. (Gast)


Lesenswert?

Antoli B. schrieb:
> also ich schicke ihm per RS232 eine
> Zahl zwischen 0 und 255 und den rest macht der Code

Antoli B. schrieb:
> Ich hoffe ihr versteht wie und was ich meine.

Nein, das was du schreibst, ist komplett UNVERSTÄNDLICH. Eben deshalb 
kam auch der Sack voll dazu passender Antworten darauf.

Merke dir mal:
über RS232 wie auch über alle möglichen anderen Kanäle rein und raus aus 
einer Rechenanlage kann man keine Zahlen schicken.

Basta.

So etwas geht aus Prinzip nicht.

Stattdessen..

kann man über alle derartigen Wege Zeichen schicken, insbesondere 
Textzeichen (aber prinzipiell auch Zeichen, die keinem Text entsprechen 
müssen).

Also wenn du ne Zahl durch die Gegend schicken willst, dann mußt du 
daraus eben eine Folge von Zeichen machen, zum Beispiel Textzeichen.

Beispiel: Du willst ne Zahl von 4711 schicken, dann sende ein 
Textzeichen '4', dann ein '7', dann ein '1' und dann nochmal ein '1' und 
zum Schluß irgendwas, das dem Empfänger klarmacht, daß hier Schluß ist. 
z.B. ein ';' oder so.

Haben wir jetzt wenigstens soviel dazugelernt, daß eine sachliche 
Diskussion ermöglicht wird?

W.S.

von A. S. (Gast)


Lesenswert?

An den TO:

es gibt prinzipiell so viele Möglichkeiten und Deine Praxiserfahrung ist 
noch so gering, dass es besser ist, Du machst erstmal einfach. Und dann 
hole Dir Tipps zum optimieren.

Beispiel: Die einfachste (straightforward) Lösung ist: (angenommen, die 
Zahl die reinkommt ist in Variable x gespeichert)
Zudem kürze ich (per define) die Funktionsnamen ab )
1
#define wz write_zero
2
#define wo write_one
3
switch(x)
4
{
5
/* alles 0 ist einfach :-) */
6
case 0: wz(); wz(); wz(); wz(); wz(); wz(); wz(); wz(); break;
7
/* bei 1 ist schon die Frage, ob das wo am Anfang oder am Ende kommt */
8
case   1: wo(); wz(); wz(); wz(); wz(); wz(); wz(); wz(); break;
9
case   2: wz(); w0(); wz(); wz(); wz(); wz(); wz(); wz(); break;
10
....
11
case 255: wo(); wo(); wo(); wo(); wo(); wo(); wo(); wo(); break;
12
}
Wenn Du es so programmierst, hast Du mehr gelernt, als durch 
Diskussionen.

Vielleicht überlegst Du Dir, ob Du vielleicht die oberen und unteren 4 
Bit (sogenannte Nibbles) einzeln auswertest, dann gibt es nur 16 Fälle, 
also deutliche Optimierung.

Und dann hast Du auch einen intrinsischzen Antrieb, Dir zu überlegen,
- wie der binäre Aufbau sich im Detail hier wiederfindet,
- ob vielleicht die binären Operatoren & und | Dir weiterhelfen
- ob die reine Rechnerei mit Modulo (%) oder auch / weiterhilf
- Ob es am Ende vielleicht nur 8 Fälle gibt (Bit 0 ... Bit 7)

Wenn Du dann einen Aufbau mit 8 Fällen hast, dann kannst Du im 
übernächsten Schritt fragen, wie man den in einer Schleife eleganter 
umsetzt. Das braucht aber einige Tage Nachdenken, Erfahrung und 
Schweiss.

Und dann kann es am Ende sehr kurz werden, wie z.B. bei Lothar.

von Maus (Gast)


Lesenswert?

> Wenn ein "Code" in 1 einzige Zeile passt, dann kann er
> nicht kompliziert sein.

gültiger C Code:
1
 #include <stdio.h>
2
 main(t,_,a)
3
 char *a;
4
 {
5
 return!0<t?t<3?main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):
6
 1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
7
 main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
8
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#l+,/n{n+,/+#n+,/#\
9
 ;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
10
 q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#\
11
 ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
12
 iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
13
 ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \
14
 }'+}##(!!/")
15
 :t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
16
 :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
17
 "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);

: Bearbeitet durch Moderator
von Einer K. (Gast)


Lesenswert?

Achim S. schrieb:
> Wenn Du es so programmierst, hast Du mehr gelernt, als durch
> Diskussionen.

Ja, das falsche gelernt.
Da halte ich eine vorherige Diskussion doch für erheblich sinnvoller.

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


Lesenswert?

Achim S. schrieb:
> Wenn Du es so programmierst, hast Du mehr gelernt, als durch Diskussionen.
Vor allem statt "Nachdenken" die "Copy&Paste Programmierung"... :-/
Denn der Witz dabei ist das Motto: "Wenns läuft ist es fertig!"

Maus schrieb:
> gültiger C Code:
Da bin ich mir nicht soooo ganz sicher:
http://codepad.org/jb8KQRmB

> gültiger C Code:
Wenn du das meinst, dann mach doch bitte auch die [c] Tags drumrum.

: Bearbeitet durch Moderator
von A. S. (Gast)


Lesenswert?

Arduino F. schrieb:
> Ja, das falsche gelernt.
> Da halte ich eine vorherige Diskussion doch für erheblich sinnvoller.

Welche Diskussion denn: Der TO hat mit seinen Funktionen und seiner 
Frage doch gezeigt, dass er ganz am Anfang steht und keine Ahnung hat, 
wie die Bits in einem Byte zu einer Zahl zusammengesetzt werden.

Wenn er sich das am konkreten Beispiel der Zahlen 0 und 1 anschaut und 
programmiert und auch nur zur Hälft kapiert (also nichtmal erkennt, ob 
LSB oder MSB first), dann hat er schon mehr gelernt als er im Thread 
hier lernen kann weil er noch nicht so weit ist die gegebenen Hilfen 
zu verstehen. Er hat also 2 Möglichkeiten: Sich für zu doof halten, oder 
es (auf eine für Dich falsche Art) selber tun..

von Christian J. (Gast)


Lesenswert?

Immer wieder gut....

Bit Twiddling Hacks
By Sean Eron Anderson
seander@cs.stanford.edu

Mein Standard Werk :-) Copy & Paste  = Funzt!

https://graphics.stanford.edu/~seander/bithacks.html

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.