Forum: Mikrocontroller und Digitale Elektronik 4bit + 12bit in 2x 8bit


von Konrad S. (Gast)


Lesenswert?

Hallo,

ich habe ein Gerät mit einer seriellen Schnittstelle, das man mit 4bit 
steuert und per 12bit Daten übergibt, man kann aber nur 8bit pro 
Transmission übertragen. Wie kann ich das am einfachsten trennen, sodass 
ich eine Methode schreiben kann, der ich einen char als Steuerbefehl und 
einen int mit den Datne übergeben kann`?

Danke + Gruß,
Konrad

von Max H. (hartl192)


Lesenswert?

Um welche Programmiersprache geht es? Wie hast du die daten vorligen, 22 
uint8_t

von Mark B. (markbrandis)


Lesenswert?

Ich nehme mal an Du willst die 1x4 Bit und die 1x12 Bit in einen 
Sendepuffer schreiben, der aus lauter Bytes besteht (Array). Dann würden 
die 1x4 Bits und weitere 4 Bits von den 12 in einem Byte stehen, und die 
übrigen 8 Bits von den 12 würden in einem weiteren Byte stehen.

Sowas macht man mit Bit Shifting. Gibt Tausende Beispiele dafür.

http://stackoverflow.com/questions/141525/what-are-bitwise-shift-bit-shift-operators-and-how-do-they-work

von Joe F. (easylife)


Lesenswert?

Cmd 4 bit nach links schieben, und mit den obersten 4 bit des 
Datenwortes verodern -> 1. zu übertragendes Byte.

Dann die unteren 8 bytes des Datenwortes übertragen.
1
send(unsigned char cmd, unsigned int data)
2
{
3
  unsigned char b;
4
5
  b = (cmd << 4) | ((data >> 8) & 0x0f);
6
  send_byte(b);
7
8
  b = data & 0xff;
9
  send_byte(b);
10
}

von Fabian O. (xfr)


Lesenswert?

1. Die Daten an die richtige Stelle innerhalb eines Bytes schieben.
2. Die restlichen Bits ausmaskieren.
3. Die verschiedenen Teile miteinander verodern.

Also zum Beispiel so (je nach Byte/Bit-Reihenfolge anpassen):
1
void send(uint8_t byte);
2
3
void send_cmd(uint8_t cmd, uint16_t data)
4
{
5
  send(((cmd << 4) & 0xF0) | ((data >> 8) & 0x0F));
6
  send(data & 0xFF);
7
}

von struct (Gast)


Lesenswert?

Fehlt hier nicht noch die Frage wozu das ganze gut sein soll um danach 
alle möglichen "Lösungen" zu servieren die mit dem Problem nicht das 
Geringste zu tun haben?

von S. R. (svenska)


Lesenswert?

> Fehlt hier nicht noch die Frage wozu das ganze gut sein soll

Nö. Ich würde ja noch eine union vorschlagen, die eine struct (mit 
Bitfeldern drin) mit einem uint8_t[2] überlagert. Dann kann sich der 
Compiler um die Bits kümmern.

von Konrad S. (Gast)


Lesenswert?

Hallo, Joe, Fabian,
genau das habe ich gesucht. Vielen Dank dafür

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.