mat-spur1
                      
   NAVIGATION
Home
Spur 1
BR55 / G8.1 Umbau
BR80 Umbau
BR89 / T3 Umbau
T3 Schlepptender
E91 Umbau
V36 Umbau
V60 Umbau
V100 Umbau
Köf2 Umbau
Schweineschnauze
Wagenabstand
Servoansteuerung
SUSI Interface
TELEX-Schutz
Maxi-Decoder-Recycling
Bassanhebung
Gleisplan
Weichentuning
Weichenantrieb
Weitere Umbauten
Spur 1 Links
Kontakt
Impressum



Lokdecoder mit Sound können wahlweise integriert sein oder aber Soundmodul und Decoder sind zwei Bausteine, die über die SUSI Schnittstelle verbunden werden. Diese kann auch andere Modulfunktionen abdecken.
Das SUSI Datenformat ähnelt etwas dem im Microcontrollerbereich üblichen SPI Format - eine serielle Datenleitung sowie eine zweite "Clock"-Leitung, mit deren Impulsen die Daten übernommen werden. Neben den beiden Signalleitungen (5V Pegel) gibt es noch eine Masseleitung sowie eine Stromversorgungsleitung (typ. 12-18V).
Im SUSI Format werden für Soundfunktionen immer zwei bytes seriell gesendet (LSB zuerst), wobei das erste Byte den jeweiligen befehl enthält und das zweite Byte zusätzliche Parameter. Es gelten Beschränkungen für das timing der Signale.

Damit ist aber auch schon eine Einschränkung der SUSI-Soundmodule offensichtlich: Man kann sie nicht mit einfachen Schaltimpulsen wie zB von einem Taster oder einem Reedkontakt steuern, da man jedesmal die entsprechenden Impulsfolgen der benötigten Befehle auslösen muß. Dies wird durch das nachfolgende einfache Programm mit einem PICAXE Microcontroller gelöst.

Im vorliegenden Beispiel lautet das Rezept (Aufwand max. ca. 5 EUR):
Man nehme einen PICAXE 14M2 (oder einen anderen M2 Typ), spendiere ihm zwei externe Transistoren als OC Ausgänge, eine Tastaturmatrix zur Eingabe von 0-9 sowie ein Poti zur Einstellung der Geschwindigkeit. Das SUSI Soundmodul wird mit 15V Gleichspannung versorgt, der PICAXE mit 5V.
Ich habe ein Uhlenbrock 32300 mit T3-Sound angeschlossen und alle verfügbaren Sounds auf F1-F9 programmiert, F0 ist das Fahrgeräusch. Die CV-Einstellung im SUSI-Modul muß man über den entsprechenden Programmer oder über einen Decoder+Digitalzentrale vornehmen - dies kann das PICAXE Programm (noch) nicht.
Mit dem beiliegenden Programm kann dann das SUSI-Modul angesteuert werden.

Die Bilder zeigen die vom PICAXE erzeugten SUSI-Signale (für F9 on; blau=data, weiss=clock).




Damit kann man beispielsweise solchen Loks (Achtung Gartenbahner/Live-steamer!) ein SUSI Modul spendieren, die nicht über DCC/Motorola, sondern zB über Funk angesteuert werden, wahlweise mit Hilfe des 'pulsin' Befehls oder mit einem RC-Schaltmodul. Man muß dann nur das Programm je nach den zur Verfügung stehenden Schaltsignalen entsprechend anpassen. Wer mehr über die einfach in BASIC programmierbaren PICAXE's erfahren will, findet dies in meiner Linkliste.
Hier ist das Programm:

 Definitions:
 'Programm für PICAXE 14M2 mit 32 MHz und 3x4 Tastaturmatrix für F0-F9
 setfreq m32
 'bytes 0-1 reserviert für bits 0-15 für SUSI Datenausgabe
 symbol cmdbyte1=b0 : symbol cmdbyte2=b1 : symbol pulstime = b2
 symbol sendbit=b3 : symbol keyinput=b4 : symbol analogin=b5
 symbol counter=b6 : symbol countbyte=b7 : symbol funcval=b8

  input B.1 'Analog In 0-5V für Geschwindigkeit
 output B.2 '123 Tastaturmatrix
 output B.3 '456 Tastaturmatrix
 output B.4 '789 Tastaturmatrix
 output B.5 '*0# Tastaturmatrix
 output C.0 'data  (invertiert für externen BC550 OC-Ausgang (via 22 KOhm zur Basis, Collector mit 1KOhm an +5V, 470 Ohm vom Collector
zum SUSI-Modul))
 output C.1 'clock (invertiert für externen BC550 OC-Ausgang
(via 22 KOhm zur Basis, Collector mit 1KOhm an +5V, 470 Ohm vom Collector zum SUSI-Modul))
  input C.2 '147* Tastaturmatrix (mit Pulldown-Widerstand)
  input C.3 '2580 Tastaturmatrix
(mit Pulldown-Widerstand)
  input C.4 '369# Tastaturmatrix
(mit Pulldown-Widerstand)

 high C.0 : high C.1 '=Low hinter externem NPN Transistorausgang
 pulstime=64 '100 µs Clock-Puls
 write 0, 0 'Status F0-F4
 write 1, 0 'Status F5-F12
 write 2, 0 'Status Vloco 7bit
 
 'Initialisierung SUSI Modul
 pause 100 'Warten auf SUSI Modul Initialisierung
 cmdbyte1=%01100000 : cmdbyte2=%00000000 : gosub sendsusi : pause 100 'F 0-F 4 auf Null
 cmdbyte1=%01100001 : cmdbyte2=%00000000 : gosub sendsusi : pause 100 'F 5-F12 auf Null
 cmdbyte1=%01100010 : cmdbyte2=%00000000 : gosub sendsusi : pause 100 'F13-F20 auf Null
 cmdbyte1=%01100011 : cmdbyte2=%00000000 : gosub sendsusi : pause 100 'F21-F28 auf Null
 cmdbyte1=%00100100 : cmdbyte2=%00000000 : gosub sendsusi : pause 100 'Vloco   auf Null

Main:
 do
  gosub keyboard
  gosub keysend
 loop
end

keyboard:
 readadc B.1,analogin
 analogin=analogin/2
 keyinput=0
 for counter=1 to 4
  select counter
   case 1: high B.5
   case 2: high B.4
   case 3: high B.3
   else  : high B.2
  endselect
  if pinC.2 = 1 then : keyinput = counter*3-2 : endif
  if pinC.3 = 1 then : keyinput = counter*3-1 : endif
  if pinC.4 = 1 then : keyinput = counter*3-0 : endif
  low B.2 : low B.3 : low B.4 : low B.5
  if keyinput=11 then : keyinput=10 : endif
 next counter
return

keysend:
 select keyinput
  case 10
   read 0,funcval : funcval=funcval xor %00010000 : write 0,funcval
   cmdbyte1=%01100000 : cmdbyte2=funcval : gosub sendsusi
   do : gosub keyboard : loop until keyinput=0
  case 1
   read 0,funcval : funcval=funcval xor %00000001 : write 0,funcval
   cmdbyte1=%01100000 : cmdbyte2=funcval : gosub sendsusi
   do : gosub keyboard : loop until keyinput=0
  case 2
   read 0,funcval : funcval=funcval xor %00000010 : write 0,funcval
   cmdbyte1=%01100000 : cmdbyte2=funcval : gosub sendsusi
   do : gosub keyboard : loop until keyinput=0
  case 3
   read 0,funcval : funcval=funcval xor %00000100 : write 0,funcval
   cmdbyte1=%01100000 : cmdbyte2=funcval : gosub sendsusi
   do : gosub keyboard : loop until keyinput=0
  case 4
   read 0,funcval : funcval=funcval xor %00001000 : write 0,funcval
   cmdbyte1=%01100000 : cmdbyte2=funcval : gosub sendsusi
   do : gosub keyboard : loop until keyinput=0
  case 5
   read 1,funcval : funcval=funcval xor %00000001 : write 1,funcval
   cmdbyte1=%01100001 : cmdbyte2=funcval : gosub sendsusi
   do : gosub keyboard : loop until keyinput=0
  case 6
   read 1,funcval : funcval=funcval xor %00000010 : write 1,funcval
   cmdbyte1=%01100001 : cmdbyte2=funcval : gosub sendsusi
   do : gosub keyboard : loop until keyinput=0
  case 7
   read 1,funcval : funcval=funcval xor %00000100 : write 1,funcval
   cmdbyte1=%01100001 : cmdbyte2=funcval : gosub sendsusi
   do : gosub keyboard : loop until keyinput=0
  case 8
   read 1,funcval : funcval=funcval xor %00001000 : write 1,funcval
   cmdbyte1=%01100001 : cmdbyte2=funcval : gosub sendsusi
   do : gosub keyboard : loop until keyinput=0
  case 9
   read 1,funcval : funcval=funcval xor %00010000 : write 1,funcval
   cmdbyte1=%01100001 : cmdbyte2=funcval : gosub sendsusi
   do : gosub keyboard : loop until keyinput=0
  else
   read 2,funcval : if analogin<>funcval then
    funcval=analogin : write 2, funcval
    cmdbyte1=%00100101 : cmdbyte2=funcval : gosub sendsusi
    cmdbyte1=%00100100 : cmdbyte2=funcval : gosub sendsusi
   endif
 endselect
return

sendsusi:
 'Umständliche Programmierung zur Erzielung kurzer Abwicklungszeiten
 'Bits 0-15 stehen in Bytes b0 und b1 (Variablen cmdbyte1 und cmdbyte2)
 high C.0
 if bit0=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit1=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit2=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit3=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit4=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit5=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit6=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit7=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit8=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit9=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit10=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit11=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit12=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit13=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit14=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 if bit15=1 then : low C.1 : else high C.1 : endif
 pulsout C.0, pulstime
 high C.1
return





























Verantwortlich für den Inhalt ist der Autor der Homepage. Kontakt

Kostenlose Homepage von rePage.de


Anzeige:    Freunde finden leicht gemacht

 
mat-spur1