Что нужно для быстрого начала программирования PIC18F2480:

  1. Купить программатор PICkit 2.
  2. Купить ELM327 и припаять к нему PICkit 2.(Ножку 1 MCLRE отрезать или поднять от платы, так как на нее подается напряжение программирования с программатора, а на нее подается +5 В питания).
  3. Скачать datasheet для PIC18F2480.
  4. Скачать IDE для написания и сборки программы MPLAB X.
  5. Скачать datasheet для драйвера CANbus MPC2551.
  6. Скачать C18 компилятор.
  7. Скачать C18 библиотека функций.
  8. Сайт разработчика ELM327.
  9. Схема ELM327.

Скачать исходник MPLAB X.

#include <p18cxxx.h>
#include <delays.h>
#include <usart.h>
#include <timers.h>
#pragma config OSC=IRCIO67
#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 code
void MyHighInt(void);
#pragma interrupt MyHighInt
#pragma code high_vector=0x08
void high_vector(void){
    _asm GOTO MyHighInt _endasm
}
#pragma code
void SetInterrupt(void);
void InitUsart(void);
void InitCAN(void);
char GetMessageCAN(void);
void main(void)
{
    ADCON1=0;
    ADCON1=0x0f;
    InitUsart();
    InitCAN();
    SetInterrupt();
    while(1)
    {
        GetMessageCAN();
    }
}
void MyHighInt(void)
{
    if(PIR1bits.RCIF)
    {
        while(!TXSTAbits.TRMT);
        putcUSART(ReadUSART());
    }
}
void InitUsart(void)
{
    OSCCONbits.IRCF0=0;
    OSCCONbits.IRCF1=1;
    OSCCONbits.IRCF2=1;
    OSCTUNEbits.PLLEN=1;
    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_LOW,25);//38400//8);//HIGH 460800 кбит/с

}
void SetInterrupt(void)
{
    RCONbits.IPEN=0;
    INTCONbits.GIE=1;
    INTCONbits.PEIE=1;
}
//**************************************************************************************************
void InitCAN(void){
    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.RXM0=0;
    RXB0CONbits.RXM1=0;
    RXB0CONbits.RXB0DBEN=0;

    BRGCON1=0x01; //16MHz 500kbps
    BRGCON2=0x90;
    BRGCON3=0x02;

    CIOCONbits.ENDRHI=1;
    CIOCONbits.CANCAP=0;
    CANCON=0b00000000;
    while ((CANSTAT & 0b11100000) != 0b00000000);
}
char GetMessageCAN(void)
{
    if(!RXB0CONbits.RXFUL){
        return 1;
    }
    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;
    return 0;
}