OpenDCC: BiDiB
Einleitung
- Für alle Baugruppen, welche BiDiB unterstützen, ist die Vergabe
einer eindeutigen Produktkennung zwingend erforderlich. Die Produktkennung
besteht aus Vendor ID (VID = Herstellerkennung), Product ID (PID = Produktkennung) und Seriennummer.
Die Vendor-ID ist die normale DCC-Herstellerkennung, für Selbstbaudekoder ist hier die Nummer 13 vorgesehen.
Aufteilung des PID-Raumes bei Vendor-ID 13
- Innerhalb dieser VID=13 ist der Bereich nach PID wie folgt aufgeteilt:
VID | PID | Klassen | Product | ||
---|---|---|---|---|---|
13 | 0 .. 49 | I | PID für Entwicklung | ||
13 | 50..100 | I | reserviert | ||
13 | 101 (0x65) | I | BiDiB-IF, kleines Evaluierunginterface, USB | ||
13 | 102 (0x66) | IM | GBM16TC, 16-64facher Railcom-Melder mit Interface. | ||
13 | 103 (0x67) | MB | GBMBoost, 16-48facher Railcom-Melder, integrierter Booster | ||
13 | 104 (0x68) | IMB | GBMBoost, 16-48facher Railcom-Melder, integrierter Booster, Interface | ||
13 | 105 (0x69) | M | BiDiB-S88-Brigde | ||
13 | 106 (0x6a) | S | BiDiB-IO16 (Schalt-Knoten mit 4 Servos, 16 IO) | ||
13 | 107 (0x6b) | S | LightControl 1 (Lichtsteuerung mit 32 LEDs, 16 Universalausgänge, 4 Servos) | ||
13 | 108 (0x6c) | S | MoBaList (Lichtsteuerung mit 24 Ausgängen) | ||
13 | 112 (0x70) | - | BiDiBOne | nur Bootloader | |
13 | 113 (0x71) | S | BiDiBOne | OneTester: 24 LED-Testboard | |
13 | 114 (0x72) | I | BiDiBOne | OneHub: BiDiBus Hub | |
13 | 115 (0x73) | S | BiDiBOne | OneDMX: DMX Controller, 64 DMX Kanäle, 8 Taster | |
13 | 116 (0x74) | - | BiDiBOne | default Produktkennung, noch keine Funktionen | |
13 | 117 (0x75) | - | BiDiBOne | Control | |
13 | 119 (0x77) | - | StepControl 1 | nur Bootloader | |
13 | 120 (0x78) | SM | StepControl 1 | Schrittmotorsteuerung für Drehscheiben / Schiebebühnen / Segmentbühnen | |
13 | 121 (0x79) | S | - | OneST: 4-fach Weichen- und Servodekoder mit Herzstück-Polarisierung | |
13 | 122 (0x7A) | S | BiDiBOne | OneDriveTurn: Weichen- und Servodekoder mit Lageüberwachung (16 IO, 8 Servo, 8 Out für Weichenmotoren) | |
13 | 123 (0x7B) | S | STµ | STµist ein Clone der OneST (4 Servos, 8 Relais, v. Michael Volk) | |
13 | 124 (0x7C) | M | S88-TLE | S88-TLE: 16 TLE Inputs direkt, 1 S88 Strang | |
13 | 125 (0x7D) | S | Boot644P | Bootloader für Atmel 644P-Prozessoren | |
13 | 126 (0x7E) | S | Mobalist644 | Mobalist644: 24 Schaltausgänge/Lichtausgänge (wie Mobalist, aber auf 644p-Basis) | |
13 | 127 (0x7F) | S | MobaLED | MobaLED: 24 LEDs, direkt angesteuert. | |
13 | 128 (0x80) | S | MobaIO24 | MobaIO24: 24 frei konfigurierbare Ports | |
13 | 129 (0x81) | S | BiDiBOne | OneWS: 64 LEDs nach WS2812-Standard, Gruppenansteuerung | |
13 | 130 (0x82) | S | ST4 | ST4: 4 Servos, 4 Relais zur Herzstückpolarisation | |
13 | 131 (0x83) | - | IF2 | nur Bootloader | |
13 | 132 (0x84) | I | IF2 | IF2: kleines USB-Interface with DCC Generator | |
13 | 133 (0x85) | - | OpPanel | OpPanel: Evaluierungsmodul für lokale Eingabe | |
13 | 134 (0x86) | S | GBM16TS | GBM16TS ist ein Belegtmelder (16 Kanäle, Railcom, Standalone) | |
13 | 135 (0x87) | S | Octagon-1 | Eine Kirmessteuerung, speziell für Lichteffekte | |
13 | 136 (0x88) | IB | BiDiB-Pi1 | Ein BiDiB-Shield für den Raspberry Pi3, mit Interface und Booster | |
13 | 146 (0x92) | S | OpenSwitch | Dekoder mit 8 Outputs / 4 Weichenantrieb | |
13 | 147 (0x93) | - | OpenSwitchBoot | Bootloader zu OpenSwitch | |
13 | 148 (0x94) | - | BiDiB-Handregler-Interface | Software Adapter Roco Z21-LAN und netBiDiB | |
13 | 149 (0x95) | - | TrackEmu 1 | Komponente des DCCtest-Platzes; Gleissimulation | |
13 | 206 (0xCB) | S | BiDiB-RS-GW | BiDiB-RS-GW, Interface für bis 1024 RS-Rückmelder | |
13 | 205 (0xCD) | S | BiDiBOne | NeoControl_Light: Lichtsteuerung, mit WS2811 / Neopixel, Einzelansteuerung | |
13 | 206 (0xCE) | S | NeoControl | NeoControl_Signal: Lichtsteuerung, mit WS2811 / Neopixel, Einzelansteuerung und Signale |
Seriennummern für OpenDCC-Produkte
-
Für jede Baugruppe
ist eine individuelle Seriennummer erforderlich, diese kann mit dem nachfolgenden Generator
erzeugt werden.
- In den Downloaddateien zu OpenDCC-BiDiB-Projekten ist die VID und PID bereits integriert, jedoch ist keine Seriennummer enthalten. Die Downloaddateien können daher problemlos auf den Prozessor geladen werden, eine eventuell bereits vorhandene Seriennummer wird dabei nicht überschrieben.
- Wenn die Firmware beim Starten keine geladene Seriennummer erkennt, blinkt ein Fehlercode und der Betrieb wird blockiert. Ohne Seriennummer läuft die Firmware nicht!
- Zu jeder Baugruppe muß mit dem nachfolgenden Generator einmalig eine Seriennummer erzeugt werden.
- Die erzeugte Seriennummer bitte notieren und auch auf der Baugruppe vermerken.
- Der Generator erzeugt ein Intel-Hex-File mit dem Inhalt der Seriennummer. Diese wird als Text dargestellt und auch als Download angeboten.
- Die Seriennummer muß auf dem üblichen Weg (also via Programmiergerät (z.B. AVRmkII) oder Bootloader) in die Baugruppe eingespielt werden, andere Inhalte werden dabei nicht überschrieben. Das muß nur einmalig erfolgen.
Wie funktioniert es?
Generator
- Um den Generator benutzen zu können, ist eine Anmeldung erforderlich. Hierbei ist die Benutzerkennung und
das Passwort vom OpenDCC-Forum zu verwenden.
Wenn Sie aktuell im Forum angemeldet sind,
wird die Anmeldung hier übernommen.
(Datenschutzhinweis: mit der Benutzung des Seriennummergenerators erklären sie sich mit der Speicherung der hierfür
benötigten Daten (Anmeldedaten, erzeugte Seriennummern) auf unserem Server einverstanden. Wenn Sie damit nicht einverstanden sind,
dürfen Sie den Seriennummergenerator nicht verwenden).
Wichtig: nur neue Seriennummern generieren, wenn tatsächlich eine Baugruppe gebaut wird. Hinweis:
Sollte die Anmeldung nicht funktionieren, so kann eine zu restriktive Einstellung des Browsers die Ursache sein. Z.B. unter IE9 und Win7 muß man die beiden URLs https://opendcc.de und https://fichtelbahn.de in Liste der vertrauenswürdigen Sites aufnehmen. Zu finden ist diese Einstellung unter "Interneteinstellungen" - "Sicherheit", dort unter "vertrauenswürdige Sites" die beiden Sites hinzufügen. Dadurch werden die Restriktionen gelockert und der Datenaustausch zwischen den beiden Domains wird zugelassen.
PIDs für Entwicklung und rein privatem Gebrauch
-
Es ist zwingend erforderlich, dass jede Baugruppe eine eigene Nummer hat. Trotzdem kann es in der Entwicklungsphase oder
für rein privaten Gebrauch wünschenswert sein, keine 'offzielle' Nummer zu verwenden. Der Bereich 0..49 ist hierfür freigehalten,
für diese PID gelten folgende Regeln:
- Sie dürfen frei für Entwicklungszwecke benutzt werden.
- Baugruppen mit dieser Kennung dürfen nicht 'geteilt' werden: d.h. sie dürfen nicht verkauft/verschenkt werden, es darf davon kein fertiges Image zum Nachbau ins Netz gestellt werden.
- Zugehörige Firmware und CV Beschreibungen sind strikt privat zu halten.
- Alle Anwender einer solchen PID müssen sich der Gefahr möglicher Unique-Kollisionen bewußt sein.
Hintergrundinformationen zum AVR-Studio
- Nur für Programmierer wichtig!
Die Seriennummer wird in den beiden höchsten Bytes des EEPROMs abgelegt. Das wird durch eine eigene section .ee_serial und entsprechende Linkeranweisungen festgelegt. Im Quellcode ist also folgende Zeile erforderlich:
unsigned int e_serial[] __attribute__((section(".ee_serial"))) = {0};Nun muß man diese Seriennummer im Linker an die richtige Stelle lenken, dabei sind folgende Änderungen am makefile erforderlich: Im Bereich des Linkers ist eine Zeile hinzuzufügen, welche die neue Section mit aufnimmt und zuweist:
LDFLAGS += -Wl,-section-start=.ee_serial=0x8101feBeim Builder der hex-Dateien muß man nun dafür sorgen, dass die Seriennummer nicht mit reingepackt wird:
HEX_FLASH_FLAGS += -R .ee_serialWenn man nur die Seriennummer erzeugen will, dann muss man die Zeile
HEX_EEPROM_FLAGS = -j .eepromdurch folgende Zeile ersetzen:
HEX_EEPROM_FLAGS = -j .ee_serialDas erzeugte eep-file für das eeprom sieht dann z.B. so aus:
:0201FE0055AA00
Ein andere Möglichkeit ist die Benutzung einer Compiler-Variable EEPROM_SIZE.
#if defined (__AVR_ATmega162__) #define EEPROM_SIZE 512 #else #warning undefinded AVR #endif
Diese Variable wird nun benutzt, um die Serialnumber aus den EEPROM zu lesen:
my_unique_id.product_serial = eeprom_read_word((unsigned int*)(EEPROM_SIZE-2));
Hinweis: die EESAVE-Fuse muß gesetzt sein, damit die Seriennummer den Befehl 'chip erase' überlebt.
Alternativen zum Seriennummergenerator
- Achtung: dieser Weg ist für normale Anwender absolut nicht empfohlen,
ich notiere das hier nur als Hinweis für Anwender, welche
ganze Baureihen oder eigene Baugruppen erzeugen!
1. Man benutzt einen hex-file Manipulator, hier verwenden wir srecord. (win) Dieses Programm bietet sehr weitreichende Möglichkeiten, an Binärformaten rumzuschrauben.
2. Nun erzeugt man sich mit folgendem Befehl eine Datei:
srec_cat -generate 0x0CFE 0x0D00 -constant-l-e 0x1234 2 -o my_serial.hex -intel -address-length=2
Was bedeutet das im Einzelnen?
srecord soll was erzeugen, und zwar von Adresse 0xCFE bis 0x0D00 (eben der Bereich der Seriennummer) und das mit einer Konstante füllen (-constant), diese soll little endian sein. 0x1234 ist also die Konstante und damit die Seriennummer. -o: jetzt kommt die Outputdatei (my_serial.hex) und diese soll bitte im Intel-Hex-Format mit kurzer Adresse sein.
Beim Einsatz im Batch muß man das passend mit einer Umgebungsvariablen befüllen. (for i=1...)