Что нужно для быстрого начала программирования PIC18F2480:
- Купить программатор PICkit 2.
- Купить ELM327 и припаять к нему PICkit 2.(Ножку 1 MCLRE отрезать или поднять от платы, так как на нее подается напряжение программирования с программатора, а на нее подается +5 В питания).
- Скачать datasheet для PIC18F2480.
- Скачать IDE для написания и сборки программы MPLAB X.
- Скачать datasheet для драйвера CANbus MPC2551.
- Скачать C18 компилятор.
- Скачать C18 библиотека функций.
- Сайт разработчика ELM327.
- Схема ELM327.
#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;
}