📄 icoc.c
字号:
/**********************************************************************
* FileName: icoc.c
* Compiler: MPLAB C30
**********************************************************************/
#if defined(__dsPIC33F__)
#include "p33fxxxx.h"
#endif
#include "icoc.h"
#include "rx8583.h"
unsigned char Next[6];
unsigned char count=0, pulse=0, cnt=0;
unsigned int impp=0;
//因无信号源,故设置一个IO输出端口GPS,由T3控制脉冲频率,
//用做调试对时程序时所需的秒脉冲信号
//其脉宽为0.1s,期望占空比为1:10
#define GPS PORTDbits.RD0
void InitCPU(void)
{
INTCON1bits.NSTDIS = 0;
CORCONbits.IPL3 = 0;
SRbits.IPL = 1;
InitTmr3();
InitIC8();
}
/*******************************************************************************
函数功能:定时器3初始化
*******************************************************************************/
void InitTmr3(void)
{
T3CONbits.TON = 0;
TMR3 = 0;
PR3 = 49999; // 0.1秒中断
T3CONbits.TGATE = 0; // 禁止门控时间累加
T3CONbits.TCS = 0; // 内部时钟
T3CONbits.TCKPS = 2; // 预分频比1:64
IPC2bits.T3IP = 5;
IFS0bits.T3IF = 0;
IEC0bits.T3IE = 1;
T3CONbits.TON = 1; // Start Timer 3
}
/*******************************************************************************
输入捕捉模块8初始化:每16个上升沿捕捉一次 每4次捕捉事件中断一次
*******************************************************************************/
void InitIC8(void)
{
/*********IC8 配置 捕捉GPS上升沿***************/
TRISDbits.TRISD15 = 1; //PULSE
TRISDbits.TRISD0 = 0; //GPS
IC8CONbits.ICM = 0;
IC8CONbits.ICTMR = 0;
IC8CONbits.ICI = 3;
IC8CONbits.ICM = 5;
IPC5bits.IC8IP = 5;
IFS1bits.IC8IF = 0;
IEC1bits.IC8IE = 1;
}
void __attribute__((__interrupt__, no_auto_psv)) _T3Interrupt(void)
{
if(count==0){GPS = 1;pulse ++;}
else GPS = 0;
count++;
if(count>=10)count=0;//T3中断10次才产生一个高电平脉冲
IFS0bits.T3IF = 0;
}
/*******************************************************************************
每16个上升沿乘以4次捕捉事件中断一次,即每64秒(64个脉冲)中断一次
读时钟函数,并与上一次中断逻辑计算的时间值比较,若不等,写时钟
*******************************************************************************/
void __attribute__((__interrupt__, no_auto_psv)) _IC8Interrupt(void)
{
unsigned char i, add = 0;
static unsigned char first = 1;
cnt = pulse;//调试 检验是否为64个脉冲输入后IC8产生中断
if(pulse>=64)pulse=0;
ReadTime();
if(first)
{
for(i=0;i<6;i++) {Next[i] = clock[i];}
first = 0;
}
for(i=0; i<6; i++)
{
if(clock[i] != Next[i])
{
clock[i] = Next[i];
WriteTime();
}
}
//计算下次中断时刻的准确时间
Next[5] = clock[5]+64;
add = Next[5]/60;
Next[5] = Next[5]%60;//秒
Next[4] = clock[4]+add;//分
if(Next[4]>=60)
{
Next[4] = 0;Next[3]++;//时
if(Next[3]>=24)
{
Next[3] = 0;Next[2]++;//日
switch(Next[1])
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(Next[2]>31){Next[2] = 1; Next[1]++;}
break;
case 2:
if((Next[0]%4!=0)&&(Next[2]>29)){Next[2] = 1; Next[1]++;}
if((Next[0]%4==0)&&(Next[2]>28)){Next[2] = 1; Next[1]++;}
break;
case 4:
case 6:
case 9:
case 11:
if(Next[2]>30){Next[2]=1;Next[1]++;}
break;
default:
break;
}
if(Next[1]==13){Next[1]=1;Next[0]++;}
}
}
IFS1bits.IC8IF = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -