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