Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
wbus_addr [2017/02/27 15:53]
wikiadmin angelegt
wbus_addr [2017/07/16 11:15]
wikiadmin ↷ Seite von pages:wbus_addr nach wbus_addr verschoben
Zeile 2: Zeile 2:
  
 ===== Hintergrund ===== ===== Hintergrund =====
 +
 +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.
  
 ===== Umsetzung ===== ===== Umsetzung =====
 +
 +<​code>​
 +#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) );
 +}
 +</​code>​
  
 ===== Anwendung ===== ===== Anwendung =====
 +
 +ADDR-Byte mit festen Zahlenwerten als Adressen generieren: <code c>
 +byte addr;
 +addr = wbus_addr(0x4,​ 0xf);
 +</​code>​
 +
 +ADDR-Byte mit Ersetzungsnamen als Adressen generieren: <code c>
 +byte addr;
 +addr = wbus_addr(WBUS_ADDR_HEATER,​ WBUS_ADDR_DIAG);​
 +</​code>​
  
 ===== Code-Erklärung ===== ===== Code-Erklärung =====
 +
 +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.