📄 mywinchbeta.c
字号:
if(eeget(0) == 0x55 && eeget(1) == 0xaa) {
for(i=0; i<18; i++) n.c[i] = eeget(0x10+i);
}
else {
for(i=0; i<9; i++) n.i[i] = nini[i];
for(i=0; i<18; i++) eeput(0x10+i, n.c[i]);
eeput(0, 0x55);
eeput(1, 0xaa);
}
}
//=====================
//------7714
//=====================
void OpenSWSPI (void)
{
SW_CS_PIN = 1; // Make the CS pin high
SW_DIN_PIN = 1; // Make the DIN pin high
SW_DOUT_PIN = 0; // Make the Dout and SCK pin low
SW_SCK_PIN = 0;
TRIS_SW_CS_PIN = 0; // Make the CS pin an output
TRIS_SW_DIN_PIN = 1; // Make the DIN pin an input
TRIS_SW_DOUT_PIN = 0; // Make the DOUT pin an output
TRIS_SW_SCK_PIN = 0; // Make the SCK pin an output
}
char WriteSWSPI(char output)
{
char BitCount; // Bit counter
static char input;
BitCount = 8; // Do 8-bits
input = output;
// SCK idles low
// Data output after falling edge of SCK
// Data sampled before rising edge of SCK
do // Loop 8 times
{
// at SCK Rising edge
if(input&0x80) // Set Dout to the next bit according to the MSB of data
SW_DOUT_PIN = 1;
else
SW_DOUT_PIN = 0;
SW_SCK_PIN = 1; // Set the SCK pin
Nop(); // Produces a 50% duty cycle clock
Nop();
Nop();
Nop();
// at SCK Falling edge
if(SW_DIN_PIN) // Set the carry bit according to the Din pin
STATUSbits.C = 1;
else
STATUSbits.C = 0;
SW_SCK_PIN = 0; // Clear the SCK pin
_asm
rlcf input,1,1
_endasm
BitCount--; // Count iterations through loop
} while(BitCount);
return(input); // Return the received data
}
void initADC(void)
{
OpenSWSPI();
WriteSWSPI(0xff); // Reset SPI
WriteSWSPI(0xff);
WriteSWSPI(0xff);
WriteSWSPI(0xff);
///64 A0 28 E4 A0 20
WriteSWSPI(0x24); // High Filter
WriteSWSPI(0x21); /////////
// WriteSWSPI(0x20); /////////
WriteSWSPI(0x34); // Low Filter
// WriteSWSPI(0x90); /////////////
WriteSWSPI(0x90); /////////////
}
void startADC(void)
{
WriteSWSPI(0xff); // Reset SPI
WriteSWSPI(0xff);
WriteSWSPI(0xff);
WriteSWSPI(0xff);
WriteSWSPI(0x14); // mode reg
WriteSWSPI(0x3c); // start Self-Cal, G=128
// WriteSWSPI(0x38); // start Self-Cal, G=128
}
char rdyADC(void)
{
char mod, rdy;
//check modereg
WriteSWSPI(0x1c);
mod = WriteSWSPI(0x00);
//query DRDY
WriteSWSPI(0x0c);
rdy = WriteSWSPI(0x00);
return ((mod&0xe0)==0) && ((rdy&0x80)==0);
}
int getADC(void)
{
// union adr ad;
// read AD result
WriteSWSPI(0x5c);
ad.c[1]=WriteSWSPI(0x00);//<<<<------------------
ad.c[0]=WriteSWSPI(0x00);//<<<<<<<---------------
// if(ad.i<0) return (int)(ad.i);
return (int)(ad.i-0x8000);
}
void ADonce(void)
{
// ADCone();
lcdnum = depth.u;
// ADCone();
startADC();
while(!rdyADC());
force = getADC()+n.i[2];
}
//=====================
//------响应与应答
//=====================
void SCISendACK(char x) // Send acknowledge
{
Res1 = x;
CSUM = 0x37;
SCISend(0xff);
SCISend(0xff);
SCISend(0x37); // Packet ID
CSUM = (CSUM ^ Res1); // acknowledge command
SCISend(Res1);
CSUM = (CSUM ^ Res2); // acknowledge command
SCISend(Res2);
CSUM = (CSUM ^ 0x01); // length
SCISend(0x01);
SCISend(CSUM); // send checksum
return;
}
void SCIGetPack(void) // Get a data packet from host
{
static unsigned char x;
unsigned char i;
do {
do {
Res1 = getch();
}while(Res1 != 0x37);
Buf[2] = 0x37; // get the start flag
CSUM = 0x37;
Buf[3] = getch();
pcmd = Buf[3]; // get command
CSUM = CSUM ^ Buf[3];
Buf[4]=getch();
lc = Buf[4]; // get length of data
CSUM = CSUM ^ Buf[4];
for(i=1;i<=lc;i++) {
Buf[4+i] = getch(); // get data
CSUM = CSUM ^ Buf[4+i];
}
x=getch();// get checksum
} while(x!=CSUM);
// return(pcmd);
}
void SCIDataInit(void)
{
OpenTimer0(TIMER_INT_ON&T0_16BIT&T0_SOURCE_INT&T0_PS_1_8);
OpenRB1INT (PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON & FALLING_EDGE_INT);
initADC();
RCONbits.IPEN = 1;
INTCONbits.GIEH = 1;
}
void SCIData(void)
{
char p1,p2,d1,d2,d3,d4;
SCIDataInit();
ADonce();
p1 = ad.c[1]; // PH
p2 = ad.c[0]; // PM
d3 = depth.c[3]; // PL
d2 = depth.c[2]; // TH
d1 = depth.c[1]; // TM
d0 = depth.c[0]; // TL
//--Response
SCISend(0xff);
SCISend(0xff);
CSUM=0X37;
SCISend(0x37);
CSUM = CSUM ^ 0xb1;
SCISend(0xb1);
CSUM = CSUM ^ 0xb1;
SCISend(0xb1);
CSUM = CSUM ^ 0x07;
SCISend(0x07);
//---Send temperature,press and timer
//张力
CSUM = CSUM ^ p1;//ph
SCISend(p1);//PH
CSUM = CSUM ^ p2;//pm
SCISend(p2);//PM
//深度
CSUM = CSUM ^ d3;//pl
SCISend(d3);//PL
CSUM = CSUM ^ d2;
SCISend(d2);//TH
CSUM = CSUM ^ d1;
SCISend(d1);//TM
CSUM = CSUM ^ d0;
SCISend(d0);//TL
SCISend(CSUM);
}
//=====================
//-----PC接口函数
//=====================
void SCIErase(void) // Erase a block
{
MEM_sector = (Buf[5] & 0x0f);
MEM_block = Buf[6];
MEM_page = 0;
MEM_EraseBlock(MEM_sector,MEM_block,MEM_page);
SCISendACK(0xff);
}
//-------------------
void SCIFormat(void)
{
lcd_clear();
lcd_goto(0x10);
lcd_putrs((unsigned rom char *)"正在格式化...");
MEM_Format();
SCISendACK(0xff);
lcd_clear();
lcd_goto(0x10);
lcd_putrs((unsigned rom char *)"格式化成功...");
// LightLED(20);
}
//----------------
void SCIRead(void) // Read a line
{
unsigned char i;
SCILoadAddr();
MEM_ReadLine(MEM_sector,MEM_block,MEM_page,MEM_line);
SCISend(0xff);
SCISend(0xff);
CSUM = 0x37;
SCISend(0x37); // Data ID
CSUM = CSUM ^ Res1;
SCISend(Res1);
CSUM = CSUM ^ Res2;
SCISend(Res2);
CSUM = CSUM ^ 0x41; // lengh of data (65 bytes)
SCISend(0x41);
for(i=0;i<=63;i++) {
CSUM = CSUM ^ DataPack[i];
SCISend(DataPack[i]); // Send to host
}
SCISend(CSUM); // send checksum
}
//--------------------
void SCIWrite(void) // Write a line
{
unsigned char i;
ResetMem();
SCILoadAddr();
for(i=0;i<=63;i++) {
DataPack[i] = Buf[i+11];
}
MEM_WriteLine(MEM_sector,MEM_block,MEM_page,MEM_line);
SCISendACK(0xff);
}
//------------------------
void SCIBlock(void) // Read a block
{
unsigned char i,j,k;
SCILoadAddr();
CSUM = 0;
for(i=0;i<=15;i++) {
for(j=0;j<=7;j++) {
MEM_ReadLine(MEM_sector,MEM_block,i,j);
for(k=0;k<=63;k++) {
CSUM = CSUM ^ DataPack[k];
putch(DataPack[k]); // send to host
}
}
}
putch(CSUM);
}
////--------------------------
void ShowAllParameter(void)
{
char i;
SCISend(0xff);
SCISend(0xff);
CSUM = 0x37;
SCISend(0x37); // Data ID
CSUM = CSUM ^ 0xa1;
SCISend(0xa1);
CSUM = CSUM ^ 0x00;
SCISend(0x00);
CSUM = CSUM ^ 0x13; // lengh of data (19 bytes)
SCISend(0x13);
if(eeget(0) == 0x55 && eeget(1) == 0xaa)
{
for(i=0; i<18; i++) {
n.c[i] = eeget(0x10+i);
CSUM = CSUM ^ n.c[i];
putch(n.c[i]);
}
}
putch(CSUM);
}
//-------------------------
void SetParameter(void)
{
char i;
union tempx {
char c[2];
int i;
}trpx;
i=Buf[5];
trpx.c[0]=Buf[6];
trpx.c[1]=Buf[7];
if(trpx.i >= nmin[i] && trpx.i < nmax[i]) {
// n.i[i] = x;
// putrs1USART(sok);
i <<= 1;
eeput(0x10+i, trpx.c[0]);
i += 1;
eeput(0x10+i, trpx.c[1]);
SCISendACK(0xff);
return;
}
else SCISendACK(0x55); /// 超出预置范围
}
///---------------------------
void ReadParameter(void)
{
int i;
char a1,a2;
char sum;
i=Buf[5];
i <<= 1;
if(eeget(0) == 0x55 && eeget(1) == 0xaa) {
a1 = eeget(0x10+i);
a2 = eeget(0x10+i+1);
}
putch(0xff);
putch(0xff);
CSUM = 0x37;
SCISend(0x37);
CSUM = CSUM ^ 0xa1;
SCISend(0xa1);
CSUM = CSUM ^ 0x00;
SCISend(0x00);
CSUM = CSUM ^ 0x03;
SCISend(0x03);
CSUM = CSUM ^ a1;
SCISend(a1);
CSUM = CSUM ^ a2;
SCISend(a2);
SCISend(CSUM);
}
///---------------------------
void InitDate(void)
{
real_time.Year = Buf[5];
real_time.Month = Buf[6];
real_time.Date = Buf[7];
// real_time.ctr_reg = 0x93;
Init_RealDate();
SCISendACK(0xff);
}
///-----------------------
void InitTime(void)
{
real_time.Hours = Buf[5];
real_time.Minutes = Buf[6];
real_time.Seconds = Buf[7];
// real_time.ctr_reg = 0x93;
Init_RealTime();
SCISendACK(0xff);
}
///----------------------
void ShowTime(void)
{
Get_RealTimeClock();
putch(0xff);
putch(0xff);
CSUM = 0x37;
SCISend(0x37);
CSUM = CSUM ^ 0xa1;
SCISend(0xa1);
CSUM = CSUM ^ 0x00;
SCISend(0x00);
CSUM = CSUM ^ 0x07;
SCISend(0x07);
CSUM = CSUM ^ real_time.Year;
SCISend(real_time.Year);
CSUM = CSUM ^ real_time.Month;
SCISend(real_time.Month);
CSUM = CSUM ^ real_time.Date;
SCISend(real_time.Date);
CSUM = CSUM ^ real_time.Hours;
SCISend(real_time.Hours);
CSUM = CSUM ^ real_time.Minutes;
SCISend(real_time.Minutes);
CSUM = CSUM ^ real_time.Seconds;
SCISend(real_time.Seconds);
SCISend(CSUM);
}
void InitPorts(void)
{
TRISA = 0xFF;
TRISB = 0xE3;
TRISC = 0xfe;
TRISD = 0x00;
TRISE = 0x00;
TRISF = 0x00;
PORTF = 0x00;
ADCON1=0xff;// PortA I/O enable
SPBRG1=1;//115200
TXSTA1bits.BRGH=1;
TXSTA1bits.TXEN=1;
RCSTA1bits.CREN=1;
RCSTA1bits.SPEN=1;
in=Buf;
out=Buf;
PIE1bits.RC1IE=1;
INTCONbits.PEIE=1;
INTCONbits.GIE = 1;
INTCONbits.GIEL=1;
RCONbits.IPEN=1;
// INTCONbits.GIEH=1;
IPR1bits.RCIP=0;
//MEM
MEM_CE=0;
//
Res1 = 0;
Res2 = 0;
}
void InitLCD(void)
{
lcd_init();
lcd_clear();
//-- initialise LCD --
lcd_goto(0);
lcd_putrs((unsigned rom char *)"深度 m");
lcd_goto(0x10);
lcd_putrs((unsigned rom char *)"速度 km/h");
lcd_goto(8);
lcd_putrs((unsigned rom char *)"张力 t");
lcd_goto(0x18);
lcd_putrs((unsigned rom char *)"差分 t");
}
void SamplInit(void)
{
//initial USART;
Open1USART( USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT &USART_CONT_RX &USART_BRGH_HIGH,1);
//initial Timer0;
OpenTimer0(TIMER_INT_ON&T0_16BIT&T0_SOURCE_INT&T0_PS_1_8);
//initial RB1;
OpenRB1INT (PORTB_CHANGE_INT_ON & PORTB_PULLUPS_ON & FALLING_EDGE_INT);
cmdinit();//// 读取E2PROM中的预置值
depth.u = n.i[0];////深度预置值
depth.u *= n.i[1];
speed = 0;
initADC();
RCONbits.IPEN = 1;
INTCONbits.GIEH = 1;
}
//=====================
//------采样主函数
//=====================
//================
//----时钟初始化--
//================
void RTCInit(void)
{
TL=0x00;
time.l=totalsec;
// TMR1H=0x80;
}
//------------------
void GetRealTime(void)
{
Real_Time=0;
// Real_Time= (unsigned long)TMU*65536*256 +
// (unsigned long)TMV*65536 +
// (unsigned long)TMH*256 +
// (unsigned long)TML;
}
//-----------------
void GetProgram(void)
{
// char line;
int i;
if(PSEG==5){PSEG=0;line=line+1;}
Init_FLASH_MEM();
MEM_ReadLine(0,2,0,line);
i=(16*PSEG);
SMU = DataPack[i];
SMV = DataPack[i+1];
SMH = DataPack[i+2];
SML = DataPack[i+3];
AMH = DataPack[i+4];
AML = DataPack[i+5];
for(i=0;i<=63;i++) {
DataPack[i] = 0x00;
}
Alarm_Time = (unsigned int)AMH*256 +
(unsigned int)AML;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -