/**
// Z-Match ATU 1.8-50MHz
// Ver No. 1.20      2026/3/20

// PIC18F47K42 
// XC8 Cコンパイラー V2.50
// PICKIT3のMemorues to ProgramのPreserve EEPROM....にチェックを入れる事(EEPROMを書き換えない）
/* 
	Z-Match ATU Main Unit
	
	EEPROM MAP
	FreqList: 0-707
	MonStep 1005-1016  Bindexmax+2 1017
	Bindex:1018  SClocation:1019-1020 WClocation:1021-1022 LADD:1023
	Add Ant selector (Not use)
	Microstepを1/1から1/16まで選択可
	V1.01 SVC,WVCの時間差をコントローラーから指定
    V1.20 160m 廃止 10MHzコンデンサ追加
	*/
// PIC18F47K42 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1L
#pragma config FEXTOSC = HS     // External Oscillator Selection (HS (crystal oscillator) above 8 MHz; PFM set to high power)
#pragma config RSTOSC = EXTOSC  // Reset Oscillator Selection (EXTOSC operating per FEXTOSC bits (device manufacturing default))

// CONFIG1H
#pragma config CLKOUTEN = OFF   // Clock out Enable bit (CLKOUT function is disabled)
#pragma config PR1WAY = OFF      // PRLOCKED One-Way Set Enable bit (PRLOCK bit can be cleared and set only once)
#pragma config CSWEN = OFF      // Clock Switch Enable bit (The NOSC and NDIV bits cannot be changed by user software)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)

// CONFIG2L
#pragma config MCLRE = INTMCLR  // MCLR Enable bit (If LVP = 0, MCLR pin is MCLR; If LVP = 1, RE3 pin function is MCLR )
#pragma config PWRTS = PWRT_64  // Power-up timer selection bits (PWRT set at 64ms)
#pragma config MVECEN = ON      // Multi-vector enable bit (Multi-vector enabled, Vector table used for interrupts)
#pragma config IVT1WAY = OFF     // IVTLOCK bit One-way set enable bit (IVTLOCK bit can be cleared and set only once)
#pragma config LPBOREN = OFF    // Low Power BOR Enable bit (ULPBOR disabled)
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled , SBOREN bit is ignored)

// CONFIG2H
#pragma config BORV = VBOR_2P45 // Brown-out Reset Voltage Selection bits (Brown-out Reset Voltage (VBOR) set to 2.45V)
#pragma config ZCD = OFF        // ZCD Disable bit (ZCD disabled. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON)
#pragma config PPS1WAY = ON     // PPSLOCK bit One-Way Set Enable bit (PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config DEBUG = OFF      // Debugger Enable bit (Background debugger disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Extended Instruction Set and Indexed Addressing Mode disabled)

// CONFIG3L
#pragma config WDTCPS = WDTCPS_31// WDT Period selection bits (Divider ratio 1:65536; software control of WDTPS)
#pragma config WDTE = OFF       // WDT operating mode (WDT Disabled; SWDTEN is ignored)

// CONFIG3H
#pragma config WDTCWS = WDTCWS_7// WDT Window Select bits (window always open (100%); software control; keyed access not required)
#pragma config WDTCCS = SC      // WDT input clock selector (Software Control)

// CONFIG4L
#pragma config BBSIZE = BBSIZE_512// Boot Block Size selection bits (Boot Block size is 512 words)
#pragma config BBEN = OFF       // Boot Block enable bit (Boot block disabled)
#pragma config SAFEN = OFF      // Storage Area Flash enable bit (SAF disabled)
#pragma config WRTAPP = OFF     // Application Block write protection bit (Application Block not write protected)

// CONFIG4H
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block not write-protected)
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
#pragma config WRTSAF = OFF     // SAF Write protection bit (SAF not Write Protected)
#pragma config LVP = ON         // Low Voltage Programming Enable bit (Low voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored)

// CONFIG5L
#pragma config CP = OFF         // PFM and Data EEPROM Code Protection bit (PFM and Data EEPROM code protection disabled)

// CONFIG5H

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include "StepFreq_List_12_200.h"//100step max 441PPS
#include "Z_Match_FreqRang_7.h"
#include <stdlib.h>

#define _XTAL_FREQ 24000000
#define YLED  LATDbits.LATD0
#define RLED  LATCbits.LATC2
#define BLED  LATEbits.LATE1
#define SSENS PORTCbits.RC5 //SVC 0番地検出
#define WSENS PORTCbits.RC4 //WVC 0番地検出
#define L3ON LATDbits.LATD2 //L3 on
#define 30mBANDON LATDbits.LATD3 //160m band on
#define nEN LATBbits.LATB5
#define MODE1 LATBbits.LATB2
#define MODE2 LATBbits.LATB1
#define STBY LATBbits.LATB4
#define SSTEP LATBbits.LATB3
#define SDIR LATBbits.LATB0
#define WSTEP LATDbits.LATD5
#define SMSTOP LATDbits.LATD7
#define WMSTOP LATDbits.LATD6
#define WDIR LATDbits.LATD4
#define VDD LATAbits.LATA2
#define TMR3ON T3CONbits.ON //TMR3 1:ON 0:OFF
#define TMR5ON T5CONbits.ON //TMR5 1:ON 0:OFF
#define TMR0ON T0CON0bits.EN //TMR0 1:ON 0:OFF
#define TMR1ON T1CONbits.ON //TMR1 1:ON 0:OFF
#define K1 LATEbits.LATE0 //Ant selector relay
#define K2 LATAbits.LATA5 //Ant selector relay
#define K3 LATAbits.LATA3 //Ant selector relay

#define sendETC 2
#define sendSWR 3
#define sendSVCang 4
#define sendWVCang 5
#define sendFreq 6
#define sendDbug 7

#define cw 1  //VC回転方向　時計回り
#define ccw -1//VC回転方向　反時計回り

#define uchar unsigned char
#define schar signed char
#define uint unsigned int
#define sint signed int
#define ulint unsigned long int

extern unsigned int StepFreq[];

//Timer3のプリセット値計算　Timer3のclock=3MHz 
//割り込み周期100Hz 2^16-(3MHz/100)=35536=0x8AD0
//割り込み周期200Hz 2^16-(3MHz/200)=50536=0xC568
//割り込み周期400Hz 2^16-(3MHz/400)=58036=0xE2B4
unsigned char T3H = 0xC5;//TMR3初期値 200Hz C5 400Hz E2
unsigned char T3L = 0x68;//TMR3初期値 200Hz 68 400Hz B4
uchar T5H,T5L,T3STEP,T5STEP;
unsigned int SWRlimitBase = 104;//自動整合時の開始から10秒間内のターゲット
unsigned int swr0 = 9000;//比較する前回のSWR初期値
uchar MonStep[13];


sint lastSSTEP,lastWSTEP,SClocation,WClocation,SVCtrgt,WVCtrgt;//Clocation=Current Location
signed int maxACC,MMstep,DbugData;
sint MaxLocation;

uchar TUNEstart,recivingflg,Gled,Oled,Blink;
uchar UARTrcvd,CMPD;
unsigned char L2TAP; //リンクコイルタップ切替　0:4T 1:3T
unsigned int swr,SWRlimit;
unsigned int Vfwd, Vref,stby_cunt;
unsigned int Freq,TUNEFreq,lastTUNEFreq;//プリセット周波数  TUNE時の周波数
unsigned char UARTrcvd,TUNED,lastTUNED,RXindex,presetCallREQ,stby_release,Motor_ON;
uchar RXBufa[6];//RS232C 受信buffer
uchar TXBufa[7];//RS232C 送信buffer
//uint FreqList[][];
	
schar WVCdir,SVCdir,VCselect;
uchar DelayCount,SWVCK,DbugOK;//
uchar BFCNT,START,STOP,M_UP,M_DOWN,FSK;//FSK:早送り係数
uchar ANTNo,lastANTNo,Bindex,lastBindex;//,Bindexmax;
uint count0,count1,count3,lastsavecnt,lastsendFreq;
uchar lastsendswr,saveReq,CompFrqList;
uchar MonIndexFlg,sendingflg,VCSW,VC12,MonIndex,ERROR,ckswr;
uint TXinterbal;
schar OLPS,OLMS,OLPW,OLMW;//Over Limit Plus(Minus) Single(Double) VC
uchar MicroStep = 4;//Microstep 1/4 1,4,8,9(8の別の設定),16

//関数宣言

uint takeCenterFreq(uint Bi);
void uart_short_send(char* buf);
void sendUARTshortData(uchar tkg);

uchar sarchswr(uchar vc0);
void presetVCposition(sint Stgt,sint Wtgt,uchar sens);	
void setswrlimit();

//EEPROM読み込み
unsigned char eepdata_read(unsigned int adr) {//adr 0-1023
    unsigned char data; 
	uint ad = adr;
	NVMADRL = ad & 0x00FF;
	NVMADRH = ad >> 8;
    NVMCON1 = 0;
    NVMCON1bits.RD = 1;
    while(NVMCON1bits.RD == 1);
    data = NVMDAT;
    return data;
 }
//EEPRROM書き込み
 void eepdata_write(unsigned int adr,unsigned char data) {// adr 0-1023
	uint ad = adr;
    INTCON0bits.GIEH = 0;
 	INTCON0bits.GIEL = 0;
 	NVMADRL = ad & 0x00FF;
	NVMADRH = ad >> 8;
	NVMDAT = data;
 	NVMCON1 = 0;
 	NVMCON1bits.WREN = 1;
 	NVMCON2 = 0x55;
 	NVMCON2 = 0xAA;
 	NVMCON1bits.WR = 1;
    while(NVMCON1bits.WR == 1);    
    INTCON0bits.GIEH = 1;
 	INTCON0bits.GIEL = 1;
}


void initlastdata() {
	uint k;
	for (k =1018;k <=1023;k++){
		eepdata_write(k,0x00);
	}
}
uint adconv() {
    unsigned int vadch,vadcl;

	//AN0 Vref変換
	ADPCH = 0b00000000; //AN0 AD変換設定
	ADRESH = 0;ADRESL = 0;

    __delay_us(10);

    ADCON0bits.GO = 1; //AD変換開始
    while (ADCON0bits.GO); // AD変換完了まで待つ
    vadch = ADRESH;vadch = vadch << 8; // ADRESHの読み取り
    vadcl = ADRESL;
    Vref = vadch | vadcl; // ADRESLを下位につなぐ

	__delay_us(10);	//AN1 Vfwd 変換
    
	ADPCH = 0b00000001;//AN1 AD変換設定
	ADRESH = 0;ADRESL = 0;

	__delay_us(10);

    ADCON0bits.GO = 1; //AD変換開始
    while (ADCON0bits.GO); // AD変換完了まで待つ
    vadch = ADRESH;vadch = vadch << 8;// ADRESHの読み取り
    vadcl = ADRESL;
    Vfwd = vadch | vadcl; // ADRESLを下位につなぐ

	return Vfwd;
}

void takeTUNEFreq() {
    uint fl=0;uint fh=0;uint lfq;
	lfq = lastTUNEFreq ;
	INTCON0bits.GIEH = 0;//全割り込み禁止
	INTCON0bits.GIEL = 0;//全割り込み禁止
	TMR1ON = 0;//timer1カウント停止
	TMR0ON = 0;
	PIR4bits.TMR1IF = 0;
	TMR0H = 0x00;TMR0L = 0x00;//timer1 preset 
    TMR1H = 0xA2;TMR1L = 0x68;//timer0 reset 周波数カウント
	TMR1ON = 1;//timer1カウント開始
    TMR0ON = 1;
    while (PIR4bits.TMR1IF == 0); 
    asm ("nop");//
    asm ("nop");
	asm ("nop");//
    asm ("nop");
	TMR0ON = 0;
    TMR1ON = 0;//timer1カウント停止
    
    fl=TMR0L;fh=TMR0H;

	TUNEFreq = (fh << 8) | fl;

	if (TUNEFreq < 1780) {lastTUNEFreq = 0;TUNEFreq = 0;} 
    PIR4bits.TMR1IF = 0;
    INTCON0bits.GIEH = 1;//全割り込み許可
	INTCON0bits.GIEL = 1;

}


void getSWR() {
	ulint s,v,w;
	v = adconv();
    if (Vref > ((ulint)(89 *(ulint) Vfwd) / 91)) {
        swr = 9000;
    } else {
    	s = (ulint)100 * (ulint)(Vfwd + Vref);
    	w =(ulint)( s / (Vfwd - Vref));
    	swr = (uint)w;
    }
	if (swr > 250) {s=swr+5;s=s/10;swr=s*10;}//小数点以下2桁目を四捨五入
}

void savelastdata(){
    //lastdata SVC WVCの角度データをEEPROMに退避 (注) 1017にはBindexmax+2が格納されている
    sint s0,s1;
		eepdata_write(1018,Bindex);
		s0 = SClocation & 0x00FF;
		s1 = SClocation >> 8;
		eepdata_write(1019,s0);
		eepdata_write(1020,s1);
		s0 = WClocation & 0x00FF;
		s1 = WClocation >> 8;
		eepdata_write(1021,s0);
		eepdata_write(1022,s1);
		eepdata_write(1023,L2TAP);
}
void takelastdata(){
	uint f0,f1;
	Bindex = eepdata_read(1018);
	if (Bindex > 127) {initlastdata();return;}
	f0 = eepdata_read(1019);
	f1 = eepdata_read(1020);
	SVCtrgt =(sint) (f0 | (f1 << 8));
	f0 = eepdata_read(1021);
	f1 = eepdata_read(1022);
    WVCtrgt = (sint) (f0 | (f1 << 8));
	L2TAP = eepdata_read(1023);
}
void DelayTimer(uchar C){
		uchar t=0;
		for (t=0;t<=C;t++){
			__delay_us(50);
		}
}
void setMicroStep(uchar MS) {
	switch (MS) {
		case 1: MODE1 = 0;MODE2 = 0;SSTEP = 0;SDIR = 0;WSTEP = 0;WDIR = 0;MaxLocation = 375;break;//1/1step
		case 4: MODE1 = 0;MODE2 = 1;SSTEP = 0;SDIR = 1;WSTEP = 0;WDIR = 1;MaxLocation = 1500;break;//1/4step	
		case 8: MODE1 = 1;MODE2 = 1;SSTEP = 1;SDIR = 0;WSTEP = 1;WDIR = 0;MaxLocation = 3000;break;//1/8step	
		case 9: MODE1 = 1;MODE2 = 0;SSTEP = 1;SDIR = 1;WSTEP = 1;WDIR = 1;MaxLocation = 3000;break;//1/8step	
		case 16: MODE1 = 1;MODE2 = 1;SSTEP = 1;SDIR = 1;WSTEP = 1;WDIR = 1;MaxLocation = 6000;break;//1/16step
		default: MODE1 = 0;MODE2 = 1;SSTEP = 0;SDIR = 1;WSTEP = 0;WDIR = 1;MaxLocation = 1500;break;//1/4step	
    }
}
	
void motorStandby(uchar sw){//0:STBY有効 1:STBY解除
    
	if (sw == 0){stby_release = 1;stby_cunt = 0;return;//STBY
		} else {
        if (Motor_ON == 1){return;}
        Motor_ON = 1;
		setMicroStep(MicroStep);
		__delay_ms(10);
        STBY = 1;//STBY MODE 解除
        SMSTOP = 1;WMSTOP = 1;//MOTOR beake
		
        __delay_ms(90);

    	stby_release = 0;
		}
}


void initMotorDriver(){
	SSTEP = 0;WSTEP = 0;
	SDIR = 0;WDIR = 0;//CW回転
    nEN = 0;
    STBY = 1;//STBY解除
 	__delay_ms(100);

    STBY = 0;//motor stand-by
	setMicroStep(MicroStep);

	__delay_ms(10);
    STBY = 1;//STBY MODE 解除

    SMSTOP = 1;WMSTOP = 1;//MOTOR beake
    __delay_ms(100);

}
	
	
void initMotorSet() {
	sint stp,maxstp;
    uchar ss,ws,lastSSENS,lastWSENS,chS,chW,snS,snW;
	maxstp = (MaxLocation + 100) * 2;
	SDIR = 1;WDIR = 1;SMSTOP =0;WMSTOP = 0;//S,W motorともCW方向、回転可
	SClocation = maxstp;WClocation = maxstp;
    presetVCposition(0,0,1);//CCW方向に360度回転途中にセンサーを検出して停止
	SClocation = 0;WClocation = 0;//仮の原点を設定
	__delay_ms(10);
	presetVCposition(50,50,0);//CW方向に50step回転
	__delay_ms(100);
//	MODE1 = 0;MODE2 = 0;//1.8deg 基本ステップ
	SDIR = 1;WDIR = 1;SMSTOP =0;WMSTOP = 0;//S,W motorともCCW方向、回転可
    __delay_ms(100);
	ss =1;ws = 1;
    TMR3ON = 1;DelayTimer(DelayCount);TMR5ON = 1;
	while ((ss == 1) || (ws == 1)) {
		if (SSENS == 0) {ss = 0;SSTEP = 0;}else{SSTEP = T3STEP;}
		if (WSENS == 0) {ws = 0;WSTEP = 0;}else{WSTEP = T5STEP;}
	}
	TMR3ON = 0;TMR5ON = 0;//timer3,5 STOP
	SMSTOP = 1;WMSTOP = 1;T3STEP = 0;T5STEP = 0;//MOTOR beake
    SClocation = 0;WClocation =0;//原点設定
}

	

void presetVCposition(sint Stgt,sint Wtgt,uchar sens){//引数：各VCのターゲット角度  180度のときMaxLocation
	sint SACCend,SDECstart,WACCend,WDECstart,temp0,temp1,stemp;
    sint SVCstep,WVCstep,Sdef,Wdef,Sindex,Windex,st,wt;
	uchar ss,ws,chS,chW,snS,snW,lastSSENS,lastWSENS;//,cnt;
    if (STBY == 0){return;}
    T3L = StepFreq[0] & 0x00FF;T3H = StepFreq[0] >> 8;//Motor clock 100Hz
	T5L = StepFreq[0] & 0x00FF;T5H = StepFreq[0] >> 8;//Motor clock 100Hz
	
//    SMSTOP = 0;WMSTOP = 0;//Motor active
    ss = 1;ws = 1;st = 0;wt = 0;Sindex = 0;Windex = 0;
	
	Sdef = Stgt - SClocation;if(Sdef < 0){SVCstep = -1;}
	if(Sdef > 0){SVCstep = 1;}if(Sdef == 0){ss = 0;}
	
	Wdef = Wtgt - WClocation;if(Wdef < 0){WVCstep = -1;}
	if(Wdef > 0){WVCstep = 1;}if(Wdef == 0){ws = 0;}
	
    if (SVCstep >= 0) {SDIR = 0;}else{SDIR = 1;}
    if (WVCstep >= 0) {WDIR = 0;}else{WDIR = 1;}
	
    SSTEP = 0;lastSSTEP = 0;//BLED = 0;
	WSTEP = 0;lastWSTEP = 0;
	lastSSENS = SSENS;lastWSENS = WSENS;
	
	temp0 = abs(Sdef);temp1 = temp0/2;SACCend = temp1-2;
	if(SACCend > maxACC) {SACCend = maxACC;}
	if(SACCend < 0){SACCend = 0;}

	temp0 = abs(Wdef);temp1 = temp0/2;WACCend = temp1-2;
	if(WACCend > maxACC) {WACCend = maxACC;}
	if(WACCend < 0){WACCend = 0;}

	temp0 = abs(Sdef);temp1 = temp0 - SACCend;SDECstart = temp1 +1;
    temp0 = abs(Wdef);temp1 = temp0 - WACCend;WDECstart = temp1 +1;
    st = 0;wt = 0;
    SMSTOP = 0;WMSTOP = 0;//Motor active
//    __delay_ms(100);
    TMR3ON = 1;DelayTimer(DelayCount);TMR5ON = 1;//timer3,5 START

    while ((ss == 1) || (ws == 1)) {
    	if(Stgt == SClocation){ss = 0;SSTEP = 0;}
        if(ss == 1){SSTEP = T3STEP;}
    	if(Wtgt == WClocation){ws = 0;WSTEP = 0;} 
        if(ws == 1){WSTEP = T5STEP;}
   	
    	if((lastSSTEP != SSTEP) && (SSTEP == 0)){
            if (ss == 1){SClocation = SClocation + SVCstep;st++;
 
            	if (st > 3) {
             		if(st <= SACCend) {
             			Sindex++;
             			stemp = StepFreq[Sindex];
             			T3L = stemp & 0x00FF;T3H = stemp >> 8;
             		}

            		if (st >= SDECstart) {
            			if (Sindex > 0){Sindex--;}
            			stemp = StepFreq[Sindex];
             			T3L = stemp & 0x00FF;T3H = stemp >> 8;
            		}
            		
            	}
            }
    	}
        
        lastSSTEP = SSTEP;
    	if((lastWSTEP != WSTEP) && (WSTEP == 0)){
            if (ws == 1){WClocation = WClocation + WVCstep;wt++;

            	if (wt > 3) {
             		if(wt <= WACCend) {
             			Windex++;
             			stemp = StepFreq[Windex];
             			T5L = stemp & 0x00FF;T5H = stemp >> 8;
             		}

            		if (wt >= WDECstart) {
            			if (Windex > 0){Windex--;}
            			stemp = StepFreq[Windex];
             			T5L = stemp & 0x00FF;T5H = stemp >> 8;
            		}
            		
            	}
            }
            
        
        }
//        cnt++;

        lastWSTEP = WSTEP;
    	if (sens == 1) {
    		if (lastSSENS != SSENS){chS = 1;snS=SSENS;lastSSENS = SSENS;}
         if ((chS ==1) && (snS == 0)){
	 		ss = 0;SSTEP = 0;}
         
         if (lastWSENS != WSENS){chW = 1;snW=WSENS;lastWSENS = WSENS;}
         if ((chW ==1) && (snW == 0)){
	 		ws = 0;WSTEP = 0;}
    	}
        RLED=~RLED;
    }
    TMR3ON = 0;TMR5ON = 0;//timer3,5 STOP
	SMSTOP = 1;WMSTOP = 1;T3STEP = 0;T5STEP = 0;//BLED = 0;//MOTOR stop
    if (RLED==1){RLED=0;}
    YLED=1;
}
	
void get_presetdata(uint ead) {//EEPROM読み出し
	uchar a;uint m;
	uint a0,a1,a2,a3;
	m = ead * 7;
    a = eepdata_read((m) + 2); 
	ANTNo = a & 0b00000111;
	L2TAP = (a & 0b00001000) >> 3;L3ON = L2TAP;
	TUNED = a >> 7;
	a0 = eepdata_read(m + 3);
	a1 = eepdata_read(m + 4);
	SVCtrgt = (sint)(a0 | (a1 << 8));
    if (SVCtrgt > MaxLocation) {SVCtrgt = MaxLocation;}
    if (SVCtrgt < 0) {SVCtrgt = 0;}
	a2 = eepdata_read(m + 5);
	a3 = eepdata_read(m + 6);
	WVCtrgt = (sint)(a2 | (a3 << 8));
    if (WVCtrgt > MaxLocation) {WVCtrgt = MaxLocation;}
    if (WVCtrgt < 0) {WVCtrgt = 0;}
	TUNEFreq = takeCenterFreq(ead);
    if (TUNEFreq > 54000){
        TUNEFreq = 0;SVCtrgt = 1000;WVCtrgt = 1000;
        TUNED = 0;L2TAP = 0;
    }
}
	
uchar takeBindexFromList(uint fq,uchar an) { //周波数からBindexを選択
	uchar k,k0,a,a0;
	uchar ch = 0;
    uint f0,f1;
    uint frq = fq;
    a0=an;
	lastBindex=Bindex;
	for (k = 0;k <= Bindexmax;k++) {
		a = FreqList[k][1] & 0b00000111;
        f0=FreqList[k][0];k0=k+1;f1=FreqList[k0][0];
		if (a == a0){
			if ((f0 <= frq) && (frq < f1)) {
 //               DbugData = k;sendUARTshortData(sendDbug); 
				ch = k;return ch;
			}
		}
	}
    return ch;

}


void save_presetdata(uint Frq) {//TUNEが成功した時のみセーブ 
    uint e0,e1,bi,m;
	sint a0,a1,a2,a3;
	bi = takeBindexFromList(Frq,ANTNo);
	m = bi * 7;
//    m = Bindex * 7;
	e0 = eepdata_read(m+2);//e0=7bit:TUNED 6-4bit:空 3bit:L2TAP 2-0bit:ANTNo.(0-4)
	e0 = e0 & 0b00000111;
	e1 = e0 | (L2TAP << 3) | (TUNED << 7);
	a0 = SClocation & 0x00FF;
	a1 = SClocation >> 8;
	a2 = WClocation & 0x00FF;
    a3 = WClocation >> 8;
	eepdata_write((m + 2),e1);
	eepdata_write((m + 3),a0);
	eepdata_write((m + 4),a1);
	eepdata_write((m + 5),a2);
	eepdata_write((m + 6),a3);
     __delay_ms(120);//min6msのディレーが必要
	DbugData = bi;sendUARTshortData(sendDbug);
//     RLED = 1;
}

void MSon(sint stp) {

	SVCtrgt = SClocation + stp;
	if (SVCtrgt > MaxLocation){SVCtrgt = MaxLocation;OLPS++;}
       
	if (SVCtrgt < 0){SVCtrgt = 0;OLMS++;}
    
	presetVCposition(SVCtrgt,WClocation,0);
    
	sendUARTshortData(sendSVCang);

}
void MWon(sint stp) {

	WVCtrgt = WClocation + stp;
	if (WVCtrgt > MaxLocation){WVCtrgt = MaxLocation;OLPW++;}
	if (WVCtrgt < 0){WVCtrgt = 0;OLMW++;}
	presetVCposition(SClocation,WVCtrgt,0);
	sendUARTshortData(sendWVCang);

}
	
void M_UPcheck(){
	sint st,kt;
    if (FSK == 0){kt = 12;}else{kt = 1;}//FSK早送りstep
	st = 1;//MMstep/4;
	if (M_UP == 0){return;}
    motorStandby(1);
	if ((M_UP == 1) && (VCSW == 0)){MSon(st*kt);VCselect == 1;}//0:SVC 1:WVC
	if ((M_UP == 1) && (VCSW == 1)){MWon(st*kt);VCselect == 2;}
	M_UP = 0;
    motorStandby(0);
	getSWR();sendUARTshortData(sendSWR);//SWRをチェック SWR送信
}
void M_DOWNcheck(){
	sint st,kt;
    if (FSK == 0){kt = -12;}else{kt = -1;}
	st = 1;//MMstep/4;
	if (M_DOWN == 0){return;}
    motorStandby(1);
	if ((M_DOWN == 1) && (VCSW == 0)) {MSon(st*kt);VCselect == 1;}
	if ((M_DOWN == 1) && (VCSW == 1)) {MWon(st*kt);VCselect == 2;}
	M_DOWN = 0;
    motorStandby(0);
	getSWR();sendUARTshortData(sendSWR);//SWRをチェック SWR送信
}
void startcheck() {
    
	if (START == 0) { return;}
	START = 0;
	TUNEstart=1;
	ckswr=0;
	Gled = 1;//1:点灯 0:消灯
	Oled = 0;
	count0 =0;
	count1 =0;
	SWRlimit =SWRlimitBase;

    sendUARTshortData(sendETC);
	}
	
uchar stopcheck() {

	if (STOP == 0) {return 0;}
	STOP = 0;
	TUNEstart = 0;
	ckswr=0;
	Gled = 0; // GRN LED off
	Oled = 0; // RED LED off
	
    sendUARTshortData(sendETC);
    
	return 1;
}

void setANTselect(){
	switch (ANTNo) {
		case 1: K1 = 0;K2 = 1;K3 = 1;break;
		case 2: K1 = 1;K2 = 0;K3 = 1;break;
		case 3: K1 = 0;K2 = 0;K3 = 1;break;
		case 4: K1 = 0;K2 = 0;K3 = 0;break;
		}
	lastANTNo = ANTNo;
}	
	

signed char setMonStep() {	

	if (Freq < 1950) {return  MonStep[0];}
	if ((Freq >= 1950) && (Freq < 3930)) {return  MonStep[1];}
	if ((Freq >= 3930) && (Freq < 7250)) {return  MonStep[2];}
    if ((Freq >= 7250) && (Freq < 10200)) {return  MonStep[3];}
	if ((Freq >= 10200) && (Freq < 14500)) {return  MonStep[4];}
	if ((Freq >= 14500) && (Freq < 18200)) {return  MonStep[5];}
	if ((Freq >= 18200) && (Freq < 21500)) {return  MonStep[6];}
    if ((Freq >= 21500) && (Freq < 25000)) {return  MonStep[7];}
    if ((Freq >= 25000) && (Freq < 30000)) {return  MonStep[8];}
	if (Freq >= 30000)  {return  MonStep[9];}
}

uchar FindDipSwr(unsigned char vc0) {//vc0=1;SVC  2:WVC
	uchar re,sm,rev,vc,st,be;
	unsigned int Mstep,Mstep0;
    vc = vc0;
	OLPS = 0;OLMS = 0;OLPW = 0;OLMW = 0;
	re = 0;//0:SWRlimit以上 1:SWRlimit以下　2:エラー
	sm = 0; //SWRディップポイント通過で１
	rev =0; //モーター反転回数
	Mstep0 = setMonStep();//モーター駆動step数(最小値は1）
//    Mstep0=16;
	getSWR();sendUARTshortData(sendSWR);//SWRをチェック SWR送信
    motorStandby(1);
	while (1) {//  指定したVCにてSWRの最少ポイントを探す
 //       RLED=~RLED;
		if (START == 1){return 1;}
		setswrlimit();
        if (TUNEstart == 0){return 0;}
		getSWR();sendUARTshortData(sendSWR);//SWRをチェック SWR送信
		if (swr < SWRlimit) { return 1;}
		Mstep = Mstep0/1;//           //Mstepの最小値は1かつ整数
		if (swr >= 1000) {Mstep= Mstep0/4;} //8  swr>=600の時 36 1/4マイクロステップ時
		if (swr < 1000) {Mstep= Mstep0/6;} //5  詳細は再現性テスト.xlsxのSTEP参照
		if (swr < 600) {Mstep= Mstep0/7;} //3 

		if (swr < 300) {Mstep= Mstep0/10;} //2
		if (swr < 200) {Mstep= Mstep0/15;} //2
		if (swr < 110) {Mstep= Mstep0/18;} //1


        
		
		st = stopcheck();//キー入力のチェック
		if (st == 1) {return 5;}
		swr0 = swr;
		if (vc == 2) {//WVCを動かす
			MWon(Mstep*WVCdir);// (1:cw/-1:ccw)
			sendUARTshortData(sendWVCang);
			getSWR();sendUARTshortData(sendSWR);//SWRをチェック SWR送信
			if (swr < SWRlimit) { return 1;}
			} else {//SVCを動かす
            
			MSon(Mstep*SVCdir*SWVCK);// (1:cw/0:ccw)
             RLED=1;
			sendUARTshortData(sendSVCang);
			getSWR();sendUARTshortData(sendSWR);//SWRをチェック SWR送信
			if (swr < SWRlimit) { return 1;}
			}
       
		st = stopcheck();
		if (st == 1) {return 5;}
		if (swr0 < swr) { //SWR0より大きい時は
			if (sm == 1) { break;}//SWR最少点通過後ならブレーク
			if (vc == 2) {
				if (WVCdir==1) {WVCdir=-1;} else {WVCdir=1;}//VCを反転
		   		MWon(Mstep*WVCdir);// (1:cw/0:ccw)
				sendUARTshortData(sendWVCang);
		 		getSWR();sendUARTshortData(sendSWR);//SWRをチェック SWR送信
				if (swr < SWRlimit) { return 1;}
				} else {
				if (SVCdir==1) {SVCdir=-1;} else {SVCdir=1;}//VCを反転
				MSon(Mstep*SVCdir*SWVCK);// (1:cw/0:ccw)
				sendUARTshortData(sendSVCang);
				getSWR();sendUARTshortData(sendSWR);//SWRをチェック SWR送信
				if (swr < SWRlimit) { return 1;}
				}
			if (re == 1) {return 1;}
			st = stopcheck();
			if (st == 1) {return 5;}
			rev++;
			sm=1;
			if (rev > 1) { break;}// モーター反転を2回やったら抜ける。
			} else { if (swr0 > swr) {sm = 0;}}//SWRが下がる間同じVCを同じ方向へ繰り返す
		st = stopcheck();
		if (st == 1) {return 5;}
		if (count0 > 35000){TUNEstart = 0;return 2;}
        if (OLPS > 3){return 0;}
    	if (OLMS > 3){return 0;}
        if (OLPW > 3){return 0;}
        if (OLMW > 3){return 0;}
	}
	if (swr < SWRlimit) { return 1;}
	
	return 0;
}


void setswrlimit() {
    if ((count0 > 0) && (count0 <= 10000)) { SWRlimit = SWRlimitBase;}//0秒から10秒
	if ((count0 > 10000) && (count0 <= 15000)) { SWRlimit = 110;}//10秒から15秒
    if ((count0 > 15000) && (count0 <= 20000)) { SWRlimit = 135;}//15秒から20秒
	if ((count0 > 20000) && (count0 <= 25000)) { SWRlimit = 170;}//20秒から25秒
	if (count0 > 25000) { SWRlimit = 300;}//25秒以上
}

uchar sarchswr(uchar vc0) { //SWR収束プログラム
	uchar re,vc;
	re=0; //re=0 SWRがSWRLimit以上 re=1 SWRがSWRLimit以下　re=2 エラー
	SWRlimit = SWRlimitBase;
	 __delay_ms(330);
    vc = vc0;
    count0=0;
    while(1){
        re = FindDipSwr(vc);
        if (re != 0) {TUNEstart = 0;return re;}
    	if ((OLPS > 3) && (OLPW > 3)) {TUNEstart = 0;return 2;}
    	if ((OLMS > 3) && (OLMW > 3)) {TUNEstart = 0;return 2;}
    	if ((OLPS > 3) && (OLMW > 3)) {TUNEstart = 0;return 2;}
    	if ((OLMS > 3) && (OLPW > 3)) {TUNEstart = 0;return 2;}
        if (vc == 2){vc = 1;}else{vc = 2;}

    	
        if (count0 > 35000){TUNEstart = 0;return 2;}
    }
}

	
uint takeCenterFreq(uint Bi){
    ulint fq,fq0,fq1;
    fq0 = FreqList[Bi][0];fq1 = FreqList[Bi + 1][0];
    fq = (fq0 + fq1)/2;
	ANTNo = FreqList[Bi][1];
    return fq;
}

void takeMonStep(){
	uint k;
	for (k = 0;k<= 11;k++){
		MonStep[k] = eepdata_read(k+1005);
	}
	DelayCount = MonStep[10];
	if ((DelayCount == 0) || (DelayCount > 100)){DelayCount = 1;}
	SWVCK = MonStep[11];
}
	
void saveMonStep(){
	uchar i;	
	while(!MonIndexFlg);
	for (i = 0;i <= 11;i++) {
		eepdata_write(1005 + i,MonStep[i]);
	
	}
	MonIndexFlg = 0;
}

void check30mBand(){

	if (Bindex == 27){30mBANDON = 1;}else{30mBANDON = 0;}
}
/*
void makeFreqList(){//EEPROMデータより周波数リストを読み込む
	uint fr,f0,f1;
	uchar k,j;uint m;
	k = 0;fr = 0;
    
	for(k = 0;k < Bindexmax+2;k++){
        m = k * 7;
		f0 = eepdata_read(m);
		f1 = eepdata_read(m + 1);
		fr = f0 | (f1 << 8);
		FreqList[k][0] = fr;
		j = eepdata_read(m + 2);
		FreqList[k][1] = j & 0b00000111;
		CompFrqList = 1;
	}

}*/
	
void saveFreqList() { //FreqListをEEPROMにセーブ Bindexmaxに変更があった時のみ実行
	uchar c,bi,pl,ph,k;
	uint m,pa;
	uint f0,f1;
	for (k = 0;k <= Bindexmax + 2;k++){
		pa = (MaxLocation * 2)/3;
		pl = pa & 0x00FF;ph = pa >> 8;
		c = FreqList[k][1] ;//ANT No.
		f0 = FreqList[k][0] & 0x00FF;f1 = FreqList[k][0] >> 8;//f0 下位8bit f1 上位8bit]
    	m = k * 7;
		eepdata_write(m,f0);
		eepdata_write((m + 1),f1);
		eepdata_write((m + 2),c);
		eepdata_write((m + 3),pl);
		eepdata_write((m + 4),ph);
		eepdata_write((m + 5),pl);
		eepdata_write((m + 6),ph);
		eepdata_write(1017,Bindexmax);//Bindexmaxセーブ
	}
}

//UART送信ショート版
void uart_short_send(char* buf) {

    uchar i = 0;
    
	while (i <= BFCNT) {
		while (!PIR3bits.U1TXIF);//TRMT=0 full TRMT=1 empty

        U1TXB = TXBufa[i];
		i++;
        PIR3bits.U1TXIF = 0;
	}
    TXinterbal = 0;
    sendingflg = 0;
}

void sendUARTshortData(uchar tkg) {//ATUからshackへUART送信
	 uint f0,f1,swr0,swr1,ang0,ang1;
    uchar e0,e1,e2,e3,e4,e5;

     sendingflg = 1;
	if (tkg == sendETC) {
		e0 = Gled; e1 = Oled << 1;e2 = TUNED << 2;e3 = ERROR << 3;e4 = L2TAP << 4;e5 = Blink <<5;
		e0 = e0 | e1;e0 = e0 |e2;e0 = e0 | e3;e0 = e0 | e4;e0 = e0 | e5;


			TXBufa[0] = tkg;
			TXBufa[1] = Bindex;
        
        	TXBufa[2] = e0;
//        	BLED=TUNED;

        	saveReq = 1;

	}
	if (tkg == sendSWR) {
		if (lastsendswr != swr) {
		TXBufa[0] = tkg;
		
		swr0 = swr & 0x00FF; swr1 = swr >> 8;
		TXBufa[1] = (uchar)swr0;
		TXBufa[2] = (uchar)swr1;
		lastsendswr = swr;


		}
	}
	if (tkg == sendSVCang) {
		TXBufa[0] = tkg;
		ang0 = SClocation & 0x00FF;
		ang1 = SClocation >> 8;
		TXBufa[1] = ang0;
		TXBufa[2] = ang1;


	}
	if (tkg == sendWVCang) {
		TXBufa[0] = tkg;
		ang0 = WClocation & 0x00FF;
		ang1 = WClocation >> 8;
		TXBufa[1] = ang0;
		TXBufa[2] = ang1;


	}
   	if (tkg == sendFreq) {
   		if (((lastsendFreq + 5) < TUNEFreq) || ((lastsendFreq - 5) > TUNEFreq)){
			TXBufa[0] = tkg;
        
            f0 = TUNEFreq & 0x00FF; 
            f1 = TUNEFreq >> 8;
            TXBufa[1] = (uchar)f0;
            TXBufa[2] = (uchar)f1;
            lastsendFreq = TUNEFreq;


        }
    }
	if (tkg == sendDbug) {
		TXBufa[0] = tkg;
   		f0 = DbugData & 0x00FF; 
        f1 = DbugData >> 8;
		TXBufa[1] = (uchar)f0;
		TXBufa[2] = (uchar)f1;


    }

    while(CMPD == 0);
	while(recivingflg);
    while(!PIE3bits.U1RXIE);//受信が終わるまで待つ
    uart_short_send(TXBufa);
    CMPD = 0;
}


	
//*******************************************************************************
// *  InterFunction()   割り込みの処理                                            *
// *******************************************************************************/



// UART 受信割り込み
void __interrupt(irq(IRQ_U1RX)) U1RX_ISR(void) {
	uchar n,k;

	PIE3bits.U1RXIE = 0;
	PIR3bits.U1RXIF = 0;
	RXBufa[RXindex] = U1RXB;
    if (RXBufa[0] == 0){CMPD = 1;PIE3bits.U1RXIE = 1;return;}
	if (RXBufa[0] > 127) {BFCNT =3;recivingflg = 1;}else{BFCNT = 2;}
	RXindex ++;
	if (RXindex > BFCNT) {
        
		if ((RXBufa[0] > 0) && (RXBufa[0] < 100)){
            lastBindex=Bindex;
            Bindex = RXBufa[1];ANTNo=FreqList[Bindex][1] & 0b00000111;
            //Bindex
			k = RXBufa[2];
			L2TAP = k & 0b00000001;
			presetCallREQ = (k & 0b00000010) >> 1;
			START = (k & 0b00000100) >> 2;
			STOP = (k & 0b00001000) >> 3;if (STOP == 1){TUNEstart = 0;}
			M_UP = (k & 0b00010000) >> 4;
			M_DOWN = (k & 0b00100000) >> 5;
			FSK = (k & 0b01000000) >> 6;//option
			VCSW = (k & 0b10000000) >> 7;//0:SVC 1:WVC

			TUNED = 0;

        }
		if ((RXBufa[0] > 0) && (RXBufa[0] <= 127)) {
			MonIndex = RXBufa[0] - 100;
			MonStep[MonIndex] = RXBufa[1];
			MonStep[MonIndex + 1]= RXBufa[2];
			if (MonIndex == 10){MonIndexFlg = 1;}
			}
		if (RXBufa[0] > 127){UARTrcvd = 1;}
		
        RXindex=0;
        
	}
	PIE3bits.U1RXIE = 1;

}

//S Motor駆動ステップ周期の割り込み
void __interrupt(irq(IRQ_TMR3)) TMR3_ISR(void) {

		TMR3IF = 0;
		TMR3IE = 0;

		TMR3ON = 0;
		TMR3H = T3H;//
		TMR3L = T3L;//
		TMR3ON = 1;
		TMR3IE = 1;

    T3STEP = ~T3STEP;
}

//W Motor駆動ステップ周期の割り込み
void __interrupt(irq(IRQ_TMR5)) TMR5_ISR(void) {

		TMR5IF = 0;
		TMR5IE = 0;

		TMR5ON = 0;
		TMR5H = T5H;//
		TMR5L = T5L;//
		TMR5ON = 1;
		TMR5IE = 1;

    T5STEP = ~T5STEP;
}
	
//1msec 周期割り込み
void __interrupt(irq(IRQ_TMR2)) TMR2_ISR(void) {

		TMR2IF = 0;
		TMR2IE = 0;
		count0 ++;//SWRサーチ経過時間
		count1 ++;//LEDタイミング時間
        lastsavecnt++;if (lastsavecnt > 10000){lastsavecnt = 10000;}
	 	count3 ++;//SWRと周波数を送信する間隔
	 	TXinterbal ++;if (TXinterbal > 2000) { TXinterbal = 2000;}
		if (stby_release == 1){stby_cunt ++;if (stby_cunt >1000){STBY = 0;stby_release = 0;Motor_ON = 0;}}//Motor動作モードからStnd-byに移るまでのディレー
		TMR2IE=1;

}
void main() {
    __delay_ms(150);
    uchar Stepdisp = 1;
	uchar a,st;

    OSCCON1 = 0b01110000; //Fosc Xtal 24MHz  NDIV =1/1

    ADCON0= 0b10010100	; //右詰め ADC ON ADCRC ON

	
	ADREF = 0; //VDD-VSS間
    PORTA = 0b00000000; // 
    TRISA = 0b00010111; //RA0-2,4 入力設定 他は出力
    ANSELA = 0b00000011; //ADコンバーターAN0,1使用
    PORTB = 0b00000000; //Motor Driver
    TRISB = 0b00000000; // RB0-RB7出力
    ANSELB = 0b00000000; //ADコンバーター使用せず
    PORTC = 0b01000000; //ポートC　RC6=H UART TX
    TRISC = 0b10110011; //RCポート2,3,6出力 0,1,4,5,7 input
	ANSELC = 0b00000000; //ADコンバーター使用せず
    INLVLC = 0b00110000;//RC4,5 シュミットトリガー入力 
    SLRCONC = 0b00000000;//
	PORTD = 0b00000000; //
	TRISD = 0b00000000;
	ANSELD = 0b00000000;
	PORTE = 0x00; 
	TRISE = 0x00;// 全ポート出力
	ANSELE = 0x00; //ADコンバーター使用せず
	U1RXPPS = 0b010111;//U1RXをRC7に設定
	RC6PPS = 0b010011;//RC6をUART1 TXに設定
	T0CKIPPS = 0b0000100;//RA4
    INTCON0 = 0b00100000;//全割り込み禁止　割り込みプライオリティーH/L
    U1RXPPS = 0b00010001;//U1RXをRC1に設定
    
    nEN = 0;

//周波数カウンター
	T0CON0 = 0b00010000; //TMR0 OFF 16bit 1:1
	T0CON1 = 0b00110000; //入力T0CKIPPS 非同期 プリスケーラ1/1
    T1CON = 0b00000110; //Timer1 16bit、1/1プリスケーラ
	T1GCON = 0b00000000; //TMR1 ゲートON T1GCONbits.GE = 1
	T1CLK = 0b00000010; // Fosc/1 
    TMR1ON = 0;//タイマー１停止　１：カウント
	
//1msec 周期割り込み
    T2CON = 0x01; //Timer2 post 1/15 プリスケーラ  1/2
	T2CLK = 0x05; //500KHz
	T2TMR = 0x00; // カウンター初期値 
    T2PR = 249;//
	PIE4bits.TMR2IE = 1;
	PIR4bits.TMR2IF = 0;
	T2CONbits.ON = 1;
	
	
//Sステッピングモーター駆動周期　１００Hzから400hzを可変
	T3CON = 0b00010110; //CKPS=1/2(3MHz) 16bit Timer3 OFF シンクロ無し
    T3CLK = 0b00000001; //FOSC/4:6MHz
	TMR3H = T3H;//
    TMR3L = T3L;//
//    T5H = T3H;T5L = T3L;
    
//Wステッピングモーター駆動周期　１００Hzから400hzを可変
	T5CON = 0b00010110; //CKPS=1/2(3MHz) 16bit Timer5 OFF シンクロ無し
    T5CLK = 0b00000001; //FOSC/4:6MHz
	TMR5H = T5H;//
    TMR5L = T5L;//

	
	U1TXB = 0;//割り込み許可前にクリア
	U1CON0 = 0xB0;//0b10110000; //TX RX 有効　8bit BRGS=1
	U1CON1 = 0x80;//0b10000000; //通信開始時 U1CON1bits.ON : 1
	U1CON2 = 0x44;//0b01000100; // TXPOL(2bit):1の時アイドルL　RXPOL(6bit);1のときアイドルL
	U1BRGL = 0x70; // L+ H=624 : 9600ボー 4800ボー　1249
	U1BRGH = 0x02; // Div =((24000000/9600)/4)-1=624(0x270)

	PIE3bits.U1RXIE = 1; //UART RX1 受信 割り込み許可
	PIR3bits.U1RXIF = 0;

	
	ADPCH = 0b00000001; //AN1 AD変換設定
	ADCON0 = 0b10010100;//ADC有効　クロックADCRC 右詰め　

	BLED = 0;//RLED=0;
	 a = eepdata_read(1017);//eeodata check 
     if (a != Bindexmax){saveFreqList();}//Bindexmaxに変更があった場合、EEPROM書き換え

	BFCNT = 2;
    RXindex = 0;
    DbugOK = 0;
    INTCON0bits.GIEH = 1;//全割込み許可
    INTCON0bits.GIEL = 1;
    stby_release = 0;
    

	maxACC = maxstep;//台形駆動のMAXステップ

    TMR3IE = 1;TMR5IE = 1;

//	goto LST002;//MORTOR初期設定を禁止する場合//を外す。

	initMotorDriver();//Motor Driver 初期設定
	YLED = STBY;
	initMotorSet();//Motor ０角度の初期設定
 //   while(1);
//    __delay_ms(500);
//	takelastdata();

//	presetVCposition(SVCtrgt,WVCtrgt,0);//SVC位置,WVC位置,センサーでstop検出する:1 しない:0

	
LST002:	//ATU初期設定完了を送信

    


    lastTUNEFreq = 1790;
	takeMonStep();
    CompFrqList = 0;
    lastBindex = Bindex;
//    __delay_ms(500);
	TXBufa[0] = 127;
	TXBufa[1] = 0;
	TXBufa[2] = 0;
	uart_short_send(TXBufa);
    SVCdir=1;
	WVCdir=1;

    SMSTOP = 1;WMSTOP = 1;//MOTOR beake
    lastsendFreq = 100;
    saveReq = 0;

	motorStandby(0);//STBY有効
	count3 = 0;
 	Blink = 0;Gled = 0;Oled = 0;ckswr = 0;
    VCselect = 1;
    CMPD = 0;
    lastTUNED = TUNED;
    while (1) {
        YLED = STBY;
        DbugOK = 1;
        if ((TUNED != lastTUNED) && (TUNED == 0)){
            TUNEstart = 0;
            lastTUNED = TUNED;
        }

    	if (MonIndexFlg == 1){saveMonStep();}
        getSWR();

		takeTUNEFreq();
    	if ((Vfwd > 70 ) && (count3 > 2000)){
    		
    		sendUARTshortData(sendFreq);
            sendUARTshortData(sendSWR);
    		count3 = 0;
    	}

        
    	startcheck();
        
		st = stopcheck();
        
 // 		if (UARTrcvd == 1) {saveFreqList();UARTrcvd = 0;}
    	M_UPcheck();
    	M_DOWNcheck();
//    	if (CompFrqList == 0){makeFreqList();}
        L3ON = L2TAP;
        if (lastBindex != Bindex){
           Freq = takeCenterFreq(Bindex);
           lastsavecnt = 0;saveReq = 1;
           lastBindex = Bindex;
        	saveReq = 1;
        }
        check30mBand();
		if ((TUNEstart == 0) && (presetCallREQ == 1)) { 
			motorStandby(1);
            TUNED = 0;BLED=0;
			get_presetdata(Bindex);
            BLED=TUNED;
            sendUARTshortData(sendETC);
            TUNEFreq = takeCenterFreq(Bindex);

			sendUARTshortData(sendFreq);
            presetVCposition(SVCtrgt,WVCtrgt,0);
            sendUARTshortData(sendSVCang);
			sendUARTshortData(sendWVCang);
			saveReq = 1;lastsavecnt = 0;

            presetCallREQ = 0;
			motorStandby(0);
            START = 0;STOP = 0;
		}
		if(TUNEstart == 1){//TUNEスタート
//            motorStandby(1);
			ckswr=0;
			TUNED = 0;BLED=0;
			
			getSWR();
            sendUARTshortData(sendSWR);

			if ((Vfwd >=70) && (Vfwd < 4100)){ 
                Gled = 1;Blink=0;sendUARTshortData(sendETC); //コントローラーのGRN LED on

				START = 0;
				ckswr=sarchswr(VCselect); 
			}else{motorStandby(0);Blink=1;Gled=1;sendUARTshortData(sendETC);}
			Blink=0;Gled=0;
			START = 0;STOP = 0;
            TUNEstart = 0;

		} 
        LST003:
		if (ckswr != 0) {
            STOP = 0;
			TUNEstart = 0;
			Gled = 0;
			if (ckswr == 1) {
                TUNED = 1;
                takeTUNEFreq();
                sendUARTshortData(sendFreq);

				save_presetdata(TUNEFreq);
                savelastdata();
				sendUARTshortData(sendETC);


                sendUARTshortData(sendSWR);

				sendUARTshortData(sendSVCang);

                sendUARTshortData(sendWVCang);
                
                TUNED = 0;
				saveReq = 1;lastsavecnt = 0;
                motorStandby(0);
                ckswr = 0;
			}
			if ((ckswr >= 2) && (ckswr < 5)){
                
                Oled = 1;Blink = 1;sendUARTshortData(sendETC);Oled=0;Blink=0;//コントローラーのRED LED on
                lastsavecnt = 0;saveReq = 1;
                ckswr = 0;
                motorStandby(0);
            }
            
		}

    }
}
