Adressbyte generierung "wbus_addr()"

Die W-Bus Adressen für Absender- und Empfänger-Knoten wird laut Protokoll zusammen in einem ADDR-Byte abgebildet. Dadurch ergeben sich max. 16 mögliche Adressen (1 Byte = 8 Bit. 8 Bit / 2 = 4 Bit pro Adresse. 0b1111 = 16), von denen aber nur einige wenige genutzt werden.

Die Adresse des Absenders wird im oberen Nibble (Bits 4-7) und die des Empfängers im unteren Nibble (Bits 0-3) hinterlegt. Um nun ein ADDR-Byte zu erzeugen muss die Absenderadresse um 4 Bit nach links geschoben und mit der Empfängeradresse verodert werden.

Da die Adresszuordnung im W-Bus Protokoll festvorgegeben ist (jeder Gerätetyp hat seine eigene Adresse), ist es sinnvoll von der Verwendung statischer Zahlenwerte im Code abzusehen und stattdessen lieber mit Platzhaltern zu arbeiten. Daher sind hier die beiden wichtigsten gleich mit umgesetzt.

#define WBUS_ADDR_HEATER 0x4   // W-Bus address of heating device (fixed)
#define WBUS_ADDR_DIAG   0xF   // Our own W-Bus address (use 0xF to act as diagnose-software)

...

/**
 * Return ADDR byte of source/destination addresses given
 */
byte wbus_addr(byte addr_from, byte addr_to) {
  return( (addr_from<<4) | (addr_to & 0x0f) );
}

ADDR-Byte mit festen Zahlenwerten als Adressen generieren:

byte addr;
addr = wbus_addr(0x4, 0xf);

ADDR-Byte mit Ersetzungsnamen als Adressen generieren:

byte addr;
addr = wbus_addr(WBUS_ADDR_HEATER, WBUS_ADDR_DIAG);

Die Funktion erhält als Parameter die Absender- (addr_from) und Empfängeradresse (addr_to). Um sich die Deklaration einer Variablen für eine einzige Programmzeile zu sparen, wurde die Berechnungsformel gleich in das return()-Statement mit eingebaut.

Das Statement besteht aus zwei bit-veroderten Teilen (|).

Im linken Teil (addr_from«4) wird die Absenderadresse um 4 Bits nach links geschoben. Nehmen wir beispielsweise die hexadezimale Absenderadresse 0x0F (Diagnosesoftware). Binär sieht diese so aus: 0b00001111. Wir benötigen die Adresse im oberen Nibble (ein Nibble entspricht 4 Bits). Um nun eine beliebige Bitanordnung um eine Position nach links zu schieben kann man den Wert entweder mit 2 multiplizieren, oder aber den Bitshift-Operator « verwenden. Die Richtung der Pfeile zeigt die Schieberichtung an. „Schieben“ bedeutet auch das ggf. vorhandene Bits auf der linken Seite „rausfallen“ und 0-Bits auf der rechten Seite hineinkommen. Hinter dem Schiebe-Operator wird die Anzahl der Verschiebungen angegeben. Die Ziffer 4 bedeutet hier „verschiebe bitweise viermal nach links“. Heraus kommt 0b11110000.

Im rechten Teil wird das Ergebnis des linken Teils mit dem Adresse bitweise oder-verknüpft. Nur aus Sicherheit maskieren wir aus der Empfängeradresse die oberen 4 Bits aus. Diese dürften zwar bei einer gültigen Adresse nicht gesetzt sein, aber sicher ist sicher. Das ganze sieht dann z.B. so aus: Empfängeradresse 0x04 (Heizung). Binär 0b00000100. Nach der Maskierung mit 0x0F, also binär 0b00001111 bleibt genau diese Adresse übrig. Durch das verodern ergibt sich dann die binäre Adresse 0b11110100, was hexadezimal 0xF4 entspricht.