DCC-Universaldecoder (Software)

DCC-Universaldecoder (Software)

Dem Beitrag →DCC-Universaldecoder Elektronik ist bereits das Schaltungsdesign zu entnehmen.

Download

Nun steht auf dem →DoktorRail github Repository auch die Software zum Download bereit:

  →Download-Beitrag DCC-Universaldecoder (Software)

Software-Architektur

Die folgenden Dateien bilden die Struktur ab:

  • DCC_Universal.c
  • pindefs.h
  • servo.c
  • servo.h

DCC_Universal.c

Nach der üblichen Initialisierung aller Module über initia() und der Definition der DCC-Funktionen Function1_Addr1_On() bis Function4_Addr1_Off() finden sich hier noch eine Kennlinie für das Ein- und Ausfaden der Signallaterne (curve() und loop_lantern()) sowie die Hauptfunktion main() und der Programmiermodus in program(). Letzterer wird dazu auch immer zyklisch durchlaufen. Wird nun das Setzen des Programmiertasters detektiert, wartet die Software auf das nächste empfangene DCC-Telegramm. Die Zieladdresse dieses Telegramms wird dann als neue Adresse im EEprom gespeichert. Dieses Feature lässt sich auch abschalten, indem im Kopf “#define EnableEEPROM” auskommentiert wird. Dann muss die DCC-Adresse fest gesetzt werden (z.B. über “DCC_ADDRESS1 = (ADDRESS_DCC_ACCESSORY >> 2);”).

Header-Dateien (pindefs.h & servo.h)

Diese Dateien enthalten die üblichen Definitionen: an welchem Pin ist der DCC-Eingang, an welchem Ausgang das Servosignal usw. Die servo.h enthält außerdem Angaben zu den Servoausschlägen und der Zeitdauer, die das Servo zum Stellen der Position benötigt.

Servo.c

Die servo.c besteht fast nur aus einem Timer-Interrupt. Dieser löst aus, wenn der Timer den gleichen Wert wie das Register Compare A erreicht. Damit wird der Servopin Timer-genau angesteuert bzw. das Servosignal mit hoher Wiederholgenauigkeit bzw. wenig Jitter erzeugt. Das verhindert unschönes “Stottern” des Servomotors bei längeren Ruhephasen.

Der Code ist bereits so vorbereitet, dass auch mehrere Servosignale erzeugt werden können. Dazu müssen nur entsprechend mehrere Definitionen in servo.h angelegt und in servo.c die Funktionen setServoPin() und setServoPinOff() angepasst werden.

DCC-Signaldecoder

Das Interpretieren der DCC-Telegramme erfolgt auf der Basis des bereits vorgestellten →DCC-Stacks. Das funktioniert sehr zuverlässig.

Praktischer Einsatz

Der Decoder erfüllt seit einigen Jahren seinen Dienst an einem Form-Hauptsignal. Zusätzlich wird auch die Signallaterne über den Dekoder gesteuert. Logisch werden also zwei Magnetartikel benötigt: Einer für die beiden Servo-Endstellungen und einer für die beiden Lichtzustände.

Offene Punkte

Eine wichtige Funktion hat der Decoder (noch) nicht: Er speichert keine Zustände über das Stromabschalten hinaus. Das bedeutet, nach dem Einschalten ist das Signal immer auf Halt und die Signallaterne immer aus, egal wie der Zustand vor dem Ausschalten war. Das kann man aber mit Hilfe von EEprom-Speicher lösen. Ich habe mir diese Arbeit bisher erspart, da das Signal nur bei Zugfahrten Fahrt zeigt und bei mir vor dem Ausschalten der Anlage immer wieder auf Halt gesetzt wird.

Fazit

Die Software zum DCC-Universaldekoder ist modular und übersichtlich gestaltet. Mehrere Servos lassen sich optional schalten; Digitalausgänge sowieso. Eine gute Basis für vielseitige Anwendungen rund um die MoBa. Viel Spaß damit wünscht



Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.