Forum: Haus & Smart Home 12 Bit schalten Protokoll idee


von Rooolaand (Gast)


Lesenswert?

Ich plane gerade eine Bussteuerung. Nun habe ich einige fragen zur 
Kommunikation der Module. Das ganze beruht auf einem Rs485 Bus.

Angedacht Relaiskarten (12 Relais) und einige Schalter jeweils teils mit 
Relais und Bus Anbindung.

Die Schalter haben einstellbare Programme um an mehrere Verbraucher zu 
senden. Dadurch ist die Fehleranfälligkeit geringer als bei einer 
Zentralen Steuerung.

Aber was sende ich eigentlich der Relaiskarte in Binär Signal 12bit 
(+Adresse & crc) wäre kurz und schnell Dafür müsste allerdings der 
Sender wissen wie die Bits gerade stehen welche nicht verändert werden 
sollen. Das wird Schwierig wenn mehrere Sender ein Signal schalten.
Vorher abfragen wie die Bits stehen ?
Oder gleich die zu ändernde Bitnummer senden? da wird der 
Kommunikationsbedarf recht lang.

Gibt es eine Möglichkeit dazwischen die mir gerade nur nicht einfällt?

von Joachim B. (jar)


Lesenswert?

Rooolaand schrieb:
> Angedacht Relaiskarten (12 Relais) und einige Schalter jeweils teils mit
> Relais und Bus Anbindung.

ist mir noch zu unklar,

in der Prüftechnik waren die Relais direkt am Controller oder PC und da 
wusste man wie die stehen (ob on oder off)

Das hier liest sich so als wenn jede Relaiskarte einen µC oder 
Controller hat, ergo kann man dem Relais setzen senden oder rücksetzen 
oder abfragen.

von Peter II (Gast)


Lesenswert?

Rooolaand schrieb:
> Oder gleich die zu ändernde Bitnummer senden? da wird der
> Kommunikationsbedarf recht lang.

warum? kann man ja in ein Packet stecken.

[ID][LEN][BitNR][Wert][BitNr2][Wert]...CRC

von Rooolaand (Gast)


Lesenswert?

Peter II schrieb:
> [ID][LEN][BitNR][Wert][BitNr2][Wert]...CRC

Aber falls dann 10 Bit geschalten werden sollten besteht die kette schon 
aus 20+ Byte. Finde ich schon recht lang eignetlich.

Jeder Busteilnehmer hat einen Controller (Avr) und die Relaiskarte weiß 
auch was gerade an oder aus ist. Aber die anderen Busteilnehmer (andere 
avr's) wissen das leider nicht.

von Joachim B. (jar)


Lesenswert?

Rooolaand schrieb:
> Jeder Busteilnehmer hat einen Controller (Avr) und die Relaiskarte weiß
> auch was gerade an oder aus ist. Aber die anderen Busteilnehmer (andere
> avr's) wissen das leider nicht.

die anderen können ja auch am Bus lauschen und wissen es dann müssen 
sich ja nicht angesprochen fühlen.

von Peter II (Gast)


Lesenswert?

Rooolaand schrieb:
> Aber falls dann 10 Bit geschalten werden sollten besteht die kette schon
> aus 20+ Byte. Finde ich schon recht lang eignetlich.

dann übertrage eine Bitmaske. Also zu jeden Bit noch ein Bit was anzeigt 
ob sich der wert ändern soll.

12Bit Maske
001001001011

12bit Daten
000001001000

das sind dann nur 24bit. wobei man die Daten noch kürzen könnte auf die 
Bits die sich ändern sollen.

von Peter II (Gast)


Lesenswert?

Wie willst du das Problem "Kollision" ohne einen Master lösen?

von Ernst O. (ernstj)


Lesenswert?

Überlege mal, was passiert, wenn du die bits die du ändern willst auf 1 
setzt und da so entstandene "Datenwort" per logischer Operation bit für 
bit mit dem bestehenden Zustand verknüpfst. Welche gefällt dir am 
besten?

von Rooolaand (Gast)


Lesenswert?

Peter II schrieb:
> dann übertrage eine Bitmaske. Also zu jeden Bit noch ein Bit was anzeigt
> ob sich der wert ändern soll.

Genial :) Danke so habe ich nur ganz wenige Byte bei vollem Komfort 3 
Byte + Rest kann ich sicher noch verschmerzen.
Aber dennoch die frage wie könnte man das kürzen? Das geht nur wenn ich 
garnicht bis adresse 12 ändern möchte oder?
Zb 8 bit für nur in den ersten 4 was zu ändern?

von Rooolaand (Gast)


Lesenswert?

Peter II schrieb:
> Wie willst du das Problem "Kollision" ohne einen Master lösen?

Über eine Rückantwort (Ack) vom Empfänger. Was mich neben dem Ram daran 
hindert das "fremde" geräte die Zustände sicher mitlesen.

von Peter II (Gast)


Lesenswert?

Rooolaand schrieb:
> Genial :) Danke so habe ich nur ganz wenige Byte bei vollem Komfort 3
> Byte + Rest kann ich sicher noch verschmerzen.
warum 3 Byte. 24bit brauchen doch insgesamt nur 3byte?

> Aber dennoch die frage wie könnte man das kürzen? Das geht nur wenn ich
> garnicht bis adresse 12 ändern möchte oder?
> Zb 8 bit für nur in den ersten 4 was zu ändern?
Warum muss es denn so kurz sein? Die 1bit Kompression wurde ja schon 
erfunden nur am entpacken scheitert es ja noch.

Es macht denke ich keine sinn mehr noch mehr zu sparen, dafür müssen man 
wissen wie oft sich welche Anzahl von bits ändert und das Protokoll 
dafür auslegen.

von Peter II (Gast)


Lesenswert?

Rooolaand schrieb:
>> Wie willst du das Problem "Kollision" ohne einen Master lösen?
>
> Über eine Rückantwort (Ack) vom Empfänger. Was mich neben dem Ram daran
> hindert das "fremde" geräte die Zustände sicher mitlesen.

und wenn nichts kommt, dann senden beiden wieder gleichzeitig.

von Michael R. (mr-action)


Lesenswert?

Warum sendest du nicht einfach, das Schalter X gedrückt wurde und lässt 
den µC bei den Relais entscheiden, welches jetzt an oder aus geschaltet 
wird? Der weiß ja auch den aktuellen Zustand aller seiner Relais...

Wenn ein Schalter auf 3 Relaiskarten Relais schalten soll, musst du dann 
bei einer Änderung zwar drei µC neu programmieren und nicht nur den 
einen im Schalter, aber du wirst auf dem Bus ja sicher eh jedem Board 
einen Bootloader spendieren, da is das dann ja nicht das große 
Problem...

Und wenn du die Relais über den Bus konfigurieren kannst (also sagen, 
Relais1 auf Relaiskarte2 gehört zu Schalter A, usw.), wäre es ja noch 
einfacher...

viele Grüße
Michael

von Ernst O. (ernstj)


Lesenswert?

Warum so kompliziert?

Sende eine Bitmaske, in der alle Bits gesetzt sind, die verändert werden 
sollen. Alle anderen Bits bleiben auf "0". Diese Bitmaske sende an alle 
Relais. An jedem Relais wird diese Information per XOR mit dem 
vorherigen Schaltzustand per XOR verknüpft. Empfängt das Relais auf 
seinem Kanal eine "1", wechselt es den Zustand. Wenn der vorher "an" 
war, wird er "aus" und umgekehrt.

Die Schalter und die Relais können alle identisch sein, es muss nur 
programmieerbar (oder "jumperbar") sein, auf welchem Kanal ein Schalter 
schaltet bzw auf welchem Kanal ein Relais sich angesprochen fühlt.

von Peter II (Gast)


Lesenswert?

Ernst O. schrieb:
> Sende eine Bitmaske, in der alle Bits gesetzt sind, die verändert werden
> sollen.

genau die Lösung wurde gestern Abend schon gepostet.

von Ernst O. (ernstj)


Lesenswert?

Peter II schrieb:
> genau die Lösung wurde gestern Abend schon gepostet.

Habe ich gesehen. Aber warum sprichst du von 24 Bits wenn es um 12 
Relais geht?

von Robin (Gast)


Lesenswert?

Ernst O. schrieb:
> Peter II schrieb:
>> genau die Lösung wurde gestern Abend schon gepostet.
>
> Habe ich gesehen. Aber warum sprichst du von 24 Bits wenn es um 12
> Relais geht?

Weil man dadurch nicht die zustände speichern muss und einfach sagen 
kann, welche an bzw aus geschaltet werden sollen.


Eine weitere möglichkeit wären 14 Bit, 12 Bit für die daten und 2 bit 
für die opperation. Also einschalten, ausschalten oder togglen.
Hat dann allerdings den nachteil, dass du um einen Aktor einzuschalten 
und einen anderen auszuschalten 28 + 2 mal header bit übertragen musst.

von Tek (Gast)


Lesenswert?

Ernst O. schrieb:

> Empfängt das Relais auf
> seinem Kanal eine "1", wechselt es den Zustand. Wenn der vorher "an"
> war, wird er "aus" und umgekehrt.


Damit kannst Du aber nur Toggeln, wenn mehrere Schalter auf ein Relais 
wirken will man aber vielleicht auch sicher Aus oder Ein schalten.

von Ernst O. (ernstj)


Lesenswert?

Tek schrieb:
> Damit kannst Du aber nur Toggeln, wenn mehrere Schalter auf ein Relais
> wirken will man aber vielleicht auch sicher Aus oder Ein schalten.

klarer Fall. Aber für ein Beleuchtungsprojekt reicht das in den meisten 
Fällen.

von Pandur S. (jetztnicht)


Lesenswert?

Ich habe kuerzlich auch ein kommerzielle Relaiskarte gebaut. Das 
Protokoll ist von der Sorte
SYN STX len dest cmd data CRC

wobei data hier 16 bit in binaer darstellen. Es werden zZ 10 Relais 
gesteuert. Das Protokoll koennte is dieser ausfuehrung 16.

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.