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.
    Innerhalb dieser VID=13 belegen OpenDCC-Projekte die Produktkennungen 100 ... 199. Für jede Baugruppe ist eine individuelle Seriennummer erforderlich, diese kann mit dem nachfolgenden Generator erzeugt werden.

Produktkennungen von OpenDCC-Baugruppen

    VIDPIDKlassenProduct
    13101 (0x65)MGBM16TC, 16-64facher Railcom-Melder. (Evaluierungsmodul, Stand-Alone)
    13102 (0x66)IMGBM16TC, 16-64facher Railcom-Melder mit Interface.
    13103 (0x67)MBGBMBoost, 16-48facher Railcom-Melder, integrierter Booster
    13104 (0x68)IMBGBMBoost, 16-48facher Railcom-Melder, integrierter Booster, Interface
    13105 (0x69)MBiDiB-S88-Brigde
    13106 (0x6a)SBiDiB-IO16 (Schalt-Knoten mit 4 Servos, 16 IO)
    13107 (0x6b)SLightControl 1 (Lichtsteuerung mit 32 LEDs, 16 Universalausgänge, 4 Servos)
    13108 (0x6c)SMoBaList (Lichtsteuerung mit 24 Ausgängen)
    13112 (0x70)-BiDiBOne nur Bootloader
    13113 (0x71)SBiDiBOne OneTester: 24 LED-Testboard
    13114 (0x72)IBiDiBOne OneHub: BiDiBus Hub
    13115 (0x73)SBiDiBOne OneDMX: DMX Controller, 64 DMX Kanäle, 8 Taster
    13116 (0x74)-BiDiBOne default Produktkennung, noch keine Funktionen
    13117 (0x75)-BiDiBOne Control
    13119 (0x77)-StepControl 1 nur Bootloader
    13120 (0x78)SMStepControl 1 Schrittmotorsteuerung für Drehscheiben / Schiebebühnen / Segmentbühnen
    13121 (0x79)S- OneST: 4-fach Weichen- und Servodekoder mit Herzstück-Polarisierung
    13122 (0x7A)SBiDiBOne OneDriveTurn: Weichen- und Servodekoder mit Lageüberwachung (16 IO, 8 Servo, 8 Out für Weichenmotoren)
    Bedeutung der Abkürzungen bei den Klassen: I: Interface, M: Melder, S: Schalten, B:Booster

Seriennummern für OpenDCC-Produkte

    Wie funktioniert es?
  • 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.

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.
    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 http://opendcc.de und http://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.

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=0x8101fe
    Beim Builder der hex-Dateien muß man nun dafür sorgen, dass die Seriennummer nicht mit reingepackt wird:
      HEX_FLASH_FLAGS += -R .ee_serial
    Wenn man nur die Seriennummer erzeugen will, dann muss man die Zeile
      HEX_EEPROM_FLAGS = -j .eeprom 
    durch folgende Zeile ersetzen:
      HEX_EEPROM_FLAGS = -j .ee_serial 
    Das 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...)