Der AMS-33 von ELAD ist ein Antennenumschalter mit drei Eingängen und drei Ausgängen. Über einen an der Frontseite zugänglichen Tasterlassen sich alle 7 Schaltmöglichkeiten auswählen. Die gewählte Verschaltung wird über eine LED-Matrix auf der Frontplatte angezeigt.
Die Eingänge sind zudem mit Überspannungselementen abgesichert. Das Geräteinnere ist sehr übersichtlich. Ein Dutzend Relais sowie neun LEDs werden durch einen ATMEL Controller angesteuert. Ein Taster für die Wahl der Verschaltung, ein JTAG-Steckplatz und die Treiber fürdie Relais sind alles was auf der Platine zu finden sind.Meine erste naive Annahme, dass der 10-pol Anschluss des ATMEL Controller für ISP Programmierung sei, wurde durch ein deutliches Rauchzeichen meines Programmieradapter verneint. Beim Durchmessen der Leitungenentpuppte sich der Anschluss als JTAG Interface. Im Hinterkopf hat sich bei mir noch die Information gehalten, dass mein vor vielen Jahren gekauftes ATMEL-Dragon Board ein solches unterstützt. Zu meiner Verwunderung konnte ich mit dem aktuellen ATMEL-Studiodieses Interface nach einem kurzen automatischen Update auch in Betrieb nehmen. Das Auslesen und Programmieren der originalen Software funktionierte zuverlässig.
Meinen Dank an den Hersteller ELAD, dass er keinen Schutz gegen Neuprogrammieren eingebaut hat. Sowas kann auch einfach durch Ersetzendes Prozessors umgangen werden. ATMEL-Studio habe ich dann dazu benutzt, die Binärdatei in den Controller zu laden.Die Software selbst mussteich neu schreiben. Dazu benutzte ich BASCOM. Die erste Schwierigkeit war, die genauen Portanschlüsse der Relais, der LEDs, und des Taster zu finden. Die Relais habe ich dazu ausgelötet. Der Rest war dann ein Kinderspiel.
Die Originalsoftware hat noch eine Spezialität auf Lager. Sie setzt den Controller nach einigen Sekunden in Tiefschlaf. Dabei werden derSystemtakt und andere Teile des Controller abgeschalten. Der Grund dafür ist, dass sich keine HF des Prozessortakts in den Signalpfad einstreuen kann. Der Systemtakt liegt übrigens bei nur 8 MHz.Für eine externe Bedienung des Geräts kann ich die bei vielen ATMELsvorhandene UART-Schnittstelle benutzen. Sie ist auch auf dem mehrpoligen Pfostenverbinder J1 verfügbar. Dazu eignen sich die vielen USB <-> UART Konverter die es in fast jedem Bastelshop zu kaufen gibt. Die Spannung wird direkt von J1 verwendet. Achtung! Nur 5Vkompatible Typen einsetzen.
Das Protokoll für das Setzen der Antennenmatrix habe ich sehr rudimentär gewählt. Ein gesendetes # gefolgt von der gewünschten Schaltpositionsnummer und ein abschliessendes CR setzt die gewünschte Antennenkonfiguration. Der Controller wird beim Eintreffen vonDaten an der seriellen Schnittstelle geweckt. Leider gehen dabei die Zeichen verloren. Ein vom Protokoll unbenutztes gesendetes Zeichen reichtaus, um den Controller zu wecken, um dann etwas später den eigentlichen Steuercode zu senden. Nach einem Spannungsverlust werden die Eingänge mit den gleichzahligen Ausgängen verbunden. (1=>1 / 2=>2 / 3=>3)
Bilder
Downloads
Update
Dezember 2017: Es hat sich herausgestellt, das die verbauten Relais Probleme mit geringen Leistungen haben. So erkannte der RigExpert 230-Zoom keine Antenne, obwohl der Tranceiver problemlos bei 5 Watt ein SWR von 1:1.3 anzeigte. Weitere Untersuchungen zeigten, dass die Relais mechanisch für geringe Ströme ungeeignet sind. Alleine durch Klopfen am Relaiskörper konnte das SWR beeinflusst werden.
AMS33.bas
‘********************************************* ‘* HF switch box AMS-33 from ELAD ‘* modified firmware for remote control ‘* using RS232 terminal => USB converter ‘* HB9FZG 2016 ‘* ‘* Connection matrix ‘* Pos0 = I1=x I2=x I3=x ‘* Pos1 = In1=Out1 In2=Out2 In3=Out3 ‘* Pos2 = In1=Out1 In2=Out3 In3=Out2 ‘* Pos3 = In1=Out2 In2=Out1 In3=Out3 ‘* Pos4 = In1=Out2 In2=Out3 In3=Out1 ‘* Pos5 = In1=Out3 In2=Out1 In3=Out2 ‘* Pos6 = In1=Out3 In2=Out2 In3=Out1 ‘* ‘********************************************* $regfile = ”m169pdef.dat” $crystal = 8000000 $hwstack = 16 $swstack = 32 $framesize = 32 $baud = 9600 CONFIG SUBMODE = NEW CONST true = 1 CONST false = 0 CONST LEDPWR_ein = 0 CONST LEDPWR_aus = 1 CONST BUTTON_pressed = 0 CONST BUTTON_released = 1 CONST CMDnil = 0 CONST CMDstarted = 1 CONST CMDreceived = 2 CONST SleepDelay = 5 CONST POSnil = 255 LED_O1_I1 Alias PortA.3 LED_O1_I2 Alias PORTC.6 LED_O1_I3 Alias PORTC.7 LED_O2_I1 Alias PORTE.4 LED_O2_I2 Alias PORTE.3 LED_O2_I3 Alias PORTE.2 LED_O3_I1 Alias PORTE.7 LED_O3_I2 Alias PORTE.6 LED_O3_I3 Alias PORTE.5 BUTTON Alias PIND.1 LEDPWR Alias PORTB.1 K1 Alias PORTD.5 K2 Alias PORTC.0 K3 Alias PORTD.7 K4 Alias PORTD.2 K5 Alias PORTD.6 K6 Alias PORTC.4 K7 Alias PORTC.1 K8 Alias PORTC.3 K9 Alias PORTD.3 K10 Alias PORTD.4 K11 Alias PORTC.2 K12 Alias PORTC.5 DDRA = &b00001000 DDRB = &b00000010 DDRC = &b11111111 DDRD = &b11111100 DDRE = &b11111100 DIM Event10ms As Boolean DIM Event100ms As Boolean DIM Event1s As Boolean DIM EventCntr As Integer DIM Position_Curr As Integer DIM E_Position_Curr as Eram Integer DIM Position_New As Integer DIM i As Integer DIM x As Integer DIM d as Byte DIM cmdValue as Byte DIM cmdState as Byte DIM cmdLock as Integer DIM Button_cntr as Integer DIM Sleep_cntr as Integer $include system.inc $include relaispos.inc ‘Init Timer0 (10ms cycle) CONFIG TIMER0 = TIMER , PRESCALE = 1024 START TIMER0 ON OVF0 isrTimer0_Overflow ENABLE OVF0 Config COM1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 Open ”COM1:” For BINARY As #1 On URXC isrRX_DataReceived Enable URXC Config Int0 = LOW LEVEL On Int0 isrINT0 NoSave ‘Config PCINT0 Pcmsk0 = &B00000001 On PCINT0 isrPCINT0 ENABLE Interrupts LEDPWR = LEDPWR_ein cmdState = CMDnil Position_Curr = POSnil Position_New = E_Position_Curr Sleep_cntr = SleepDelay Do If Position_New <> Position_Curr Then ’ Open all connections Call SetNoConnection Waitms 100 Call SetConfig(Position_New) Position_Curr = Position_New Sleep_cntr = SleepDelay End If If Event10ms = true then Event10ms = false If cmdLock > 0 Then DECR cmdLock If Button = BUTTON_pressed Then INCR Button_cntr Else Select Case Button_cntr Case 10 to 50 If Position_New < 6 Then INCR Position_New Else Position_New = 0 End If Button_cntr = 0 Case Is > 100 ’ do nothing now Button_cntr = 0 End Select End If End If If Event100ms = true then Event100ms = false End If If Event1s = true then Event1s = false If Sleep_cntr > 0 Then DECR Sleep_cntr End If End If If Sleep_cntr = 0 Then Call goSleep End If Loop ‘ISRs isrINT0: DISABLE INT0 Sleep_cntr = SleepDelay RETURN isrPCINT0: Sleep_cntr = SleepDelay RETURN isrTimer0_Overflow: ’set 10ms interval TIMER0 = 178 Event10ms = true ’Toggle LEDPWR Incr EventCntr Select Case EventCntr Case 10 Event100ms = true Case 20 Event100ms = true Case 30 Event100ms = true Case 40 Event100ms = true Case 50 Event100ms = true Case 60 Event100ms = true Case 70 Event100ms = true Case 80 Event100ms = true Case 90 Event100ms = true Case 100 EventCntr = 0 Event1s = true End Select RETURN ‘COM1 data received isrRX_DataReceived: d = UDR ’Toggle LEDPWR Select Case d Case 35 ’ # Command Start received cmdState = CMDstarted Case 48 to 54 ’ ”0” - ”6” = valid relais map positions received if cmdState = CMDstarted then cmdValue = d - 48 ’shift the ascii gap cmdState = CMDreceived end if Case 13 ’ CR Command End received if cmdState = CMDreceived then if cmdLock = 0 then cmdLock = 100 ’ set 1 second lock time Position_New = cmdValue end if end if cmdState = CMDnil Case 10 ’do nothing, just ignore the LF character Case else ’ invalid command payload cmdState = CMDnil End Select RETURN
relaispos.inc
‘*********************************** ‘* Connection matrix ‘* Pos0 = I1=x I2=x I3=x ‘* Pos1 = In1=Out1 In2=Out2 In3=Out3 (default = powerless Relais) ‘* Pos2 = In1=Out1 In2=Out3 In3=Out2 ‘* Pos3 = In1=Out2 In2=Out1 In3=Out3 ‘* Pos4 = In1=Out2 In2=Out3 In3=Out1 ‘* Pos5 = In1=Out3 In2=Out1 In3=Out2 ‘* Pos6 = In1=Out3 In2=Out2 In3=Out1 ‘* ‘* In1 => Out1 = K4, K1 = off ‘* In1 => Out2 = K2, K4, K6 ‘* In1 => Out3 = K3, K4 ‘* ‘* In2 => Out1 = K1, K5, K9 ‘* In2 => Out2 = K9, K11, K7, K2 = off ‘* In2 => Out3 = K8, K11 ‘* ‘* In3 => Out1 = K1, K5 ‘* In3 => Out2 = K7, K12 ‘* In3 => Out3 = K10, K12, K8, K3 = off ‘* ‘*********************************** Sub SetRelais(ByVal n As Integer , ByVal p As Integer) Select Case n Case 1 K1 = p Case 2 K2 = p Case 3 K3 = p Case 4 K4 = p Case 5 K5 = p Case 6 K6 = p Case 7 K7 = p Case 8 K8 = p Case 9 K9 = p Case 10 K10 = p Case 11 K11 = p Case 12 K12 = p End Select End Sub Sub SetConfig(ByVal n As Integer) Select Case n Case 0 Call SetNoConnection Case 1 Call SetIn1Out1 Call SetIn2Out2 Call SetIn3Out3 Case 2 Call SetIn1Out2 Call SetIn2Out1 Call SetIn3Out3 Case 3 Call SetIn1Out3 Call SetIn2Out2 Call SetIn3Out1 Case 4 Call SetIn1Out1 Call SetIn2Out3 Call SetIn3Out2 Case 5 Call SetIn1Out2 Call SetIn2Out3 Call SetIn3Out1 Case 6 Call SetIn1Out3 Call SetIn2Out1 Call SetIn3Out2 End Select End Sub Sub SetIn1Out1 Call SetRelais(1 , 0) Call SetRelais(4 , 0) LED_O1_I1 = true End Sub Sub SetIn1Out2 Call SetRelais(2 , 1) Call SetRelais(4 , 1) Call SetRelais(6 , 1) LED_O2_I1 = true End Sub Sub SetIn1Out3 Call SetRelais(3 , 1) Call SetRelais(4 , 1) LED_O3_I1 = true End Sub Sub SetIn2Out1 Call SetRelais(1 , 1) Call SetRelais(5 , 1) Call SetRelais(9 , 1) LED_O1_I2 = true End Sub Sub SetIn2Out2 Call SetRelais(2 , 0) Call SetRelais(7 , 0) Call SetRelais(9 , 0) Call SetRelais(11 , 0) LED_O2_I2 = true End Sub Sub SetIn2Out3 Call SetRelais(3 , 0) Call SetRelais(8 , 1) Call SetRelais(9 , 0) Call SetRelais(11 , 1) LED_O3_I2 = true End Sub Sub SetIn3Out1 Call SetRelais(1 , 1) Call SetRelais(10 , 1) LED_O1_I3 = true End Sub Sub SetIn3Out2 Call SetRelais(2 , 0) Call SetRelais(7 , 1) Call SetRelais(10 , 0) Call SetRelais(12 , 1) LED_O2_I3 = true End Sub Sub SetIn3Out3 Call SetRelais(3 , 0) Call SetRelais(8 , 0) Call SetRelais(10 , 0) Call SetRelais(12 , 0) LED_O3_I3 = true End Sub Sub SetNoConnection ’No connections Call SetRelais(3 , 0) Call SetRelais(4 , 0) Call SetRelais(5 , 0) Call SetRelais(6 , 0) Call SetRelais(7 , 0) Call SetRelais(9 , 0) Call SetRelais(10 , 0) Call SetRelais(11 , 0) Call SetRelais(12 , 0) Call SetRelais(1 , 1) Call SetRelais(2 , 1) Call SetRelais(8 , 1) LED_O1_I1 = false LED_O1_I2 = false LED_O1_I3 = false LED_O2_I1 = false LED_O2_I2 = false LED_O2_I3 = false LED_O3_I1 = false LED_O3_I2 = false LED_O3_I3 = false End Sub
system.inc
Sub goSleep LEDPWR = LEDPWR_aus E_Position_Curr = Position_Curr ENABLE INT0 ENABLE PCINT0 CONFIG POWERMODE = POWERDOWN Waitms 200 LEDPWR = LEDPWR_ein End Sub








