Selbstgelötet, nochmal gespart :

SELECTRIX SX-4-fach-Servo-Decoder

Der Materialaufwand für den Eigenbau-4-fach Decoder ist kaum größer als bei dem 1-Kanal Typ.
Die Anzahl der Lötstellen und Drahtbrücken ist natürlich gestiegen.
Die Kosten pro Kanal sinken auf ca. 0.50 € + Servo + Weiche + Kabel + Verteileranteil.

Beibehalten habe ich das Prinzip der offline Programmierung des Microprozessors.

Schaltung:


Angeschlossen wird der Decoder am SX-Servoverteiler mit einem USB Standardkabel Stecker Typ A
auf Stecker  Typ B :

Pin 1        SX-Taktsignal
Pin 2        SX-Datensignal
Pin 3        GND
Pin 4        +5 Volt ( vom USB-Verteiler )

Die Größe des Stützkondensators C1 47µf ist unkritisch.
Der Micro ATtiny2313 taktet mit 8Mhz, d.h. die "Fuse" interner RC-Osc. muss programmiert werden.
Wichtig ist auch, die "Fuse" für die interne Taktreduzierung NICHT zu programmieren.
( ATMEL STK 500 -> Advanced -> Haken im Kästchen -> Program )

Aufbau:



Für den Anschluss der Servos ( JR-Stecker) verwende ich 1-fach Stiftleisten 2.54 mm, 3 x 4 Stifte.
Der ATtiny2313 steckt in einer "Präzisionsfassung", weil dieser Sockeltyp Platz lässt für die
Verbindungsdrähte zwischen den Pin's. IC-Pin1 beim USB Stecker.

Es ist günstig, den Sockel nicht bis zum "Anschlag" einzudrücken, das gibt Raum für die Drähte.

Basis ist eine 2.54 mm Lochrasterplatine, 22 x 4 Pads.
Die Bestückung beginnt mit der USB-Printbuchse Typ B. Das Rastermaß der Pins passt nicht genau,
die Stifte müssen etwas größeren Abstand bekommen. Fixierlaschen verlöten
Dann die drei 4-plg. Stiftleisten einlöten.
Verbindungen Pin2, +5V Servo, sowie Pin3, GND mit Blankdraht oder Lötbrücken.

Die Verbindungsleitungen sind 0.5mm Klingeldraht:

Pin1 Servo1 ->    an IC-Pin 15 ( OC1A )
Pin1 Servo2 ->    an IC-Pin 16 ( OC1B )
Pin1 Servo3 ->    an IC-Pin 14 ( OC0A )
Pin1 Servo4 ->    an IC-Pin   9 ( OC0B )

USB Pin1     ->    an IC-Pin    6 ( INT0 PD2  Takt )
USB Pin2     ->    an IC-Pin    2 ( PD0   Daten )

USB Pin4 +5V, rot      -> vor IC-Pin 1   -> nach IC-Pin11, vor Servo4 Pin1 durchstecken -> Servo4 Pin2
USB Pin3 GND, blau -> vor IC-Pin 20 -> nach IC-Pin10, vor Servo1 Pin1 durchstecken -> IC-Pin 10

Drähte so anordnen, dass IC-Sockelpins frei bleiben.

IC-Sockel einstecken, mit NICHT benutzten Pins fixieren, z.B. Pin 11, 12, 18, 19.
Blankdrahtverbindung IC-Pin1 -> Ic-Pin20 ( Reset auf +5V)

Drahtbrücke, blau, IC-Pin10 -> Servo4 Pin3 (GND)

Verbindungen IC-Pin 2, 6, 9, 14, 15, 16, ablängen, umbiegen und verlöten.
Stützkondensator  einbauen ( vor IC-Pin20 nach GND, +Pol zur Resetbrücke( 1 auf 20 ).

Nach gewissenhafter Sichtprüfung (Kurzschlüsse? vertauschte Pins?), Versorgungsspannung
testen. Programmierten ATtiny2313 aufstecken und evt. Schrumpfschlauch anbringen.


Software, Programmbeschreibung:

Der ATMEL ATtiny2313 hat 4 PWM Ausgänge die zur Erzeugung der Servoimpulse verwendet
werden. Allerdings hat das einen kleinen "Haken":

Timer0 hat nur 8-Bit Auflösung ( bis 255), Timer1 dagegen 10-Bit ( bis 1023 ).

Timer0 wird mit Prescaler 1/256 betrieben, was bei 8Mhz eine Zykluszeit von ca. 8 mSek ergibt.
Timer1 läuft mit Prescaler 1/64 und erzeugt ca 16 mSek Wiederholzeit.

Die nominale Impulslänge für die Mittelstellung ist 1,5 mSek.
Für Timer0 ist das  1.5/8 x 256     =  48 Ticks, ca. 31 µSek pro Tick.
Für Timer1 ist das 1,5/16 x 1024  =  96 Ticks, ca. 16 µSek pro Tick.

Eine N-Weiche wird mit +- 3Ticks Timer0 angesteuert werden, bzw. +- 6 Ticks bei Timer1.

Nach Reset und OHNE SX-Taktsignal erzeugen die Timer die Mittelstellung.

Im Quellprogramm sind die drei Positionswerte für jedes Servo einstellbar:

;** Servo 1 und 2 wird vom Timer1 gesteuert mit 10Bit Auflösung ****
;** Wiederholzeit ca. 16 MillSek., 1 Tick ca. 16 µSek. ****

.SET Pos1Lo         = 90
.SET Pos1Mitte     = 100
.SET Pos1Hi          = 110

.SET Pos2Lo         = 90
.SET Pos2Mitte    = 100
.SET Pos2Hi         = 110

;** Servo 3 und 4 wird vom Timer0 gesteuert mit 8Bit Auflösung ****
;** Wiederholzeit ca. 8 MillSek., 1 Tick ca. 32 µSek. ****

.SET Pos3Lo         = 45
.SET Pos3Mitte    = 50
.SET Pos3Hi         = 55

.SET Pos4Lo        = 45
.SET Pos4Mitte    = 50
.SET Pos4Hi         = 55

;* Nach Build und Programmieren Mittenposition OHNE SX-Bus-Signal testen.
;*
;***************************************************************************



Adressdefinition:

Der 4-Kanal Decoder übernimmt seine Datenbits entweder aus dem Low-Nibble oder dem
High-Nibble des Adress-Datenworts.
Zur Definition dient     ".SET Nibble =   0 oder 1 "

Aus der  Basisadresse ( z.B. 64 ) ergibt sich die Gruppenadresse und die Unteradresse.
Zur Definition dient     ".SET Gru = 00 bis 16"

Aus der Unteradresse ergibt sich die Unteradressgruppe und die beiden Register.
Zur Definition dienen ".DEF bitregLow = rLo   .DEF bitregHi     = rHi    .SET UagGru     = 0 oder 1"


;*************** Adressliste *********************************************
;
; Die Adresse bestimmt die Gruppennummer und die Unteradresse UA

; Gru = 15, 14, 13, 12, 11, 10, 09, 08, 07, 06, 05, 04, 03, 02, 01, 00

; UA6= 00, 01, 02, 03,  04,  05,  06,  07,   08,  09,  10,   11,  12,  13,  14,  15
; UA5= 16, 17, 18, 19,  20,  21,  22,  23,   24,  25,  26,   27,  28,  29,  30,  31
; UA4= 32, 33, 34, 35,  36,  37,  38,  39,   40,  41,  42,   43,  44,  45,  46,  47
; UA3= 48, 49, 50, 51,  52,  53,  54,  55,   56,  57,   58,  59,  60,  61,  62,  63
; UA2= 64, 65, 66, 67,  68,  69,  70,  71,   72,  73,  74,   75,  76,  77,  78,  79
; UA1= 80, 81, 82, 83,  84,  85,  86,  87,   88,  89,   90,  91,  92,  93,  94,  95
; UA0= 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111
;**************************************************************************


;**************************************************************************
;* Das Datenwort wird aus jeweils 2 Registern für 1 Unteradresse
;* gebildet
;**************************************************************************

; bitregLow:      bitregHi:    für: UaGru = 0

; r2 ---------------- r3 ---------- UA 0
; r5 ---------------- r6 ---------- UA 2
; r8  ----------------r9 ---------- UA 4
; r11 -------------- r12 -------- UA 6

; bitregLow      bitregHI:   für: UaGru = 1

; r4 ----------------r5 ----------- UA 1
; r7 --------------- r8 ----------- UA 3
; r10 ------------- r11 --------- UA 5

;***************************************************************************

.SET Gru             = 15
.DEF bitregLow = r5
.DEF bitregHi     = r6
.SET UagGru     =  0 
.SET Nibble       =  0 

Natürlich gibt es die Möglichkeit aus den Angaben "Adresse" und " Nibble" das Datenwort
dynamisch zu ermitteln. Der Hobbyelektroniker "will und soll" wissen, was Sache ist, trägt
die Werte "zu Fuß" ein, oder er programmiert selbst!

Das Assemblerprogramm gibt es hier : W_Deco_Vier.asm

( Die Formatierung passt im ATMEL AVR-Studio, nicht im Editor. )

Steinhart im Mai 2007