?? mywinch.c
字號:
//**********************************************************************************
// File: Mywinch.c for PPS66JC Depth Measure System
// Written By: YE ZHAOBO, R&D Center SPT.Inc. 2005.06
// Last Version 2005
//**********************************************************************************
// This code implements a PPS66JC surface interface box using the P18F6620 MCU;
// The code was compiled using the MC18 compliler ver. 8.01pl3;
// The device frequency should be 3.6864 MHz;
// The PCB is PPS66JC
//
//關鍵更新信息
//...存貯功能
//...已經修正時間錯誤
//...realtime計時
//...用戶自定義時鐘
//...模式控制
//...采樣控制
//...支持USB數據傳輸(Beta)
//-------------------------------------------------------------------
//-------------------------------------------------------------------
// The following files should be included in the MPLAB project:
//
// mywinch.c -- Main source code file
// winch.h
//
// Use Bootloader tech
// Support Upgrade Online
// Support E-mail: yezhaobo@hotmail.com
// All Right Reserved
//---------------------------------------------------------------------
#include <p18f6620.h> // Register definitions
#include "winch.h"
///-------------
void high_routine (void);
void low_routine (void);
void InitPorts();
void ADCone(void);
void Sample(void);
void Version(void);
void Dectime(void);
void SampleInit(void);
void ADNow(void);
//---------------------------------------------------------------------
// Interrupt routine 中斷處理程序
//---------------------------------------------------------------------
#pragma code high_ISR = 0x08
void high_ISR(void)
{
_asm
goto high_routine
_endasm
}
#pragma code
#pragma code low_ISR=0x18
void low_ISR(void)
{
_asm
goto low_routine
_endasm
}
#pragma code
#pragma interruptlow low_routine save=PROD
void low_routine(void)
{
// INTCONbits.GIEL=1;
if(PIR1bits.RCIF!=0){
*in++=RCREG1;
if((in-Buf)>=80) in=Buf;//超過緩沖則將指針復位(指向緩沖的第一個地址)
}
}
#pragma interrupt high_routine
void high_routine (void)
{
if(INTCON3bits.INT1IF) {
if(PORTBbits.RB0)
depth.u++;
else
depth.u--;
INTCON3bits.INT1IF = 0;
}
if(INTCONbits.TMR0IF) {
d0 = d1;
d1 = depth.u;
speed = d1 - d0;
// f0 = f1;
// f1 = force;
// delta = f1 - f0;
TL++;
if(TL==0x02){time.l++;TL=0;}
INTCONbits.TMR0IF = 0;
}
}
//---------------------------------------------------------------------
// Functions
//---------------------------------------------------------------------
void Get_RealTimeClock(void);
void Init_RealTimeClock(void);
/**********************************************************************************/
void Get_RealTimeClock(void)
{
IdleI2C();
StartI2C();
while (SSPCON2bits.SEN); // wait until start condition is over
WriteI2C(0b11010000); // Write DS1307:D0H
NotAckI2C();
IdleI2C(); // ensure module is idle
if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition, if received
{
WriteI2C(0x00); // DS1307 : REG Addr.
NotAckI2C();
}
IdleI2C();
StopI2C();
while(SSPCON2bits.PEN); // wait until stop condition is over
//------------------------------------------------------------------------
IdleI2C();
StartI2C();
while (SSPCON2bits.SEN); // wait until start condition is over
WriteI2C(0b11010001); // Read DS1307:D1H
NotAckI2C();
IdleI2C(); // ensure module is idle
if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition, if received
{
real_time.Seconds = ReadI2C();
AckI2C();
while(SSPCON2bits.ACKEN);
real_time.Minutes = ReadI2C();
AckI2C();
while(SSPCON2bits.ACKEN);
real_time.Hours = ReadI2C();
AckI2C();
while(SSPCON2bits.ACKEN);
real_time.Day = ReadI2C();
AckI2C();
while(SSPCON2bits.ACKEN);
real_time.Date = ReadI2C();
AckI2C();
while(SSPCON2bits.ACKEN);
real_time.Month = ReadI2C();
AckI2C();
while(SSPCON2bits.ACKEN);
real_time.Year = ReadI2C();
NotAckI2C();
while(SSPCON2bits.ACKEN);
}
IdleI2C();
StopI2C();
while(SSPCON2bits.PEN); // wait until stop condition is over
}
/*------------------------------------------------------------------------------------*/
void Init_RealTimeClock(void)
{
IdleI2C();
StartI2C();
while (SSPCON2bits.SEN); // wait until start condition is over
WriteI2C(0b11010000); // Write DS1307:D0H
NotAckI2C();
IdleI2C(); // ensure module is idle
if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition, if received
{
WriteI2C(0x00); // DS1307 : REG Addr.
NotAckI2C();
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Seconds); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Minutes); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Hours); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Day); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Date); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Month); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Year); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.ctr_reg); // Control REG
NotAckI2C();
}
}
IdleI2C();
StopI2C();
while(SSPCON2bits.PEN); // wait until stop condition is over
}
///
void Init_RealTime(void)
{
IdleI2C();
StartI2C();
while (SSPCON2bits.SEN); // wait until start condition is over
WriteI2C(0b11010000); // Write DS1307:D0H
NotAckI2C();
IdleI2C(); // ensure module is idle
if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition, if received
{
WriteI2C(0x00); // DS1307 : REG Addr.
NotAckI2C();
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Seconds); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Minutes); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Hours); // Configuration data
NotAckI2C();
}
}
IdleI2C();
StopI2C();
while(SSPCON2bits.PEN); // wait until stop condition is over
}
void Init_RealDate(void)
{
IdleI2C();
StartI2C();
while (SSPCON2bits.SEN); // wait until start condition is over
WriteI2C(0b11010000); // Write DS1307:D0H
NotAckI2C();
IdleI2C(); // ensure module is idle
if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition, if received
{
WriteI2C(0x04); // DS1307 : REG Addr.
NotAckI2C();
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Date); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Month); // Configuration data
NotAckI2C();
}
IdleI2C();
if ( !SSPCON2bits.ACKSTAT )
{
WriteI2C(real_time.Year); // Configuration data
NotAckI2C();
}
}
IdleI2C();
StopI2C();
while(SSPCON2bits.PEN); // wait until stop condition is over
}
////
char hextodec(unsigned char temp)
{
unsigned char a,b,c;
a=(temp&0xf0)>>4;
b=(temp&0x0f);
c=10*a+b;
return c;
}
void Recorddepth(void)
{
IdleI2C();
StartI2C();
while (SSPCON2bits.SEN); // wait until start condition is over
WriteI2C(0b11010000); // Write DS1307:D0H
NotAckI2C();
IdleI2C(); // ensure module is idle
if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition, if received
{
WriteI2C(0b00010000); // DS1307 : REG Addr.0x10
NotAckI2C();
for(i=0;i<4;i++){
IdleI2C();
if ( !SSPCON2bits.ACKSTAT ){
WriteI2C(depth.c[i]); // Configuration data
NotAckI2C();
}
}
}
IdleI2C();
StopI2C();
while(SSPCON2bits.PEN); // wait until stop condition is over
}
void Readrecord(void)
{
char e,i;
IdleI2C();
StartI2C();
while (SSPCON2bits.SEN); // wait until start condition is over
WriteI2C(0b11010000); // Write DS1307:D0H
NotAckI2C();
IdleI2C(); // ensure module is idle
if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition, if received
{
WriteI2C(0b00010000); // DS1307 : REG Addr.0x10
NotAckI2C();
}
IdleI2C();
StopI2C();
while(SSPCON2bits.PEN); // wait until stop condition is over
Nop();
Nop();
///------------------------------------------------------------------------
IdleI2C();
StartI2C();
while (SSPCON2bits.SEN); // wait until start condition is over
WriteI2C(0b11010001); // Read DS1307:D1H
NotAckI2C();
IdleI2C(); // ensure module is idle
if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition, if received
{
for(i=0;i<4;i++){
depth.c[i] = ReadI2C();
AckI2C();
while(SSPCON2bits.ACKEN);
}
e = ReadI2C();
AckI2C();
while(SSPCON2bits.ACKEN);
}
IdleI2C();
StopI2C();
while(SSPCON2bits.PEN); // wait until stop condition is over
}
/////
void Dectime(void)
{
Get_RealTimeClock();
sec=hextodec(real_time.Seconds);
min=hextodec(real_time.Minutes);
hour=hextodec(real_time.Hours);
mday=hextodec(real_time.Date);
mon=hextodec(real_time.Month);
year=hextodec(real_time.Year)+2000;
}
unsigned int sleyear(unsigned int yr)
{
if(yr%4==0||(yr%4==0&&yr%100!=0)) return(366);
else return(365);
}
//////
void DostoUnix(void)
{
unsigned int i;
unsigned long j;
j=0;
///從1970到現在的天數
for(i=2000; i<year; i++){
j=j+sleyear(i);///2000~2005
}
///計算本年到現在天數
for(i=0; i<(mon-1); i++){
j+=moninit[i];
}
j=j+mday;
///若本年為閏年則加1天
if(mon >= 2 && sleyear(year) == 366) j++;
j=j-1;
j=j*86400;
j=j+(hour*3600);
j=j+(min*60);
j=j+sec;
totalsec=j;
time.l=totalsec; ///給計時賦初值
Nop();
Nop();
}
//-------------------------------------
//-------------串口接收與發送
//-------------------------------------
char getch(void)
{
char c;
while(in==out);//相等表示沒有新數據進來
c = *out;
out++;
if((out-Buf)>=80) out=Buf;
return c;
}
void SCISend(char c)
{
while(TXSTA1bits.TRMT==0);
TXREG1=c;
}
void putch(char c)
{
while(TXSTA1bits.TRMT==0);
TXREG1=c;
}
void ResetMem(void)
{
//MEM
MEM_CE=0;
MEM_CLE=0;
MEM_WE=1;
MEM_ALE=0;
MEM_RE=1;
}
//======================
//-----存儲器代碼-------
//======================
void SCILoadAddr(void)
{
MEM_sector = (Buf[5] & 0x0f);
MEM_block = Buf[6];
MEM_page = Buf[7];
MEM_line = Buf[8];
}
//--------------
void MEM_COMD(char command)
{
TRISD=0X00;
PORTD=0X00;
MEM_CLE=0;
//command
MEM_CLE=1;
MEM_CE=0;
MEM_ALE=0;
MEM_WE=0;
PORTD=command;
MEM_WE=1;
MEM_CLE=0;
TRISD = 0xFF;
}
//----存儲地址計算
void MEM_CalAddr(unsigned char sector_addr,
unsigned char block_addr,
unsigned char page_addr)
{
second_addr = ((block_addr & 0x07)<<5) | page_addr;
third_addr = ((sector_addr & 0x07)<<5) | ((block_addr & 0xF8)>>3);
}
//--------------
void MEM_WeAddr(void)
{
//char first_addr,char second_addr,char third_addr
TRISD=0X00;
PORTD=0X00;
//address
MEM_ALE=1;
MEM_WE=0;
PORTD=first_addr;
MEM_WE=1;
MEM_WE=0;
PORTD= second_addr;
MEM_WE=1;
MEM_WE=0;
PORTD=third_addr;
MEM_WE=1;
MEM_ALE=0;
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
Delay1TCY();
TRISD=0XFF;
}
//---------------------
unsigned char MEM_status(void)
{
char stu;
PORTE = 0xe6;
TRISE = 0x00; // Set port D as output
MEM_DIR = 1;
TRISD = 0x00; // Set port D as output
MEM_COMD(0x70);
TRISD = 0x00;
MEM_DIR = 0;
TRISD = 0xFF;
MEM_CE = 0;
Delay1KTCYx(100);
MEM_RE = 0;
stu = PORTD;
MEM_RE = 1;
MEM_CE = 1;
MEM_DIR = 1;
return(stu);
}
//----------------------------------------------------------------------------------
void MEM_EraseBlock(unsigned char sector_addr,
unsigned char block_addr,
unsigned char page_addr)
{
TRISD=0X00;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -