Hallo, könnte mir einer sagen, wie ich zwei Bytes verschieben muss, damit ich folgende "Fragmente" daraus erhalte: 1 Byte: -4bit Adresse -2bit Effekt -2bit zweiter Teil von PWM 2 Byte: -8bit erster Teil von PWM Bsp.: 01000010 11001111 -> Adresse: 0100 -> Effekt: 00 -> PWM: 1100001110 AAAABBCC DDDDDDDD -> Adresse: AAAA -> Effekt BB -> PWM: DDDDDDDDCC Würde mich über eure Hilfe freuen :) Viele Grüße Julian
Gast
#1903872
Klar Mann. Aber bitte lies erstmal ein C-Buch. So in einer Woche reden wir dann weiter.
Gast
#1903873
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
Ohne Gewähr. ggfs attribute(_packed_) an die structs hängen.
Gast
#1903876
Reg_u16 |= (Adresse << 12); Reg_u16 |= (Effekt << 10); Reg_u16 |= PWM; Zustand der 16 Bit Variable (u16) wäre dann: AAAABBCC DDDDDDDD bzw. 01000010 11001111
Union schrieb: >
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
wenn schon, dann musst du die Reihenfolge umdrehen, da die Adressbits ganz oben sitzen. Aber eigentlich ist an dieser Stelle ein Bitfeld keine so gute Idee. C definiert sehr wenig über Bitfelder, sodass man sie zur Kommunikation nicht besonders gut einsetzen kann. Mit diskretem Bitmaskieren und Bitschieben fährt man besser und hat alle Details selber in der Hand. Laufzeiteinbussen hat man deswegen auch keine, denn mit den Bitfeldern versteckt man ja einfach nur die Maskiererei/Schieberei hinter einer anderen Syntax. Dem Prozessor selbst bleibt sie aber nicht erspart.
Julian W. schrieb: > AAAABBCC DDDDDDDD > -> Adresse: AAAA > -> Effekt BB > -> PWM: DDDDDDDDCC > > Würde mich über eure Hilfe freuen :) Das ist aber das kleine Einmaleins der µC Programmierung. Das solltest du schon alleine hinkriegen. Und wenn schon, dann etwas gezielter fragen. Woran scheitert es denn konkret? (Aus deinem anderen, mitlerweile gelöschtem Thread, weiß ich dass du per UART Befehle an deinen µC schickst. D.h. du hast eine UART zur Verfügung. Benutze sie, um dir Zwischenergebnisse ausgeben zu lassen. Dadurch hörst du dann auf im Nebel zu stochern und deine Probleme werden plötzlich analysierbar. Auch für dich)
So, nachdem ich den Controller wohl nun fast Todgeflahst habe, hab ich es teilweise hinbekommen:
1 | |
2 | |
3 | |
Nur die 2bit für Effekte bekomme ich nicht raus :/
Julian W. schrieb: > So, nachdem ich den Controller wohl nun fast Todgeflahst habe, hab ich > es teilweise hinbekommen: > >
1 | |
2 | |
3 | |
4 | |
> > Nur die 2bit für Effekte bekomme ich nicht raus :/ Warum nicht? Du schiebst das Byte um 2 Stellen nach rechts, dann sind die beiden Bits an Position 0 und 1. Anschliessend maskierst du dir mit einem & noch die nicht interessierenden Bits weg (setzt sie gezielt auf 0) und fertig. effekt = ( empfangen1 >> 2 ) & 0b00000011; Mit einem & und einer entsprechenden Maske kann man gezielt Bits auf 0 setzen (und damit Teile wegwerfen, die man im ergebnis nicht haben möchte) Mit einem | und einer entsprechenden Maske kann man gezielt Bits auf 1 setzen. Und das wars dann schon.
Siehe Bitmanipulation
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.