www.mikrocontroller.net

Forum: Compiler & IDEs Hilfe bei Bitgeschiebe


Autor: Julian W. (julian-w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar Mann. Aber bitte lies erstmal ein C-Buch. So in einer Woche reden 
wir dann weiter.

Autor: Union (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
union {

  struct {
    unsigned adresse:4;
    unsigned effekt:2;
    unsigned pwm:10;
  };
  uint16_t alsInt;
  struct {
    uint8_t byte1;
    uint8_t byte2;
  };
} message;

message.byte1=receive();
message.byte2=receive();
if (message.adresse==meineAdresse) {
  switch (message.effekt) {
    case AUFBLENDEN:
        targetPWM=message.pwm;
        break;
......
  }
}
Ohne Gewähr.
ggfs attribute(_packed_) an die structs hängen.

Autor: bitschubser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Union schrieb:
>
> union {
> 
>   struct {
>     unsigned adresse:4;
>     unsigned effekt:2;
>     unsigned pwm:10;
>   };

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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: Julian W. (julian-w) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, nachdem ich den Controller wohl nun fast Todgeflahst habe, hab ich 
es teilweise hinbekommen:
address = empfangen1 >> 4;
pwm = empfangen1 & 0b00000011;        
pwm |= (uint16_t)empfangen2 << 2;

Nur die 2bit für Effekte bekomme ich nicht raus :/

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julian W. schrieb:
> So, nachdem ich den Controller wohl nun fast Todgeflahst habe, hab ich
> es teilweise hinbekommen:
>
>
> address = empfangen1 >> 4;
> pwm = empfangen1 & 0b00000011;
> pwm |= (uint16_t)empfangen2 << 2;
> 
>
> 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.