#include "16f873.h"
#include "int16cxx.h"
#define ENABLE 1
#define DISABLE 0
#define TRUE 1
#define FAULT 0
#define RECEIVE_EN 0
#define TRANSFER_EN 1
#pragma bit IO1 @ PORTB.5
#pragma bit IO2 @ PORTB.6
#pragma bit IO3 @ PORTB.7
#pragma bit C_EN @ PORTC.2
#pragma origin = 0x4
uns8 rc_temp,rxbuf[8],uchCRCHi,uchCRCLo,addr,txbuf[8],receive_count,dis_hz,dis_current;
uns8 set_hz,set_run;
uns16 dis_error,dis_running;
bit receive_ok,transfer_ok,_8ms_count_ok;
/* Table of CRC values for high-order byte */
const char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
/* Table of CRC values for low-order byte */
const char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;
interrupt server(void)
{
uns8 temp8;
int_save_registers // W, STATUS (and PCLATH)
char sv_FSR=FSR;
if(T0IF)
{
TMR0=100; //8ms interrupt
PS2=1; //prescale value=1:256
PS1=1; //5000KHz/256=19.53125KHz,19.53125K/156=0.125KHz(8ms)
PS0=1;
_8ms_count_ok=ENABLE;
T0IF=0;
}
if(INTF)
{
INTF=0;
}
if(TMR1IF)
{
TMR2IF=0;
}
if(RCIF)
{
rc_temp=RCREG;
if(receive_ok==FAULT)
{
if(_8ms_count_ok)
receive_count=0;
if(receive_count<8)
rxbuf[receive_count]=rc_temp;
if(receive_count==7 && addr==rxbuf[0])
receive_ok=TRUE;
receive_count++;
}
_8ms_count_ok=DISABLE;
TMR0=100; //timer0 reset,count again
RCIF=0;
}
if(SSPIF && SSPIE)
{
SSPIF=0;
}
FSR=sv_FSR;
int_restore_registers
}
page1 uns16 crc16(uns8 *puchMsg,uns8 crc_count)
{
uns8 uindex;
uns16 temp16;
uchCRCHi=0xff;
uchCRCLo=0xff;
while(crc_count)
{
uindex=uchCRCHi ^ *puchMsg;
puchMsg++;
uchCRCHi=uchCRCLo ^ auchCRCHi[uindex];
uchCRCLo=auchCRCLo[uindex];
crc_count--;
}
temp16=(uns16)uchCRCHi << 8;
temp16=temp16 | uchCRCLo;
return temp16;
}
page0 void main(void)
{
uns8 i;
uns16 temp16;
TRISA=0b11111111;
TRISB=0b00011111; //RB7(IO3) RB6(IO2) RB5(IO1)->output
TRISC=0b10111011; //RC7(RX) RC6(TX) RC2(C_EN)->output
IO1=0;
IO2=0;
IO3=0;
addr=0x06;
dis_hz=79;
dis_current=80;
dis_error=87;
dis_running=85; //bit2->0=stop,1=run
//bit14->0=FR,1=RR
_8ms_count_ok=DISABLE;
receive_ok=FAULT;
transfer_ok=TRUE;
receive_count=0;
C_EN=RECEIVE_EN;
BRGH=1;
SYNC=0;
SPEN=1;
TXIE=0;
RCIE=1;
TX9=0; //8 data bit transfer
SPBRG=64; // baud rate=20M/16(64+1)=19230
TXEN=1;
CREN=1; //receive enable
T0CS=0; //TIMER0 clock=Fosc/4=20MHz/4=5MHz
TMR0=100; //256-156
PSA=0; //use prescaler
PS2=1; //prescale value=1:256
PS1=1; //5000KHz/256=19.53125KHz,19.53125K/156=0.125KHz(8ms)
PS0=1;
T0IE=1; //TIMER0 enable
PEIE=1;
GIE=1;
rxbuf[0]=0x11;
rxbuf[1]=0x03;
rxbuf[2]=0x00;
rxbuf[3]=0x6b;
rxbuf[4]=0x00;
rxbuf[5]=0x03;
rxbuf[6]=0x01;
rxbuf[7]=0x02;
i=0;
while(1)
{
if(receive_ok==TRUE)
{
temp16=crc16(rxbuf,6);
if(rxbuf[6]==temp16.high8 && rxbuf[7]==temp16.low8)
{
switch(rxbuf[1])
{
case 0x03:
txbuf[0]=rxbuf[0];
txbuf[1]=rxbuf[1];
txbuf[2]=2; //byte count
txbuf[3]=0; //data high byte
switch(rxbuf[3])
{
case 0:
txbuf[4]=set_hz; //set hz
break;
case 85:
txbuf[4]=set_run; //set run
break;
case 78: //display Hz
txbuf[4]=dis_hz; //data low byte
break;
case 79: //display current
txbuf[4]=dis_current; //data low byte
break;
case 84: //display running state
txbuf[3]=dis_running.high8; //data high byte
txbuf[4]=dis_running.low8; //data low byte
break;
case 86: //display error code
txbuf[3]=dis_error.high8; //data high byte
txbuf[4]=dis_error.low8; //data low byte
}
temp16=crc16(txbuf,5);
txbuf[5]=temp16.high8;
txbuf[6]=temp16.low8;
transfer_ok=FAULT;
break;
case 0x06:
txbuf[0]=rxbuf[0];
txbuf[1]=rxbuf[1];
txbuf[2]=rxbuf[2];
txbuf[3]=rxbuf[3];
txbuf[4]=rxbuf[4];
txbuf[5]=rxbuf[5];
txbuf[6]=rxbuf[6];
txbuf[7]=rxbuf[7];
switch(rxbuf[3])
{
case 0: //set Hz
set_hz=rxbuf[5];
break;
case 85: //set run
set_run=rxbuf[5];
}
transfer_ok=FAULT;
}
}
receive_ok=FAULT;
}
if(TXIF && TRMT && transfer_ok==FAULT)
{
C_EN=TRANSFER_EN;
TXREG=txbuf[i];
i++;
if(i==7 && txbuf[1]==3)
{
transfer_ok=TRUE;
i=0;
}
if(i==8 && txbuf[1]==6)
{
transfer_ok=TRUE;
i=0;
}
}
if(TRMT)
C_EN=RECEIVE_EN;
}
}
- 1
- 2
- 3
- 4
- 5
前往页