📄 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -