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

📄 gprs.c

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

⌨️ 快捷键说明

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