Forum: Mikrocontroller und Digitale Elektronik Brauche Hilfe bei Festlegung eines Protokolls für einen Steuerungsbus


von David .. (david1)


Lesenswert?

N' Abend.

Ich bastel im Moment an einem System mit RS485.

Das RS485-System soll dazu dienen an meiner Modellbahn Lichter und 
andere Verbraucher zu steuern.

Nun überleg ich mir wie das Protokoll aussehen soll.

Auf der Hardwareseite gibts im Moment noch nix, klar ist nur das RS485 
und AVR's zum Einsatz kommen werden.

Aber Schlussendlich werd ich mir wohl Module mit 8-Ausgängen basteln.
Zur Adressierung gibts nun zwei Möglichkeiten, entweder ähnlich wie bei 
DMX eine Startadresse festlegen für den ersten Ausgang, oder jedes Modul 
bekommt eine Adresse und die Ausgänge werden durchs Protokoll 
festgelegt.

Also bei der DMX ähnlichen Variante würde also jeder Kanal eine eigene 
Adresse bekommen, also das erste Modul nimmt somit 8-Kanäle in Anspruch, 
bei der anderen Variante bekommt jedes Modul eine Adresse und die 
8-Kanäle werden dann durchs Protokoll angesprochen.

Hab mir das Protkoll so vorgestellt:
ClientAdresse:AktorAdresse(welcher Ausgang angesprochen werden 
soll)-Aktion(z.B. Port schalten, oder PWM)-AktionsWert;

Das wäre für Möglichkeit 2.

Habt ihr evtl. Verbessrungsvorschläge?


Gruß
david

von Armin (Gast)


Lesenswert?

DMX geht gut bis 512 Geräte
Warum ändern, wenn das passt?

Grund da was zu drehen sehe ich nur, wenn du sagst du hast wirklich 
vieeeel mehr Lichter. Dann könnte man anfangen die Daten in 
"7bit-Helligkeitsinformation" zu zerlegen und dadurch weitere "Aktoren" 
ansprechen

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Dann bräuchte jede Schaltstelle einen Prozessor.

Nur so als Idee: PCA8574, ist ein IO-Chip mit 8 IOs, I²C.

von David .. (david1)


Lesenswert?

Also jede Schaltstelle wird eh nen nen eigenen Prozessor bekommen da das 
ganze so aufgebaut werden soll das ich die 8 Ausgänge nicht nur ein oder 
aus schalten möchte, sondern auf dem Chip bestimmte Programme sind, wie 
z.B. Lauflicht, oder Brandflackern etc.
Deshalb wird eh ein Chip auf jedem Aktor fällig.


DMX ist etwas Problematisch, da ja jeder Aktor 8-Ausgänge hat und 
dementsprechend nach 64 Aktoren Schluss. Soviele werdens zumindest bei 
mir erstmal nicht werden, aber für jeden Ausgang eine Adresse zu 
belegen, dass finde ich etwas "verschwenderisch", da ich das ganze gerne 
so halten würde das man theoretisch beliebig viele Aktoren anschliesen 
kann, und alles gleichzeitig halbwegs übersichtlich bleibt.

Somit hätte jeder Aktor auch nur eine Adresse, was ich im Gegensatz zu 
DMX übersichtlicher finde da ich evtl auch Aktoren mit mehr als 8 
Ausgängen einsetzen kann ohne eine neue Startadresse vergeben zu müssen.

Ich werde die nächsten Tage mal mit ersten Tests beginnen und dann 
weiter berichten.


Gruss
David

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich kenne mich mit so einem AVR nicht so gut aus.
Wie viele PWM Ausgänge hat ein AVR?

von David .. (david1)


Lesenswert?

Hardwaremäßig 3, ich möcht ja auch nicht alle Kanäle dimmen können, 
auserdem gibts ja wenn ichs wirklich bräuchte ja auch Software-PWM, 
müsst ich mich bei Gelegenheit mal in hinsicht auf Bascom damit 
auseinandersetzen.

von Christian B. (casandro)


Lesenswert?

Also erstmal solltest Du Dir überlegen, wie Du das verkabeln möchtest. 
Willst Du einen Bus haben, oder ist Dir ein Ring lieber. Über einen Ring 
kannst Du relativ einfach ohne Kollisionen per Token Passing auch 
Rückmeldungen bekommen.

An sonsten würde ich das so machen:
1. Die Schnittstelle läuft in einem Modus, in dem Du ganze Bytes 
verarbeitest. (So wie Du auch mit der seriellen Schnittstelle eines PCs 
sprechen würdest)

2. Du definierst ein Startzeichen, welches den Begin eines Paketes 
darstellt. Dieses Zeichen darf sonst nicht in Deinen Botschaften 
vorkommen.

3. Du machst n Bytes Adresse. Bedenke, wenn Du mehr Bytes verwendest, 
tust Du Dir leichter bei der Adressvergabe. Im Ringkonzept kann man das 
aber auch automatisieren.

4. Du definierst entweder feste Paketlängen, oder überträgst eine Länge 
mit. Für Deine Anwendung wären feste Paketlängen wohl besser.


Für den Ring verbindest Du jeweils TX des einen Controllers mit RX des 
anderen. Wenn Du Bock hast, kannst Du auch noch einen Schalter einbauen, 
mit dem Du den Mikrocontroller überbrücken kannst.
Bekommst Du ein Byte am Eingang, so schaust Du, ob dass das Startzeichen 
ist. Das bestimmt den Anfang Deines Paketes. Normalerweise schickst Du 
alle Bytes, die Du bekommst, einfach so weiter. Du schaust dann nach, ob 
die Adresse Deine ist, und wertest dann gegebenenfalls die restlichen 
Bytes aus. Die schickst Du aber auch weiter, damit Geräte weiter hinten 
weiter Bytes bekommen, oder Du schickst das Startzeichen erst dann 
weiter, wenn Du Dir sicher bist, dass das Paket nicht für Dich ist.
Willst Du auch Rückmeldungen bekommen, so definierst Du einfach ein 2. 
Startzeichen, welches ein leeres Paket anzeigt. Immer dann, wenn Du vom 
Hauptrechner aus keine Daten schicken willst. Schickst Du leere Pakete, 
mit diesem Startzeichen. Kommt solch ein Paket bei einem Controller an, 
der gerade Daten los werden will, so kannst Der einfach das Startzeichen 
sowie die Leerbytes ersetzen und sein Paket in den Ring einfügen.

Im Prinzip kannst Du so mit relativ wenig Aufwand beliebig große Systeme 
aufbauen.

von David .. (david1)


Lesenswert?

Also deine Beschreibung ist grundsätzlich gut.

Allerdings halte ich das in manchen Teilen für Overkill.

Im Moment experementiere ich mit folgendem "protokoll"

Adresse:Befehl(z.B.: set on 2[schaltet ausgang 2 an])

Das ganze soll ja nur als "einfache" Steuerung der Lichter und Aktionen 
auf meiner Modellbahn dienen, so wäre z.B. auch ein Schrittmotor Aktor 
denkbar an den ich 3 Schrittmotoren anschliesen kann.
Oder auch Servos sind denkbar bzw, werden sicherlich einen großen Teil 
der ganzen Geschichte ausmachen, da würde ich das ganze dann so machen:
Adresse:ServoNr-Winkel

Aber erstmal weiter experementieren ;)

Und schonmal danke für die Antworten, sind sehr hilfreich und ich werd 
sicher einiges davon aufgreifen :)

Gruß
David

von Christian B. (casandro)


Lesenswert?

Eine Konsole ist relativ viel Arbeit. Byteweise zu arbeiten wäre 
sicherlich einfacher.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ein STM32 hat 4 Timer und somit 16 PWM Ausgänge. Ich selbst habe 
damit schon mal 12 LEDs mit unterschiedlicher Helligkeit gedimmt und 
einen Pipser mit Frequenz-Ausgang...
Nur so als Verbesserungsvorschlag.

von David .. (david1)


Lesenswert?

Werde eigentlich schon bei den AVRs bleiben da ich mit dafür nen 
passenden Programmer habe und mich schon etwas länger damit beschäftige 
;)

Gruss
David

von Route_66 (Gast)


Lesenswert?

Hallo!
vielleicht ist dies eine Anregung:

http://www.ndholmes.com/pmwiki.php/Electronics/MRBus

MRBus von "model railroad"

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.