Скачать проект.

Программа на стороне компа.

#include <p18cxxx.h>
#include <delays.h>
#include <usart.h>
#include <timers.h>
#pragma config OSC=HS    //20 MHz
#pragma config FCMEN=OFF
#pragma config IESO=OFF
#pragma config PWRT=OFF
#pragma config BOREN=OFF
#pragma config BORV=3
#pragma config WDT=OFF
#pragma config WDTPS=32768
#pragma config PBADEN=OFF
#pragma config LPT1OSC=OFF
#pragma config MCLRE=OFF
#pragma config STVREN=ON
#pragma config LVP=OFF
#pragma config BBSIZ=1024
#pragma config XINST=OFF
#pragma config CP0=OFF
#pragma config CP1=OFF
#pragma config CPB=OFF
#pragma config CPD=OFF
#pragma config WRT0=OFF
#pragma config WRT1=OFF
#pragma config WRTC=OFF
#pragma config WRTB=OFF
#pragma config WRTD=OFF
#pragma config EBTR0=OFF
#pragma config EBTR1=OFF
//**********************************************************
#pragma udata
unsigned char ReadByte=0;

#pragma code
void MyHighInt(void);
#pragma interrupt MyHighInt
#pragma code high_vector=0x08
void high_vector(void){
    _asm GOTO MyHighInt _endasm
}
#pragma code
void MyLowInt(void);
#pragma interrupt MyLowInt
#pragma code low_vector=0x18
void low_vector(void){
    _asm GOTO MyLowInt _endasm
}
#pragma code
void SetInterrupt(void);
void InitUsart(void);
void InitCAN(unsigned char CanSpeed);
void StopCAN(void);
char TxCan(char*);
void main(void)
{
    ADCON1=0x0f;
    InitUsart();
    SetInterrupt();
    while(1)
    {
        //Здесь контроллер не чего не делает. Бесконечный цикл.
        //Контроллер работает только по прерываниям.
        //Здесь можно написать какой нить код, например мигать светодиодом.
    }
}
//Работаем с COM портом по High прерыванию
void MyHighInt(void)
{
    if(PIR1bits.RCIF)
    {
        ReadByte=ReadUSART();
        //WriteUSART(ReadByte);
        switch(ReadByte)
        {
            case 0x0a:
                break;
            case 0x0b://Скорость CAN 500 кбит/с
                InitCAN(1);
                break;
            case 0x0d://Скорость CAN 250 кбит/с
                InitCAN(0);
                break;
            case 0x0c:
                StopCAN();
                break;
            default:
                break;
        }
    }
}
//Принимаем сообщения CAN по LOW прерыванию
void MyLowInt(void)
{
    if(PIR3bits.RXB0IF)
    {
        if(RXB0CONbits.RXFUL)
        {

            while(!TXSTAbits.TRMT);
            putcUSART(RXB0SIDH);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0SIDL);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0EIDH);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0EIDL);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0DLC);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0D0);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0D1);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0D2);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0D3);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0D4);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0D5);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0D6);
            while(!TXSTAbits.TRMT);
            putcUSART(RXB0D7);
            RXB0CONbits.RXFUL=0;
        }
    }
}
void InitUsart(void)
{
    baudUSART(BAUD_16_BIT_RATE&BAUD_WAKEUP_OFF&BAUD_AUTO_OFF);
    OpenUSART( USART_TX_INT_OFF&USART_RX_INT_ON&USART_ASYNCH_MODE
            &USART_EIGHT_BIT &USART_CONT_RX &USART_BRGH_HIGH,42);//115200

}
void  SetInterrupt(void)
{
    RCONbits.IPEN=1;
    INTCONbits.GIE=1;
    INTCONbits.PEIE=1;
    PIE3bits.RXB0IE=1;
    IPR3bits.RXB0IP=0;
}
//**************************************************************************************************
void  InitCAN(unsigned char CanSpeed)
{
    TRISBbits.TRISB3=1;
    TRISBbits.TRISB2=0;
    CANCON=0x80;
    while ((CANSTAT & 0xE0) != 0x80);
    RXM0SIDH=0x00;
    RXM0SIDL=0x00;
    RXM1SIDH=0x00;
    RXM1SIDL=0x00;
    RXM0EIDH=0x00;
    RXM0EIDL=0x00;
    RXM1EIDH=0x00;
    RXM1EIDL=0x00;
    RXB0CONbits.RXM1=0;
    RXB0CONbits.RXM0=1;
    RXB0CONbits.RXB0DBEN=0;

    if(CanSpeed)
    {
        BRGCON1=0x01; //20MHz 500kbps
        BRGCON2=0xA0;
        BRGCON3=0x02;
    }
    else
    {
        BRGCON1=0x03; //20MHz 250kbps
        BRGCON2=0xA0;
        BRGCON3=0x02;
    }

    CIOCONbits.ENDRHI=1;
    CIOCONbits.CANCAP=0;
    CANCON=0b00000000;
    while ((CANSTAT & 0b11100000) != 0b00000000);
}
void  StopCAN(void)
{
    CANCON=0x80;
    while ((CANSTAT & 0xE0) != 0x80);
    CANCON=0b00100000;
    while ((CANSTAT & 0b11100000) != 0b00100000);
}

char  TxCan(char* msg)
{
    if(TXB0CONbits.TXREQ){
        return 1;
    }
    TXB0SIDH=msg[0];
    TXB0SIDL=msg[1];
    //TXB0EIDH=msg[2];
    //TXB0EIDL=msg[3];
    TXB0DLC =msg[4];
    TXB0D0  =msg[5];
    TXB0D1  =msg[6];
    TXB0D2  =msg[7];
    TXB0D3  =msg[8];
    TXB0D4  =msg[9];
    TXB0D5  =msg[10];
    TXB0D6  =msg[11];
    TXB0D7  =msg[12];

    TXB0CONbits.TXPRI0=0;
    TXB0CONbits.TXPRI1=0;
    TXB0CONbits.TXREQ=1;
    return 0;
}