'==================================================================== '= Automatic mobile antenna controller for TS-50 = '= XQ2FOD, September 2001 = '==================================================================== '======== Variables ============ by1 VAR BYTE by2 VAR BYTE by3 VAR BYTE by4 VAR BYTE Band VAR BYTE Oldband VAR BYTE Dir VAR WORD Ref VAR WORD Res VAR WORD OldRes VAR WORD HighRes VAR WORD LimitRes VAR WORD Pass VAR NIB TRY VAR BIT ErrFlag VAR BIT TuneStep VAR WORD Limit VAR BIT Counter VAR BYTE '======== Constants ============== FIn CON 6 RIn CON 7 CurIn CON 15 RunOut CON 12 DirOut CON 8 TuneStartStep CON 100 'ms MidRes CON 15 'Changeover level from Coarse to Fine '===== INIT ===== HIGH FIn HIGH RIn HIGH RunOut HIGH DirOut '===== Power on identification ======= LOW 1 SERIN 0,16572,5000,Nodata,[WAIT("0C;")] HIGH 1 SEROUT 2,188,["0C;"] PAUSE 20 SERIN 0,16572,[WAIT(";"),WAIT("E0"),by1] HIGH 1 Band=by1 SEROUT 2,188,["0D01;0E0",by1,";0F11;"] PAUSE 20 'against feedback! DEBUG "Correct init! " GOTO Loop Nodata: debug "No proper init! " '========== Waiting for commands ========== Loop: ' DEBUG by1,by2,by3,CR SERIN 0,16572,[WAIT("0"),by1,by2,by3] HIGH 1 ' DEBUG by1,by2,by3,CR IF by1="E" THEN BandOK IF by3="0" THEN Off IF by3="1" THEN StopTune IF by3="2" THEN Tune IF by3="3" THEN Tune DEBUG "Unknown code",CR GOTO Loop '==== Command execution ===== Tune: SEROUT 2,188,["0",by1,by2,by3,";"] GOSUB AT PAUSE 20 GOTO Loop StopTune: SEROUT 2,188,["0D01;0E0",Band,";0F11;"] SERIN 0,16572,500,Loop,[WAIT("3;")] SEROUT 2,188,["0D03;"] GOSUB AT DEBUG "Tuner restarted and tuned! " PAUSE 20 GOTO Loop Off: SEROUT 2,188,["0",by1,by2,by3,";"] DEBUG "Tuner Off " PAUSE 20 GOTO Loop BandOK: SEROUT 2,188,["0",by1,by2,by3,";"] Band=by3 DEBUG "BandOK! " SEROUT 2,188,["0F11;"] PAUSE 20 GOTO Loop '====== Autotuning ======= AT: DEBUG "Start Autotuning! " PAUSE 1000 'wait for RF power stabilization IF Band<52 THEN NotTuned 'reject impossible bands under 40m Fine: Pass=0 GOSUB SWRIn IF ErrFlag=1 THEN NotTuned IF Res<(MidRes) THEN Coarse DEBUG "Fine tuning! " HighRes=Res TuneStep=TuneStartStep*2 PassLoop: TuneStep=TuneStep/2 FineLoop: OldRes=Res GOSUB MakeStep GOSUB SWRIn IF ErrFlag=1 THEN NotTuned IF ((Pass>1) AND (Res>=HighRes)) THEN StopHere 'Best tuning found IF ((Res>=OldRes) AND (LIMIT=1)) THEN FineLoop '8-10 Pass=Pass+1 DEBUG "Pass number ",DEC Pass," " IF Pass=3 THEN StopHere GOSUB MakeStep 'Extra step to safely overshoot sweet spot GOSUB SWRIn IF ErrFlag=1 THEN NotTuned TOGGLE DirOut IF Pass<2 THEN FineLoop 'PassLoop IF Pass<3 THEN PassLoop StopHere: HIGH RunOut PAUSE 100 TuneFinish: OldBand=Band HIGH DirOut DEBUG "Best:",DEC HighRes," Actual:",DEC Res," " GOTO Tuned LimitTuner: IF Res=HighRes THEN TuneFinish LimitRes=Res TOGGLE DirOut Loop3: GOSUB MakeStep GOSUB SWRIn IF ErrFlag=1 THEN NotTuned IF ((Res=LimitRes)) THEN Loop3 IF Res>=HighRes THEN TuneFinish TOGGLE DirOut INPUT RunOut 'run to limit which is best tune! PAUSE 1000 HIGH RunOut PAUSE 100 GOTO TuneFinish Coarse: DEBUG "Coarse tuning! " IF Band="4" THEN GoDown IF Band>OldBand THEN GoUp IF Band"4" THEN GoUp GoDown: LOW DirOut DEBUG "Move down! " GOTO Scan GoUp: HIGH DirOut DEBUG "Move up! " Scan: PAUSE 30 INPUT RunOut PAUSE 100 IF IN15=1 THEN Moving HIGH RunOut PAUSE 100 TOGGLE DirOut PAUSE 30 INPUT RunOut PAUSE 100 IF IN15=0 THEN NotTuned 'no motor current! Moving: Try=0 Slew: GOSUB SWRIn IF ErrFlag=1 THEN NotTuned IF Res>MidRes THEN Fine IF IN15=1 THEN Slew If Try=1 THEN NotTuned 'No resonance detected! HIGH RunOut PAUSE 100 TOGGLE DirOut DEBUG "Toggle dir! " PAUSE 30 INPUT RunOut PAUSE 100 Try=1 GOTO Slew Tuned: SEROUT 2,188,["0F41;"] 'if successful DEBUG "Tuning SUCCESSFUL! " RETURN NotTuned: SEROUT 2,188,["0F83;"] 'if unsuccessful DEBUG "Tuning FAILED! " DEBUG "Counter:",DEC Counter," HighRes:",DEC HighRes," " RETURN SWRIn: RCTIME 6,1,Dir RCTIME 7,1,Ref IF Dir>0 THEN DirOK Dir=65535 DirOK: IF Ref>0 THEN RefOK Ref=65535 RefOK: HIGH 6 HIGH 7 'DEBUG "DirRaw:",DEC Dir," RefRaw:",DEC Ref," " Dir=Dir/100 Ref=Ref/100 Dir=65535/Dir Ref=65535/Ref DEBUG "Dir:",DEC Dir," Ref:",DEC Ref," " ErrFlag=0 IF Dir>6500 THEN Error 'too much power! IF Dir<500 THEN Error 'not enough power! Res=Dir*10/Ref IF HighRes>Res THEN NotBetter HighRes=Res NotBetter: DEBUG "Resonance:",DEC Res," " RETURN Error: DEBUG "Improper power level! " ErrFlag=1 RETURN MakeStep: INPUT RunOut 'motor on PAUSE TuneStep LIMIT=IN15 HIGH RunOut 'motor off PAUSE 100 RETURN