📄 cali_5460_0716.c
字号:
calitemp[1]=rxdata[1];
calitemp[2]=rxdata[2];
sspread(0x16); //读Irms
// sspread(0x06); //读取电压通道校准值
VIdcoff[dcoffcount++]=rxdata[0];
VIdcoff[dcoffcount++]=rxdata[1];
sspread(0x02); //读取电流通道DC偏移量校准值
// sspread(0x04); //读取电流通道增益校准值
VIdcoff[dcoffcount++]=rxdata[0];
VIdcoff[dcoffcount++]=rxdata[1];
VIdcoff[dcoffcount++]=rxdata[2];
txdata[0]=calitemp[0];
txdata[1]=calitemp[0];
txdata[2]=calitemp[0];
sspwrite(0x5e);
// txdata[0]=0;
// txdata[1]=0;
// txdata[2]=0;
// sspwrite(0x42);
// txdata[0]=0x40;
// txdata[1]=0;
// txdata[2]=0;
// sspwrite(0x44);
INH1=0;
INH2=1;
A0=0;
A1=0;
A2=0;
delay_1s();
/////////////////////////////////////
// write_byte(0xdd); //电压电流通道交流偏移校准
write_byte(0xCE); //电流增益校准
// write_byte(0xE8);
while(1)
{delay_1s();
LED=!LED;
sspread(0x1e);
if((rxdata[0]&0x80)!=0)break;
}
calitemp[0]=rxdata[0];
calitemp[1]=rxdata[1];
calitemp[2]=rxdata[2];
// sspread(0x22); //暂不读取校准值
sspread(0x16); //读Irms
VIacgain[0]=rxdata[0];
VIacgain[1]=rxdata[1];
VIacgain[2]=rxdata[2];
sspread(0x04); //读取电流通道增益校准值
// sspread(0x20); //读电流通道Iacoff
VIacgain[4]=rxdata[0];
VIacgain[5]=rxdata[1];
VIacgain[6]=rxdata[2];
txdata[0]=calitemp[0];
txdata[1]=calitemp[0];
txdata[2]=calitemp[0];
sspwrite(0x5e);
///////////////////////////////////////////////////
txdata[0]=0xff;
txdata[1]=0xff;
txdata[2]=0xfe;
sspwrite(0xff);
txdata[0]=0x00;
txdata[1]=0x00;
txdata[2]=0x80;
sspwrite(0x40); //复位CS5460
txdata[0]=0xff;
txdata[1]=0xff;
txdata[2]=0xff;
sspwrite(0x5e); //初始化状态寄存器,清状态标志位
txdata[0]=0x00;
txdata[1]=0x0f;
txdata[2]=0xa0;
sspwrite(0x4A); //初始化周期寄存器,设定N=4000
txdata[0]=0x00;
txdata[1]=0xE0;
txdata[2]=0x11; //设定K=1,关滤波器
sspwrite(0x40); //初始化配置寄存器
txdata[0]=VIacgain[4];
txdata[1]=VIacgain[5];
txdata[2]=VIacgain[6];
sspwrite(0x44);
txdata[0]=VIdcoff[2];
txdata[1]=VIdcoff[3];
txdata[2]=VIdcoff[4];
sspwrite(0x42);
write_byte(0xe8);
while(1)
{delay_1s();
LED=!LED;
sspread(0x1e);
if((rxdata[0]&0x80)!=0)break;
}
sspread(0x16);
VIacoff[3]=rxdata[0];
VIacoff[4]=rxdata[1];
VIacoff[5]=rxdata[2];
}
//清中断
void CLRFINT()
{
INTCON = 0x00;
INTCON2 = 0x00;
INTCON3 = 0x00;
PIE1 = 0x00;
PIE2 = 0x00;
PIR1 = 0x00;
PIR2 = 0x00;
IPR1 = 0x00;
IPR2 = 0x00;
RCON = 0x00;
}
//端口初始化
void INITPERIPH()
{
STATUS = 0x00;
PORTA = 0x00;
LATA = 0x00;
PORTB = 0x00;
LATB = 0x00;
PORTC = 0x00;
LATC = 0x00;
PORTD = 0x00;
LATD = 0x00;
PORTE = 0x00;
LATE = 0x00;
ADCON1 = 0x07;
TRISA = 0x00;
TRISB = 0x21;
TRISD = 0x00;
TRISC = 0x90;
TRISE = 0x00;
//--------------------------------------------------------------------------
// SSP通信
//--------------------------------------------------------------------------
TRISC &= 0xD7;
TRISC |= 0x90;
SSPCON1 = 0x00; //禁用串口,配置为IO口
SSPSTAT = 0xC0;
//--------------------------------------------------------------------------
// TMR1初始化
//--------------------------------------------------------------------------
T1CON=0x80;
//--------------------------------------------------------------------------
// TMR2初始化
//--------------------------------------------------------------------------
T2CON=0X01;
PR2=0xFF;
TMR2=0;
TMR2ON=1;
//--------------------------------------------------------------------------
// SCI初始化
//--------------------------------------------------------------------------
TXSTA=0X04;
RCSTA=0X80;
SPBRG=0X19;
rs485_control=1;
CREN=1;
}
void CONFIGINT(void)
{
TMR2IE=1;
RCIE=1; //
TXIE=1;
RCIP=1;
TXIP=1;
TMR1IP=1;
IPEN=1; //使能中断高低优先级
PEIE=1;
GIE=1;
}
void sspwrite(unsigned char address)
{
unsigned char i;
write_byte(address);
for(i=0;i<3;i++)
{write_byte(txdata[i]);}
}
//读5460程序,address为读取的寄存器
void sspread(unsigned char address)
{
unsigned char i,j;
unsigned char temp;
write_byte(address);
for(i=0;i<3;i++)
{
temp=0xFE;
for(j=0;j<8;j++)
{
SCLK=0;
if(temp&0x80)SDO=1;
else SDO=0;
temp=temp<<1;
rxdata[i]=rxdata[i]<<1;
if(SDI)
rxdata[i]=rxdata[i]|0x01;
SCLK=1;
}
}
}
void write_byte(unsigned char csdata)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(csdata & 0x80) SDO=1;
else SDO=0;
SCLK=0;
csdata=csdata<<1;
SCLK=1;
}
// i=8;
// while(i--)
// {
// if((csdata&(0x1<<i))==0)
// SDO=0;
// else
// SDO=1;
// SCLK=0;
// SCLK=1;
// }
}
//************************************************************************
// RS485功能码识别,数据校验,生成返回数组
//************************************************************************
void Rs485Func()
{
unsigned char t;
if(my_addr!=vlm[addr])
{
CREN = 1;
rs485_control= 1;
return; //暂无延时设置
}
else
{
t=6;
Updatacrc(vlm,t);
if((crc_h==vlm[h_crc])&&(crc_l==vlm[l_crc]))
{
if(send[funcnum]==func03)
{function03(); //生成03功能返回数组
TXREG = send[data_count];
rs485_control=0;
TXEN=1;
}
else if(send[funcnum]==func06)
{function06(); //生成06功能返回数组
TXREG = send[data_count];
rs485_control=0;
TXEN=1; //启动发送
}
}
else //校验不通过继续接收
{
CREN = 1;
rs485_control= 1;
return; //暂无延时设置
}
}
}
void function03(void)
{
unsigned char t,i;
unsigned int k;
send[datanum]=vlm[l_regnum]*2;
t=send[datanum];
k=vlm[h_add];
k=k<<8;
k=(k|vlm[l_add]);
k=k<<1;
for(i=0;i<t;i++)
{
send[datafs+i]=vlmtab[k+i];
}
t=send[datanum]+3;
Updatacrc(send,t);
send[t]=crc_l;
send[t+1]=crc_h;
send_count=send[datanum]+5;
}
void function06(void)
{
phcompensation=vlm[l_regnum];
updata_phase=1;
send_count=8;
}
void Updatacrc(unsigned char *pointer,unsigned char datalen)
{
unsigned char i,j,tmp1;
bit tmp2;
crc_h = 0xff;
crc_l = 0xff;
for(i=0;i<datalen;i++)
{
crc_l^=*pointer++;
for(j=0;j<8;j++)
{
if(crc_h&0x01==1)
{tmp1=0x80;}
else
{tmp1=0x00;}
crc_h=crc_h>>1;
if(crc_l&0x01==1)
{tmp2=1;}
else
{tmp2=0;}
crc_l=crc_l>>1;
crc_l=crc_l|tmp1;
// CARRY=0;
// #asm
// RRCF _crc_h,F
// RRCF _crc_l,F
// #endasm
// if(CARRY==1)
if(tmp2==1)
{
crc_h^=0xA0;
crc_l^=0x01;
}
}
}
}
void delay_10ms()
{
unsigned int i;
i=1000;
while(--i){;}
}
void delay_100ms()
{
unsigned int i;
i=10000;
while(--i){;}
}
void delay_1s()
{
unsigned int i;
i=11;
while(--i)
{delay_100ms();}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -