www.pudn.com > gprs.rar > GPRS.C


//for simcom300 Modle 
#include "p18f6520.h" 
#include "delays.h" 
#include "portb.h" 
#include "GPRS.h" 
#include "gprspg.h" 
 
 
 
/********************************************************** 
高低中断入口 
**********************************************************/ 
#pragma interrupt High_isr save = PROD,PCLATH,PCLATU,TBLPTR,TABLAT//,section(".tmpdata")//,section("MATH_DATA") 
 
#pragma code Highisrcode=0x0008 			// Locate ISR handler code at interrupt vector 
void Highisrhandler(void)				// This function directs execution to the 
{							// actual interrupt code										 
_asm 
goto High_isr 
_endasm 
} 
#pragma code 
 
/* 
#pragma interrupt Low_isr save = PROD//,PCLATH,PCLATU,TBLPTR,TABLAT,section("MATH_DATA"),section(".tmpdata") 
 
 
#pragma code Lowisrcode=0x0018 
void Lowisrhandler(void) 
{ 
_asm 
goto	Low_isr 
_endasm 
} 
#pragma code 
*/ 
 
/********************************************************** 
高优先级中断处理子程序 
**********************************************************/ 
void High_isr(void) 
{ 
 
	if((PIR1bits.RC1IF)&&(PIE1bits.RC1IE)) USART1_REC(); 
	if((PIR3bits.RC2IF)&&(PIE3bits.RC2IE)) USART2_REC(); 
 
	if((INTCONbits.TMR0IF)&&(INTCONbits.TMR0IE)) 
	{ 
		INTCONbits.TMR0IF = 0; 
		TMR0L += 6;			// 8ms 
		if(COMFG1.bits.RXING) 
		{ 
			if(++RXOVERTMR1>=10)	//80ms 外串口接收停止超过80毫秒,表示接收完一贞 
			{ 
				if(!COMFG1.bits.AFrame) 
				{ 
					COMFG1.bits.AFrame=1;		//待处理通讯贞标志 
					FrameEnd1.data=RXpt1.data;	//此通讯贞结束地址 
					COMFG1.bits.RXING=0;		//清除正在接受标志 
					RXOVERTMR1=0;			//字间间隔计时器 
				} 
			} 
		} 
		if(COMFG2.bits.RXING) 
		{ 
			if(++RXOVERTMR2>=2)	//16ms 内串口(连接模块)接收停止超过16毫秒,表示接收完一贞 
			{ 
				if(!COMFG2.bits.AFrame) 
				{ 
					COMFG2.bits.AFrame=1; 
					FrameEnd2.data=RXpt2.data; 
					COMFG2.bits.RXING=0; 
					RXOVERTMR2=0; 
				} 
			} 
		} 
		TXOVERTMR1++; 
		TXOVERTMR2++; 
		 
		if(!(ClockTMR&0x1f)) 
		{ 
			if(dispErr) PWR_Lap=~PWR_Lap; 
			else PWR_Lap=0; 
			if(Connecting) SIG_Lap=~SIG_Lap; 
		} 
		 
		if((++ClockTMR)&0x80)	//8ms*128=1024ms 
		{ 
			if(++SecErr>=15) 
			{ 
				if(SecErr>=15) RUNERR(); 
			} 
			Have1SEC = 1; 
			ClockTMR-=0x80; 
		} 
			 
	} 
} 
 
 
/*********************************************************** 
main process entry 
***********************************************************/ 
void main(void) 
{ 
	INTCON = 0; 
	SecErr = 0; 
	GeneralFlag1.ch = 0;		//通用标志1清为零 
	dispErr=1; 
	ClockTMR = 0;			//累加器清零 
	PORT_INIT();			//port initialize 
	initsfr();			//初始化特殊功能寄存器 
	Delay50ms(); 
	RST_2=0; 
	Nop(); 
	SIM_ON_IO=0; 
	Nop(); 
	SIM_ON=0; 
	R0=50; 
	while(R0--) 
	{ 
		Delay50ms(); 
	} 
	RST_2=1; 
	Nop(); 
	SIM_ON=1; 
	Nop(); 
	SIM_ON_IO=1; 
	initsfr();			//初始化特殊功能寄存器 
	WDTCONbits.SWDTEN=1; 
	INTCONbits.GIE=1; 
	R0=120; 
	while(R0--) 
	{ 
		Delay50ms(); 
		SecErr=0; 
	} 
	Init_Com1(); 
	Init_Com2(); 
	Init_ServerIP(); 
	InitGPRS(); 
	if(WorkFG.bits.InitErr) 
	{ 
		R0=40; 
		while(R0--) 
		{ 
			Delay50ms(); 
		} 
		RUNERR(); 
	} 
	Init_Com1(); 
	Init_MODE(); 
	NetRssi=NetBer=0x99;		//信号强度未知 
	ATcsq(); 
	if(!WaitFrame2()) WaitFrame2(); 
	ATframe(); 
	if(NetRssi>=10) dispErr=0; 
	InitGPRS(); 
	Init_Com1(); 
	Com1Sec=0; 
	Com2Sec=0; 
	 
	while(1) 
	{ 
		ClrWdt();		//使用软件件控制的WDT 
		Check_MODE(); 
		if(SendATFG.bits.IPchange||WorkFG.bits.InitErr) 
		{ 
			if(SendATFG.bits.IPchange||WorkFG.bits.InitErr) 
			{ 
				ATcsq(); 
				if(!WaitFrame2()) WaitFrame2(); 
				ATframe(); 
				InitGPRS(); 
				if(WorkFG.bits.InitErr) RUNERR(); 
			} 
		} 
		 
	/*	if(RXpt2.pt==Framept2.pt) 
		{ 
			if(RXpt2.pt!=COMBUF2) 
			{ 
				INTCONbits.GIE=0; 
				if(RXpt2.pt==Framept2.pt) ResetCOMBUF2(); 
				INTCONbits.GIE=1; 
			} 
		} 
		else 
		{	*/ 
			if(SendATFG.bits.IPDing) Com2Trans(); 
			else 
			{ 
				EndTX1(); 
				IPDtran=0; 
				if(WorkFG.bits.Online||COMFG2.bits.AFrame||COMFG2.bits.FramErr) 
					ATframe(); 
			} 
	//	} 
		 
		if(WorkFG.bits.Ring) 
		{ 
			if(!((SendATFG.ch&0x0f)||(COMFG2.ch&0x0f))) 
				ATh0(); 
		} 
				 
	/*	if(RXpt1.pt==Framept1.pt) 
		{ 
			if(RXpt1.pt!=COMBUF1) 
			{ 
				INTCONbits.GIE=0; 
				if(RXpt1.pt==Framept1.pt) ResetCOMBUF1(); 
				INTCONbits.GIE=1; 
			} 
		} 
		else 
		{	*/ 
			if(SendATFG.bits.Tranning) 
			{ 
				if(WorkFG.bits.Online) 
				{ 
					if(SendATFG.bits.DATAing) SendAbyte1(); 
					else BeginSend1(); 
				} 
			} 
			else 
				Serialframe(); 
	//	} 
		if(ConnectOk) 
		{ 
			ConnectOk=0; 
			goto ssssdd; 
		} 
		if(CONFIGFG.bits.enTest) 
		{ 
			if(MinTest>=SetMinTest) 
			{ 
			ssssdd: 
				if(RXpt1.pt==Framept1.pt) 
				{ 
					INTCONbits.GIE=0; 
					if(!(COMFG1.ch&0x0f)) 
					{ 
						ResetCOMBUF1(); 
						if(!CONFIGFG.bits.enID) 
						{ 
							for(R0=0;R0<17;R0++) 
							{ 
								R3=HeadCS[R0]; 
								*(RXpt1.pt++)=R3; 
								if(R3==' ') break; 
							} 
						} 
						*(RXpt1.pt++)=0x0d; 
						*(RXpt1.pt++)=0x0a; 
						COMFG1.bits.AFrame=1; 
						FrameEnd1.data=RXpt1.data; 
						RXOVERTMR1=0; 
						MinTest=0; 
					} 
					INTCONbits.GIE=1; 
				} 
			} 
		} 
		 
		if(Have1SEC) do_SEC(); 
		 
		 
		if(FSR1L||FSR2L) 
		{ 
			if(FSR1L||FSR2L)  
			{ 
				FSR2=0x0700; 
				FSR1=0x0700; 
				RUNERR(); 
			} 
		} 
	} 
} 
 
 
void BeginSend1(void) 
{ 
	ATcipsend(); 
	SendATFG.bits.WaitTS=1; 
	SendATFG.bits.DATAing=1; 
	TXOVERTMR2=0; 
	subah=0; 
	subal=AT_HeadID; 
	IICNUM=14; 
	IICMEM=HeadID; 
	EEPR(); 
	HeadCS[0]='I'; 
	HeadCS[1]='D'; 
	HeadCS[2]=':'; 
	SendATFG.bits.HDing=1; 
	TXpt1.pt=HeadCS; 
	TXSAVED1=0; 
	R0=50; 
	while(R0--) 
	{ 
		DelayXms(1); 
		if(!SendATFG.bits.WaitTS) return; 
	} 
	TXSTA2bits.TXEN=1;	//没在50毫秒内收到提示 
	ATclear(); 
	SendATFG.bits.WaitTS=0; 
	SendATFG.bits.DATAing=0; 
} 
	 
void SendAbyte1(void) 
{ 
	if(!TXSTA2bits.TRMT) return;		//use tx2 
	TXSTA2bits.TXEN=1; 
	if(CONFIGFG.bits.enID) 
	{ 
		if(SendATFG.bits.HDing) 
		{ 
			if(TXpt1.pt<=(HeadCS+16)) 
			{ 
				R3=*(TXpt1.pt++); 
				TXREG2=R3; 
				if(R3==' ') SendATFG.bits.HDing=0; 
			//	BufJYH1=0; 
				return; 
			} 
		} 
	} 
	SendATFG.bits.HDing=0; 
	if(COMFG1.bits.AFrame) 
	{ 
		if(Framept1.pt==FrameEnd1.pt) 
		{ 
			COMFG1.bits.AFrame=0; 
		SendEndcom1: 
			TXREG2=0x1a; 
			SendATFG.bits.Tranning=0; 
			SendATFG.bits.DATAing=0; 
			SecCnt=0; 
			MinTest=0;		//每次数据传输完,重置信跳计时 
			return; 
		} 
	} 
	if(TXSAVED1>=480) goto SendEndcom1; 
 
	RXptbak.pt=RXpt1.pt; 
	temp4.Uchp=Framept1.pt; 
	SFrameFG.bits.Contin=0; 
	Get_char1(); 
	if(SFrameFG.bits.Contin) 
	{ 
		if(COMFG1.bits.RXING) return; 
		COMFG1.bits.AFrame=0; 
		goto SendEndcom1; 
	} 
	Framept1.pt=temp4.Uchp; 
	TXREG2=R3; 
//	BufJYH1+=R3; 
	TXSAVED1++; 
} 
	 
 
void do_SEC(void) 
{ 
	if(!Have1SEC) return; 
	Have1SEC=0; 
	SecErr = 0; 
	Main_Init(); 
	if(WorkFG.bits.Online) 
	{ 
		Connecting=0; 
		SIG_Lap=0; 
		if(++SecCnt>=60) 
		{ 
			SecCnt=0; 
			MinTest++; 
		} 
		if((++Com1Sec)>=63) 
		{ 
			if(!SendATFG.bits.IPDing) 
			{ 
				Com1Sec=0; 
				INIT_USART1(); 
			} 
		} 
		if((++Com2Sec)>=63) 
		{ 
			if(!(SendATFG.bits.DATAing||SendATFG.bits.ATing)) 
			{ 
				Com2Sec=0; 
				INIT_USART2(); 
			} 
		} 
	} 
	else 
	{ 
	//	SIG_Lap=1;	//由终端完成闪烁显示 
		Connecting=1; 
		SecRedail++; 
		MinTest=0; 
	} 
	 
	if(COMFG2.bits.RXING) goto do_SEC1; 
	if(COMFG2.bits.AFrame) goto do_SEC1; 
	if(SendATFG.ch&0x0f) goto do_SEC1; 
 
	CheckLine(); 
	if(WorkFG.bits.NewMS) 
	{ 
		WorkFG.bits.NewMS=0; 
		temp1.Uchar[1]=MSindex[1]; 
		temp1.Uchar[0]=MSindex[0]; 
		ATcmgr(); 
		if(!WaitFrame2()) WaitFrame2(); 
		ATframe(); 
		if(ATFrameFG.bits.CMEERR) WorkFG.bits.NewMS=1; 
		else if(ATFrameFG.bits.cmgd) 
		{ 
			ATcmgd(); 
			if(!WaitFrame2()) WaitFrame2(); 
			ResetCOMBUF2();	 
		} 
		else WorkFG.bits.TestMS=1; 
	} 
	 
	if(COMFG1.ch&0x0f) goto do_SEC1; 
	if(COMFG2.ch&0x0f) goto	do_SEC1; 
 
	if(WorkFG.bits.TestMS) CheckMS(); 
	 
do_SEC1: 
	Nop(); 
} 
	 
void Main_Init(void) 
{ 
	IPR1=0xff; 
	IPR2=0xff; 
	IPR3=0xff; 
	if(T0CON!=T0CON_init) T0CON=T0CON_init;	 
	T1CON=0; 
	T2CON=0; 
	T3CON=0; 
	T4CON=0; 
	 
	CCP1CON=0; 
	CCP2CON=0; 
	CCP3CON=0; 
	CCP4CON=0; 
	CCP5CON=0; 
	 
	INTCON2=0x07;	//TMR0IP,INT3IP,RBIP=1  
	INTCON3=0xc0;	//INT2IP INT1IP INT3IE INT2IE INT1IE INT3IF INT2IF INT1IF 
	INTCON|=0b11100000;	//GIEH,GIEL,T0IE=1  
	INTCONbits.RBIE=0; 
	INTCONbits.INT0IE=0; 
 
	RCONbits.IPEN=0; 
 
	PIE2=0; 
 
	if(TRISA!=TRISA_INIT) TRISA=TRISA_INIT; 
 
	if(TRISB!=TRISB_INIT) TRISB=TRISB_INIT; 
 
	if(TRISC!=TRISC_INIT) TRISC=TRISC_INIT; 
 
	if(TRISD!=TRISD_INIT) TRISD=TRISD_INIT; 
 
	if(TRISE!=TRISE_INIT) TRISE=TRISE_INIT; 
 
	if(TRISF!=TRISF_INIT) TRISF=TRISF_INIT; 
 
	if(TRISG!=TRISG_INIT) TRISG=TRISG_INIT; 
 
	ADCON1=0X0F; 
 
	CMCON=0X07; 
 
	Nop(); 
	RST_2=1; 
	Nop(); 
	SIM_ON=1; 
 
}	 
 
/*********************************************************** 
Initialize port and tris process subroutine 
************************************************************/ 
void PORT_INIT(void) 
{ 
	TRISA=TRISA_INIT; 
	Nop(); 
	PORTA=PORTA_INIT; 
 
	TRISB=TRISB_INIT; 
	Nop(); 
	PORTB=PORTB_INIT; 
 
	TRISC=TRISC_INIT; 
	Nop(); 
	PORTC=PORTC_INIT; 
 
	TRISD=TRISD_INIT; 
	Nop(); 
	PORTD=PORTD_INIT; 
 
	TRISE=TRISE_INIT; 
	Nop(); 
	PORTE=PORTE_INIT; 
 
	TRISF=TRISF_INIT; 
	Nop(); 
	PORTF=PORTF_INIT; 
 
	TRISG=TRISG_INIT; 
	Nop(); 
	PORTG=PORTG_INIT; 
 
	ADCON1=0X0F;			//make porta and porte to digital i/o 
	CMCON=0X07; 
} 
 
 
/********************************************************** 
初始化特殊功能寄存器 
**********************************************************/ 
void initsfr(void) 
{ 
	INTCON=0; 
	Init_Com1(); 
	Init_Com2(); 
 
	SSPCON1=0; 
	SSPSTAT=0; 
	RCON=0b00011111;	// disable priority levels 
	PIR1=0; 
	PIR2=0; 
	PIR3=0; 
	CCP1CON=0; 
	CCP2CON=0; 
	CCP3CON=0; 
	CCP4CON=0; 
 
	PIE1=PIE1_init;		//0x20		// RC1IE & SSPIE 
	PIE2=0; 
	PIE3=PIE3_init;		//0x20;		// RC2IE 
	TMR0L=0; 
	TMR0H=0; 
	T0CON=T0CON_init;	//timer0 ON/8bits/1:32预分频器 8ms@4MHz 
	T1CON=0; 
	T2CON=0; 
	T3CON=0;		// set tmr2 for pwm 
	T4CON=0; 
	IPR1=0xff; 
	IPR2=0xff; 
	IPR3=0xff; 
	INTCON2=0x07;	//TMR0IP,INT3IP,RBIP=1  
	INTCON3=0xc0;	//INT2IP INT1IP INT3IE INT2IE INT1IE INT3IF INT2IF INT1IF 
	INTCON=0b01100000;	//GIEH,GIEL,T0IE=1  
} 
 
/*********************************************************** 
Recieve single byte from infrared or 485 
************************************************************/ 
 
void USART1_REC(void) 
{ 
	if((RCSTA1bits.OERR)||(RCSTA1bits.FERR)) 
	_asm 
	goto	INIT_USART1	//是否有溢出错误or帧错误 
	_endasm 
 
	Rint0=RCREG1; 
	COMFG1.bits.RXING=1; 
	RXOVERTMR1=0; 
	Com1Sec=0; 
	if(COMFG1.bits.BUF_over) return; 
//	tempINT.Uchp=RXpt1.pt; 
/*	if(COMFG1.bits.rec0D) 
	{ 
		if(Rint0!=0x0a) 
		{ 
			COMFG1.bits.AFrame=1; 
			FrameEnd1.pt=tempINT.Uchp; 
		} 
	} 
	COMFG1.bits.rec0D=0; 
	if(Rint0==0x0d) COMFG1.bits.rec0D=1;	//*/ 
	 
	tempINT.Uint=RXpt1.data-Framept1.data; 
	if(tempINT.Sint<0) tempINT.Uint+=(COMBUF1_end-COMBUF1_st); 
	if(tempINT.Uint>=(COMBUF1_end-COMBUF1_st-0x80)) 
	{ 
		COMFG1.bits.BUF_full=1; 
		if(tempINT.Uint>=(COMBUF1_end-COMBUF1_st-3)) COMFG1.bits.BUF_over=1; 
	}		 
	else if(tempINT.Uint<0x100) COMFG1.bits.BUF_full=0; 
	 
	if(Rint0==0x1a) 
	{ 
		*(RXpt1.pt++)=0x5c;	//'\' 
		if(RXpt1.data>=COMBUF1_end) RXpt1.pt=COMBUF1; 
		Rint0='A'; 
	} 
	else if(Rint0==0x5c) 
	{ 
		*(RXpt1.pt++)=Rint0;	//'\' 
		if(RXpt1.data>=COMBUF1_end) RXpt1.pt=COMBUF1; 
	//	Rint0=0x5c;		//'\' 
	} 
	*(RXpt1.pt++)=Rint0; 
	if(RXpt1.data>=COMBUF1_end) RXpt1.pt=COMBUF1; 
} 
 
void USART2_REC(void) 
{ 
	if((RCSTA2bits.OERR)||(RCSTA2bits.FERR)) 
	_asm 
	goto	INIT_USART2	//是否有溢出错误or帧错误 
	_endasm 
	 
	Rint0=RCREG2; 
	COMFG2.bits.RXING=1; 
	RXOVERTMR2=0; 
	Com2Sec=0; 
	if(COMFG2.bits.BUF_over) return; 
//	tempINT.Uchp=RXpt2.pt; 
 
	if(SendATFG.bits.WaitTS) 
	{ 
		if(Rint0=='>') 
		{ 
			SendATFG.bits.WaitTS=0; 
			return; 
		} 
	} 
	/* 
	if(SendATFG.bits.WaitTS) 
	{ 
		if(COMFG2.bits.recTS) 
		{			//上一个字符为 '>' 
			if(Rint0==' ') 
			{ 
				SendATFG.bits.WaitTS=0; 
				return; 
			} 
			else 
			{ 
				*(RXpt2.pt)='>'; 
				RXpt2.data=PTinc2(RXpt2.data); 
			} 
				 
		} 
		else if(Rint0=='>') 
		{ 
			COMFG2.bits.recTS=1; 
			return; 
		}	 
	}//*/ 
/*	if(COMFG2.bits.rec0D) 
	{ 
		if(Rint0!=0x0a) 
		{ 
			COMFG2.bits.AFrame=1; 
			FrameEnd2.pt=RXpt2.pt; 
		} 
	}	 
	COMFG2.bits.rec0D=0; 
	if(Rint0==0x0d) COMFG2.bits.rec0D=1;	 
	COMFG2.bits.recTS=0; 
	if(Rint0=='>') COMFG2.bits.recTS=1;	//*/ 
	 
	tempINT.Uint=RXpt2.data-Framept2.data; 
	if(tempINT.Sint<0) tempINT.Uint+=(COMBUF2_end-COMBUF2_st); 
	if(tempINT.Uint>(COMBUF2_end-COMBUF2_st-0x80)) 
	{ 
		COMFG2.bits.BUF_full=1; 
		if(tempINT.Uint>=(COMBUF2_end-COMBUF2_st-3)) COMFG2.bits.BUF_over=1; 
	} 
	else if(tempINT.Uint<0x100) COMFG2.bits.BUF_full=0; 
 
	*(RXpt2.pt++)=Rint0; 
	if(RXpt2.data>=COMBUF2_end) RXpt2.pt=COMBUF2; 
} 
 
 
void CLRcren1(void) 
{ 
	RCSTA1bits.CREN=0; 
	_asm 
	MOVF	RCREG1,0,0 
	_endasm 
	RCSTA1bits.OERR=0;	 
	RCSTA1bits.FERR=0;	 
	_asm 
	MOVF	RCREG1,0,0 
	_endasm 
} 
 
void CLRcren2(void) 
{ 
	RCSTA2bits.CREN=0; 
	_asm 
	MOVF	RCREG2,0,0 
	_endasm 
	RCSTA2bits.OERR=0;	 
	RCSTA2bits.FERR=0;	 
	_asm 
	MOVF	RCREG2,0,0 
	_endasm 
} 
 
void EndTX1(void) 
{ 
 
	TXSTA1bits.TXEN=0; 
	TXD_1=1; 
	TXOVERTMR1=0; 
} 
 
void EndTX2(void) 
{ 
	TXSTA2bits.TXEN=0; 
	TXD_2=1; 
	TXOVERTMR2=0; 
} 
 
const rom unsigned char bpsTable[7] =		//must check DispTable+16<255 !!!!!!!!!!! 
{	207,	//0300 
	103,	//0600 
 	207,	//1200 
	103,	//2400 
	51,	//4800 
	25,	//9600 
	12,	//19200 
}; 
 
 
void INIT_USART1(void) 
{ 
	PIE1bits.RC1IE=0; 
	TXSTA1=0; 
	if(Com1BPS<=1) TXSTA1bits.BRGH=0; 
	else TXSTA1bits.BRGH=1; 
	if(Com1BPS>6) Com1BPS=5;	//9600 
	SPBRG1=bpsTable[Com1BPS]; 
	CLRcren1(); 
	COMFG1.bits.RXING=0; 
	RXOVERTMR1=0; 
	if(CONFIGFG.bits.Com1Bit9) 
	{ 
		TXSTA1bits.TX9=1; 
		RCSTA1=0xd0;		//SPEN,CREN=1, RX9=1 
	} 
	else 
	{ 
		TXSTA1bits.TX9=0; 
		RCSTA1=0x90;		//SPEN,CREN=1, RX9=0 
	} 
	PIR1bits.RC1IF=0; 
	PIE1bits.RC1IE=1; 
} 
 
void INIT_USART2(void) 
{ 
	PIE3bits.RC2IE=0; 
	TXSTA2=TXSTA2_init;		//TXEN,TX9,SYNC=0,BRGH=1 
	SPBRG2=SPBRG2_init; 
	CLRcren2(); 
	COMFG2.bits.RXING=0; 
	RXOVERTMR2=0; 
	RCSTA2=RCSTA2_init;		//SPEN,CREN=1, RX9=0 
	PIR3bits.RC2IF=0; 
	PIE3bits.RC2IE=1; 
} 
 
void Init_Com1(void) 
{ 
	subah=0; 
	subal=AT_Com1BPS; 
	IICNUM=1; 
	IICMEM=&Com1BPS; 
	EEPR();	 
	INIT_USART1(); 
	EndTX1(); 
	ResetCOMBUF1(); 
	COMFG1.ch=0; 
} 
 
void Init_Com2(void) 
{ 
	INIT_USART2(); 
	EndTX2(); 
	ResetCOMBUF2(); 
	COMFG2.ch=0; 
} 
	 
/********************************************************** 
片内EEP读写操作 
**********************************************************/ 
void EEPR(void) 
{ 
	IICFLAG.ch=0; 
	do 
	{ 
		EECON1=0; 
		EEADRH=subah; 
		EEADR=subal; 
		IIC_TEMP=IICNUM; 
		IIC1MEM=IICMEM; 
		do 
		{ 
			EECON1bits.RD=1; 
			IICFLAG.bits.noack=0; 
			IICBUF=EEDATA; 
			EEDATA^=0Xff; 
			EECON1bits.RD=1; 
			if(IICBUF!=EEDATA) 
			{  
				IICFLAG.bits.noack=1; 
				break; 
			} 
			*(IIC1MEM++)=IICBUF; 
			if(!(++EEADR)) 
			{ 
				if(!(--IIC_TEMP)) break; 
				IICFLAG.bits.noack=1; 
				return; 
			} 
		}while(--IIC_TEMP); 
		IICFLAG.ch++; 
		ClrWdt(); 
		if(!IICFLAG.bits.noack) break; 
	//	Delay10TCYx(10);		//delay 100us@4MHz 
	}while(!IICFLAG.bits.cnt); 
} 
 
void EEPW(void) 
{ 
	IICFLAG.ch=0; 
	do 
	{ 
		EEADRH=subah; 
		EEADR=subal; 
		IIC_TEMP=IICNUM; 
		IIC1MEM=IICMEM; 
		do 
		{ 
			IICBUF=*(IIC1MEM++); 
			EEDATA=IICBUF; 
			EECON1=0X04; 	//WREN=1 
			EECON2=0X55; 
			EECON2=0XAA; 
			EECON1bits.WR=1; 
			while(EECON1bits.WR) Nop(); 
			EECON1=0; 
			EEDATA^=0Xff; 
			EECON1bits.RD=1; 
			if(IICBUF!=EEDATA) 
			{ 
				IICFLAG.bits.noack=1; 
				break; 
			} 
			if(!(++EEADR)) 
			{ 
				if(!(--IIC_TEMP)) break; 
				IICFLAG.bits.noack=1; 
				return; 
			} 
		}while(--IIC_TEMP); 
		IICFLAG.ch++; 
		ClrWdt(); 
		if(!IICFLAG.bits.noack) return; 
	//	Delay10TCYx(10);		//delay 100us@4MHz 
	}while(!IICFLAG.bits.cnt); 
} 
 
/*********************************************************** 
公用延时子程序  
************************************************************/ 
void DelayXms(unsigned char i)		//delay i*2ms 
{ 
	while(i--) 
	{ 
		Delay10TCYx(99);		//2000  clks at 4MHz 
		Nop(); 
		Nop(); 
		ClrWdt(); 
	} 
} 
 
void Delay50ms(void)		//delay i*2ms 
{ 
	DelayXms(50); 
} 
 
void RUNERR(void) 
{ 
	Reset(); 
	Nop(); 
	Reset(); 
	Nop(); 
} 
 
unsigned char Check_ServerIP(void) 
{ 
	for(R0=0;R0<=20;R0++) 
	{ 
		if((R0==3)||(R0==7)||(R0==11)) 
		{ 
			if(BFIIC[R0]!='.') return(0); 
		} 
		else if(R0==15) 
		{ 
			if(BFIIC[15]!=':') return(0); 
		} 
		else if((BFIIC[R0]>0x39)||(BFIIC[R0]<0x30)) return(0); 
	} 
	return(1); 
} 
 
void Init_ServerIP(void) 
{ 
	subah=0; 
	subal=AT_HeadID; 
	IICNUM=14; 
	IICMEM=HeadID; 
	EEPR(); 
	if(IICFLAG.bits.noack) RUNERR(); 
	HeadCS[0]='I'; 
	HeadCS[1]='D'; 
	HeadCS[2]=':'; 
	subah=0; 
	subal=AT_IPadr; 
	IICNUM=16; 
	IICMEM=BFIIC; 
	EEPR(); 
	if(IICFLAG.bits.noack) RUNERR(); 
	subah=0; 
	subal=AT_IPport; 
	IICNUM=5; 
	IICMEM=BFIIC+16; 
	EEPR(); 
	if(IICFLAG.bits.noack) RUNERR(); 
	BFIIC[15]=':'; 
	if(Check_ServerIP()==1) return; 
	 
	subah=0; 
	subal=AT_IPadr; 
	IICNUM=16; 
	IICMEM=BFIIC; 
	EEPR(); 
	if(IICFLAG.bits.noack) RUNERR(); 
	subah=0; 
	subal=AT_IPport; 
	IICNUM=5; 
	IICMEM=BFIIC+16; 
	EEPR(); 
	if(IICFLAG.bits.noack) RUNERR(); 
	BFIIC[15]=':'; 
	if(Check_ServerIP()==1) RUNERR(); 
	 
	BFIIC[0]='2'; 
	BFIIC[1]='1'; 
	BFIIC[2]='1'; 
	BFIIC[3]='.'; 
	BFIIC[4]='1'; 
	BFIIC[5]='5'; 
	BFIIC[6]='7'; 
	BFIIC[7]='.'; 
	BFIIC[8]='2'; 
	BFIIC[9]='1'; 
	BFIIC[10]='3'; 
	BFIIC[11]='.'; 
	BFIIC[12]='1'; 
	BFIIC[13]='4'; 
	BFIIC[14]='5'; 
	BFIIC[15]=':'; 
	BFIIC[16]='0'; 
	BFIIC[17]='5'; 
	BFIIC[18]='0'; 
	BFIIC[19]='0'; 
	BFIIC[20]='0'; 
	subah=0; 
	subal=AT_IPadr; 
	IICNUM=15; 
	IICMEM=BFIIC; 
	EEPW(); 
	subah=0; 
	subal=AT_IPport; 
	IICNUM=5; 
	IICMEM=BFIIC+16; 
	EEPW(); 
	BFIIC[3]=' '; 
	BFIIC[4]=0x0d; 
	BFIIC[5]=0x0a; 
	subah=0; 
	subal=AT_HeadID; 
	IICNUM=14; 
	IICMEM=BFIIC; 
	EEPW(); 
	subah=0; 
	subal=AT_HeadID; 
	IICNUM=14; 
	IICMEM=HeadID; 
	EEPR(); 
} 
 
void Init_MODE(void) 
{ 
	subah=0; 
	subal=AT_CONFIGFG; 
	IICNUM=1; 
	IICMEM=&CONFIGFG.ch; 
	EEPR();	 
	subah=0; 
	subal=AT_TestLong; 
	IICNUM=1; 
	IICMEM=&SetMinTest; 
	EEPR();	 
	subah=0; 
	subal=AT_SetReSec; 
	IICNUM=1; 
	IICMEM=&SetReSec; 
	EEPR();	 
	 
	 
	subah=0; 
	subal=AT_PASS; 
	IICNUM=1; 
	IICMEM=&Mode; 
	EEPR();	 
	if(Mode==MODE_MS) return; 
	if(Mode==MODE_GPRS) return; 
	subah=0; 
	subal=AT_PASS; 
	IICNUM=1; 
	IICMEM=&Mode; 
	EEPR();	 
	if(Mode==MODE_MS) return; 
	if(Mode==MODE_GPRS) return; 
	 
	Mode=MODE_GPRS; 
	subah=0; 
	subal=AT_PASS; 
	IICNUM=1; 
	IICMEM=&Mode; 
	EEPW();	 
	 
	CONFIGFG.ch=0; 
	CONFIGFG.bits.enTest=1; 
	subah=0; 
	subal=AT_CONFIGFG; 
	IICNUM=1; 
	IICMEM=&CONFIGFG.ch; 
	EEPW();	 
	 
	SetMinTest=5; 
	subah=0; 
	subal=AT_TestLong; 
	IICNUM=1; 
	IICMEM=&SetMinTest; 
	EEPW();	 
	 
	SetReSec=30; 
	subah=0; 
	subal=AT_SetReSec; 
	IICNUM=1; 
	IICMEM=&SetReSec; 
	EEPW();	 
} 
 
void Check_MODE(void) 
{ 
	if(Mode==MODE_MS) return; 
	if(Mode==MODE_GPRS) return; 
	_asm 
	goto Init_MODE 
	_endasm 
} 
	 
	 
#include "ATframe.c" 
#include "command.c"