📄 mywinch.c
字号:
AD_CYC = Alarm_Time;
Prog_Time = (unsigned long)SMU*65536*256 +
(unsigned long)SMV*65536 +
(unsigned long)SMH*256 +
(unsigned long)SML;
Prog_Time=Prog_Time+time.l;
return;
}
void ADtemp(void)
{
TRISD = 0x00;
lcdnum = depth.u;
lcdnum = lcdnum*10/n.i[1];
format(lcdnum, buf, 1);
lcd_goto(2);
lcd_puts(buf);
// Depth Alarm = RF0
lcdnum /= 10;
lcdnum = speed;
lcdnum = lcdnum*2000/n.i[1]; // sample rate: 0.5s.
format(lcdnum, buf, 3);
lcd_goto(18);
lcd_puts(buf);
lcdnum = force;
lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
format(lcdnum, buf, 3);
lcd_goto(10);
lcd_puts(buf);
lcdnum = delta;
lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
format(lcdnum, buf, 3);
lcd_goto(26);
lcd_puts(buf);
}
void ADShow(void)
{
// Delay10KTCYx(25);
f0 = f1;
f1 = force;
delta = f1 - f0;
startADC();
ADtemp();
while(!rdyADC());
force = getADC()+n.i[2];
Recorddepth();
if(PORTAbits.RA5==0) { depth.u=0; }
Nop();
Nop();
}
void Alarm(void)
{
timep.l=time.l;
timep.l=(timep.l+10);
if(LATF!=0) {
do{
ADShow();//
// ADonce();//
Delay10KTCYx(10);
PORTCbits.RC0=1;
Delay10KTCYx(10);
PORTCbits.RC0=0;
Delay10KTCYx(10);
}while(time.l<timep.l);
}
else PORTCbits.RC0=0;
LATF=0;
}
void ADCone(void)
{
TRISD = 0x00;
lcdnum = depth.u;
lcdnum = (lcdnum*10/n.i[1]);
format(lcdnum, buf, 1);
lcd_goto(2);
lcd_puts(buf);
// Depth Alarm = RF0
lcdnum /= 10;
if(speed>0){
if((lcdnum>n.i[5])&(lcdnum<(n.i[5]+10))) LATFbits.LATF0=1;
else LATFbits.LATF0=0;
}
if(speed<0) {
if((lcdnum>(n.i[6]-10))&(lcdnum<n.i[6])) LATFbits.LATF0=1;
else LATFbits.LATF0=0;
}
lcdnum = speed;
lcdnum = (lcdnum*2000/n.i[1]); // sample rate: 0.5s.
format(lcdnum, buf, 3);
lcd_goto(18);
lcd_puts(buf);
// Speed Alarm = RF1
if(lcdnum>n.i[7]) LATFbits.LATF1=1;
else LATFbits.LATF1=0;
// if(Fristlove==0){lcdnum=10; force=0; delta=0; Fristlove=1;}
lcdnum = force;
lcdnum = (lcdnum*n.i[3]*11)/(n.i[4]*9);//weiyang 结构系数
format(lcdnum, buf, 3);
lcd_goto(10);
lcd_puts(buf);
// Force Alarm = RF2
if(lcdnum>n.i[8]) LATFbits.LATF2=1;
else LATFbits.LATF2=0;
lcdnum = delta;
lcdnum = ((lcdnum*n.i[3]*11)/(n.i[4]*9));//weiyang 结构系数
format(lcdnum, buf, 3);
lcd_goto(26);
lcd_puts(buf);
/////报警控制
if(FristTime==1) Alarm();
}
void delay(long int i)
{
long int j;
for(j=0;j<i;j++);
putch(0xbb);
}
void ADNow(void)
{
// Delay10KTCYx(25);
f0 = f1;
f1 = force;
delta = f1 - f0;
startADC();
ADCone();
while(!rdyADC());
force = (getADC()+n.i[2]);//
// if(Fristlove==0){ f1=0; force=0; delta=0; Fristlove=1;}
Recorddepth();
if(PORTAbits.RA5==0) { depth.u=0; }
Nop();
Nop();
}
void ShowAlarm(void)
{
char a1,a2;
int j,t;
int c[3];
union eep {
unsigned char c[2];
unsigned int i;
}mc;
lcd_clear();
for(j=5;j<9;j++){
t=j*2;
if(eeget(0) == 0x55 && eeget(1) == 0xaa) {
mc.c[0] = eeget(0x10+t);
mc.c[1] = eeget(0x10+t+1);
}
c[j-5]=mc.i;
}
lcd_goto(0);
lcd_putrs((unsigned rom char *)"最大深度");
lcd_goto(0x10);
lcd_putrs((unsigned rom char *)"最小深度");
lcd_goto(8);
lcd_putrs((unsigned rom char *)"最大速度");
lcd_goto(0x18);
lcd_putrs((unsigned rom char *)"最大张力");
do{
format(c[0], buf, 0);
lcd_goto(4);
lcd_puts(buf);
format(c[1], buf, 0);
lcd_goto(20);
lcd_puts(buf);
format(c[2], buf, 0);
lcd_goto(12);
lcd_puts(buf);
format(c[3], buf, 0);
lcd_goto(28);
lcd_puts(buf);
}while(PORTAbits.RA4==0);
InitLCD();
return;
}
void OtherSample(void)
{
long lt;
// InitLCD();
int a=0;
lcd_goto(0);
lcd_putrs((unsigned rom char *)"深度 m +");
while(final!=0xff){
do{
do{
do{
lt = time.l;
ADNow();
if((PORTAbits.RA4==0)&(FristTime==1)){
ShowAlarm();
lcd_goto(0);
lcd_putrs((unsigned rom char *)"深度 m +");
}
if(depth.u!=tp.u) { Sample(); }//深度不增加不存,10分钟1存
// }while(TL == 0 & INTCONbits.TMR0IF == 0);
}while(lt == time.l & INTCONbits.TMR0IF == 0);
// a=a+1;
// }while(a<600); //while((time.l%60)!=0);
}while((time.l%60)!=0);
// a=0;
DataSave(); // Data save
tp.u=depth.u;
}while(Prog_Time>time.l);
PSEG = PSEG + 1;
GetProgram();
final=(SMU&SMV&SMH&SML);
}
}
void manytimes(void)
{
long lt;
int a=0;
lcd_goto(0);
lcd_putrs((unsigned rom char *)"深度 m ?");
// T0CONbits.TMR0ON=0;
do{
do{
lt = time.l;
ADNow();
if((PORTAbits.RA4==0)&(FristTime==1)) {
ShowAlarm();
lcd_goto(0);
lcd_putrs((unsigned rom char *)"深度 m ?");
}
if(depth.u != tp.u) { Sample(); }
if(PORTAbits.RA5==0){ depth.u=0; }
}while(lt == time.l & INTCONbits.TMR0IF == 0);
a=a+1;
}while(a<30);
// }while((time.l%30)!=0);
// T0CONbits.TMR0ON=1;
OtherSample();
}
void Sample(void)
{
long lt;
lcd_goto(0);
lcd_putrs((unsigned rom char *)"深度 m ");
while(final!=0xff){
do{
do{
do{
lt = time.l;
ADNow();
if((PORTAbits.RA4==0)&(FristTime==1)) { ShowAlarm(); }
if((depth.u==tp.u)&(delta<25)&(FristTime==1)) { manytimes(); }//深度不增加不存,1分钟1存
// }while(TL == 0 & INTCONbits.TMR0IF == 0);
}while(lt == time.l & INTCONbits.TMR0IF == 0);
}while((time.l%AD_CYC)!=0);
DataSave(); // Data save
tp.u=depth.u;
}while(Prog_Time>time.l);
PSEG = PSEG + 1;
GetProgram();
FristTime=1;
final=(SMU&SMV&SMH&SML);
}
}
void SampleInit(void)
{
//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;
///从Sample()中调过来的
final=0x00;
PSEG=0;
// SamplInit();
tp.u=depth.u;////
}
//------------------------
void ADCMode(void)
{
lcd_clear();
lcd_goto(0x10);
lcd_putrs((unsigned rom char *)"记录模式 >>");
Version();
// Init_FLASH_MEM();
// MEM_FindFirst();
// MEM_LableFirst();
// Init_MEM();
RTCInit();
SampleInit();
if(n.i[0]==0) Readrecord();///如果深度预制为0,则读取掉电前的值
Nop();
Nop();
speed = 0;
force = 0;
Delay10KTCYx(100);
InitLCD();
Sample();
}
//////
/*
//接收应答
char SCIGetRec(char TSum) // Get a data packet from host
{
static unsigned char x;
unsigned char Rec;
do{
do {
Res1 = getch();
}while(Res1 != TSum);
Rec = getch();
for(i=1;i<=63;i++) {
Buf[4+i] = getch(); // get data
}
x=getch(); // get checksum
} while(x!=0xFF);
// return;
}
//检测USB设备
void TestUSB(void)
{
int i;
SCISend(0xaa);
SCISend(0xbb);
SCISend(0x01); //检测命令字
for(i=0;i<63;i++)
{ SCISend(0x20); }
}
//创建文件
char CreatFile(char name)
{
int i;
// char name1,name2,name3;
SCISend(0xaa);
SCISend(0xbb);
SCISend(0x07);//创建文件命令字
SCISend(0x00);//文件名
SCISend(0x00);
SCISend(name);
for(i=0;i<5;i++)
{ SCISend(0x20); }
SCISend(0x70);//文件后缀pse
SCISend(0x73);
SCISend(0x65);
for(i=0;i<11;i++)
{ SCISend(0x00); }
SCISend(0x00);///????
SCISend(0x74);
SCISend(0x08);
SCISend(0x33);
for(i=0;i<37;i++)
{ SCISend(0x00); }
}
//打开(选定)文件
char OpenFile(char name)
{
int i;
// char name1,name2,name3;
SCISend(0xaa);
SCISend(0xbb);
SCISend(0x06);//打开文件命令字
SCISend(0x00);//文件名
SCISend(0x00);
SCISend(name);
for(i=0;i<5;i++)
{ SCISend(0x20); }
SCISend(0x70);//文件后缀pse
SCISend(0x73);
SCISend(0x65);
for(i=0;i<52;i++)
{ SCISend(0x20); }
}
//设置文件指针
void SetFliePointer(void)
{
int i;
SCISend(0xaa);
SCISend(0xbb);
SCISend(0x15);//设置指针命令字
for(i=0;i<5;i++)
{ SCISend(0x00); }
for(i=0;i<56;i++)
{ SCISend(0x20); }
SCIGetRec(0x25);
}
//发送存储数据
void SendToFile(void)
{
SCISend(0xaa);
SCISend(0xbb);
SCISend(0x09);//打开文件命令字
SCISend(0x00);//固定字节
SCISend(0x00);
SCISend(0x01);//准备写入7680字节
for(i=0;i<60;i++)
{ SCISend(0x00); }
}
//写文件
char WriteFile(char block)
{
int i,j,k;
MEM_sector = (0x00 & 0x0f);
MEM_block = block;
// MEM_page = Buf[7];
// MEM_line = Buf[8];
SetFliePointer();
CSUM = 0;
for(i=0;i<=15;i++) {
for(j=0;j<=7;j++) {
if(j==0|j==5) SendToFile();
MEM_ReadLine(MEM_sector,MEM_block,i,j);
for(k=0;k<=63;k++) {
CSUM = CSUM ^ DataPack[k];
putch(DataPack[k]); // send to host
if(j==3|j==7) SCIGetRec(0x0C);
}
}
}
putch(CSUM);
}
//下载数据主函数
void DownData(void)
{
char a,j;
a=1;
for(j=4;j<=DataCout;j++){
CreatFile(a);
WriteFile(j);
a++;
}
lcd_clear();
lcd_goto(0x10);
lcd_putrs((unsigned rom char *)"USB 已完成");
}
void ToUSB(void)
{
SPBRG1=3;//57600
lcd_clear();
lcd_goto(0x10);
lcd_putrs((unsigned rom char *)"USB 传输中 >>");
lcd_goto(8);
lcd_putrs((unsigned rom char *)"目前测试中...");
MEM_FindFirst();
DataCout = MEM_block;//需要发送的块数
TestUSB();
while(1);
}
*/
//////
void Version(void)
{
lcd_goto(8);
lcd_putrs((unsigned rom char *)"Ver 2.08c");
}
void main(void)
{
TRISC = 0x18;
OpenI2C(MASTER,SLEW_OFF); // Open I2C Bus
SSPADD = 9; // 100kHz clock (3.6864MHz)
Dectime();
DostoUnix();
PMode=1;
if(PORTAbits.RA4==0) PMode=0; //模式键(S2)判断
FristTime=0;
InitPorts();
/// PORTAbits.RA5==1; //深度清0
Init_MEM();
lcd_init();
// if(PORTAbits.RA5==0) PMode=2;
////---------------
if(PMode==1){///1是采样
ADCMode();
}
/*
else if(PMode==2){
ToUSB();
}
*/
else {
SwapMode = 0;
lcd_clear();
lcd_goto(0x10);
lcd_putrs((unsigned rom char *)"通讯模式 >>");
Version();
do{
in=Buf;
out=Buf;
SCIGetPack(); // Get a data packet
SCISendACK(0xa1); // send ACK
switch(pcmd)
{
case 1:
SCISendACK(0xa1);break; // Send acknowledge[SendNull]
case 2:
SCIData();break; // Send a sample[GetSample]
case 4:
SCIErase();break; // EraseBlock
case 8:
SCIFormat();break; // FormatTool<<<<<-------
case 16:
SCIRead();break; // ReadLine
case 32:
SCIWrite(); break; // WriteLine
case 64:
SCIBlock();break; // ReadBlock
case 80:
ShowAllParameter();break; //显示所有设置参数
case 81:
SetParameter();break; //设置参数
case 82:
ReadParameter();break; //读取参数
case 83:
ShowTime();break;
case 84:
InitDate();break; //预制日期(年/月/日)
case 85:
InitTime();break; //预制时间(24时/分/秒)
default:break;
}
}while(SwapMode!=1);
SwapMode = 0;
}
}
//-----End of Program-----
//=============
//----NOTE-----
//=============
//+++++++ Function Map +++++++
//----中断服务程序(2级中断模式)
//----实时时钟
//----存储器代码
//----LCD显示
//----7714代码
//----响应与应答
//----PC接口函数
//----Log Mode
//----初始化
//----模式转换
//----main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -