---- noch in Arbeit ......
Dekodierung des Selectrix® Signals
Selectrix sendet die 112 Einzelnen Kanäle (Adressen) als 16 Datenpakete (jeweils 7 Kanälen, 7*16=112), siehe
SX Datenstruktur im "SX Wiki".
Hier eine kurze Zusammenfassung.
Der SX Bus besteht aus dem Taktsignal (=T0 genannt), dem Datensignal T1 (das die Zentrale sendet) und dem "Rücksignal" (welches zB die Handregler auf den Bus legen). Wir beschäftigen uns hier mal nur mit dem Takt und den Daten, die von der Zentral kommen.
Das Taktsignal ist jeweils 10 usec auf 0 (=0V), dann 40 usec auf 1 (=+5V) (d.h. die Taktfrequenz ist 20KHz (nicht allzuhoch, deshalb ist die Dekodierung in einem Controller mit 16Mhz Taktrate vom Timing her unproblematisch).
TODO bild vom Scope einfügen
Um in einem seriellen Datenstrom feststellen zu können, wo man sich gerade befindet, braucht es eine Synchronisation. Das SX Protokoll definiert als SYNC Signal die Bitfolge "0 0 0 1" - die sonst natürlich nicht vorkommen darf. Mit diesem SYNC beginnen jeweils die 16 Datenpakete.
Danach sendet SX eine sogenannte "Basisadresse", eine Zahl zwischen 0 und 15, die aussagt welches von den 16 Datenpaketen folgt. Die Codierung ist hier B3 B2 1 B1 B0 1 . (?gleissignal bit?)
Warum kommt die SYNC Bitfolge sonst nicht vor?
SX sendet nicht immer acht Bit (=1Byte) (anders als zB RS232), sondern sendet immer nur 2 Bit Daten, auf die dann wieder eine logische 1 folgt, daher kann die SYNC Bitfolge im Datenstrom nicht auftauchen.
Beispiel: das Byte 43 (decimal), soll gesendet werden, die Bitfolge ist also 0 0 1 0 1 0 1 1 = (32+8+2+1) = 43.
Daraus macht SX 0 0 1 1 0 1 1 0 1 1 1 1 = so werden die Daten"Bytes" also immmer zu 12 bits verlängert und die SYNC Folge kann im normalen Datenstrom nicht vorkommen.
Dekodierung im Programm
Mit der steigenden Flanke vom Taktsignal T0 triggere ich den Interrupt (INT0) des uC
attachInterrupt(0, sxisr, RISING);
jetzt wird alle 50usec die Routine "isr" aufgerufen und es kann jeweils das zughörige Datenbit eingelesen werden
_bit=digitalRead(SX_DATA);
....
bitWrite(_data,0,_bit); // schreibt das gelesene Datensignal "_bit" an
// die Position 0 im Byte "_data"
In den Routinen switchAdr() und switchData() werden die Adressbits und dann jeweils die 7 Datenbytes dekodiert.

Nachdem ein Datenbyte komplett gelesen ist, wird es in die Variable _sx[channel] gespeichert.
Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer