⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprs.c

📁 pic18f6520上运行的gprs通讯处理程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	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"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -