Суббота, Сентябрь 19, 2020

Два устройства в сети CAN

//Программа передачи с виртуального RS232 FTDI через PIC18F2480 и MPC2551 в CAN сеть на PIC18F2480 и LCD.
//Частота 4МГц кристала на передатчике и 20МГц на приемнике.
#include<p18cxxx.h>
#include<delays.h>
#include<usart.h>
#pragma config OSC=XT
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config MCLRE=OFF
#pragma config BOREN=OFF
#pragma config PBADEN=OFF
#pragma config CP0=OFF
#pragma config CP1=OFF
#pragma config CPB=OFF
#pragma config CPD=OFF

#pragma udata
char addr_1st=0;
char RxIn=0;
char RxBuf[9]={'H','e','l','l','o','C','A','N',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  InitCAN(void);
void  TxCan(char* TxByte);

void main(void)
{
    ADCON1=0;
    ADCON1=0x0f;
    RCONbits.IPEN=0;
    INTCONbits.GIE=1;
    INTCONbits.PEIE=1;
    OpenUSART( USART_TX_INT_OFF &USART_RX_INT_ON &USART_ASYNCH_MODE &USART_EIGHT_BIT &USART_CONT_RX &USART_BRGH_HIGH,25 );
    addr_1st=0;
    InitCAN();
    while(1)
    {
        TxCan(RxBuf);
    }
}


void  TxCan(char *TxByte){
    if(TXB0CONbits.TXREQ)
        return;
    TXB0SIDH=0xab;
    TXB0SIDL=0b11101011;
    TXB0EIDH=0xcd;
    TXB0EIDL=0xef;
    TXB0D0=*TxByte;
    TXB0D1=*(TxByte+1);
    TXB0D2=*(TxByte+2);
    TXB0D3=*(TxByte+3);
    TXB0D4=*(TxByte+4);
    TXB0D5=*(TxByte+5);
    TXB0D6=*(TxByte+6);
    TXB0D7=*(TxByte+7);
    TXB0DLC=0x08;
    TXB0CONbits.TXPRI0=0;
    TXB0CONbits.TXPRI1=0;
    TXB0CONbits.TXREQ=1;
}
void  InitCAN(void){
    TRISBbits.TRISB3=1;
    TRISBbits.TRISB2=0;
    CANCON=0x80;
    while ((CANSTAT & 0xE0) != 0x80);
//Oscilator Frequency    4,000 MHz
//Target CAN Bus Baud Rate    50,000 kbps
/*    BRGCON1=0x04;
    BRGCON2=0x90;
    BRGCON3=0x02;*/
//Oscilator Frequency    4,000 MHz
//Target CAN Bus Baud Rate    100,000 kbps
    /*
    BRGCON1=0x01;
    BRGCON2=0xA0;
    BRGCON3=0x02;
    /*
//Oscilator Frequency    4,000 MHz
//Target CAN Bus Baud Rate    150,000 kbps
    /*
    BRGCON1=0x00;
    BRGCON2=0xA8;
    BRGCON3=0x04;
    */
//Oscilator Frequency    4,000 MHz
//Target CAN Bus Baud Rate    250,000 kbps
    BRGCON1=0x00;
    BRGCON2=0x90;
    BRGCON3=0x02;
    
    CIOCONbits.ENDRHI=1;
    CIOCONbits.CANCAP=0;
    CANCON=0b00000000;
    while ((CANSTAT & 0b11100000) != 0b00000000);
}

//*******************Попадаем сюда по прерыванию на Rx**************
void MyHighInt(void){
    int i;
    if(PIR1bits.RCIF){                     //прерывание по Rx?    
        RxIn=getcUSART();
        if(addr_1st<8){
            if(RxIn==0x0D){               //Если нажата кнопка Enter
                putsUSART(RxBuf);
                addr_1st=0;
                for(i=0;i<9;i++)             //Чистим буфер
                   RxBuf[i]=' ';
                RxBuf[9]=0;
            }
            else
                RxBuf[addr_1st++]=RxIn;
        }
        else{
            for(i=0;i<9;i++)             //Чистим буфер
                RxBuf[i]=' ';
            RxBuf[9]=0;
            addr_1st=0;
        }    
    }      
}




 

#include<p18cxxx.h>
#include<delays.h>
#include<xlcd.h>
#include<usart.h>
#pragma config OSC=HS
#pragma config WDT=OFF
#pragma config LVP=OFF
#pragma config MCLRE=OFF
#pragma config BOREN=OFF
#pragma config PBADEN=OFF
#define DELAY 100
#pragma udata
char addr_1st=0;
char RxIn=0;
char RxBuf[17]={0x89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
char asc[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
char no_recive[]="RXFUL";
char CanRxBuf[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
#pragma code
void MyHighInt(void);
void MyLowInt(void);
#pragma interrupt MyHighInt
#pragma code high_vector=0x08
void high_vector(void){
    _asm GOTO MyHighInt _endasm
}
#pragma interrupt MyLowInt 
#pragma code low_vector=0x18 
void low_vector(void){
    _asm GOTO MyLowInt _endasm
}
#pragma code
void DelayFor18TCY(void)
{
    Delay10TCYx(60);
}
void DelayPORXLCD(void)
{
    Delay1KTCYx(200);
}
void DelayXLCD(void)
{
    Delay1KTCYx(70);
}
void  ClrLCD(char addr);
void  StrToLCD(char* str,char addr,char delay);
char* HexToASCII(char *sour,char *dest,int len);
void  InitCAN(void);
void  RxCan(void);
void main(void)
{
    ADCON1=0;
    ADCON1=0x0f;
    OpenXLCD(FOUR_BIT & LINES_5X7);
    while(BusyXLCD());
    WriteCmdXLCD(CURSOR_OFF&BLINK_OFF);
    InitCAN();
    while(1)
    {
        RxCan(); 
    }
}
void  RxCan(void){
    int i;
    if(!RXB0CONbits.RXFUL){ 
        StrToLCD(no_recive,0x8b,1);
        for(i=0;i<16;i++) 
            CanRxBuf[i]=0;
        return;
    }
    CanRxBuf[0]=RXB0SIDH;
    CanRxBuf[1]=RXB0SIDL;
    CanRxBuf[2]=RXB0EIDH;
    CanRxBuf[3]=RXB0EIDL;
    CanRxBuf[4]=RXB0DLC;
    CanRxBuf[5]=RXB0D0;
    CanRxBuf[6]=RXB0D1;
    CanRxBuf[7]=RXB0D2;
    CanRxBuf[8]=RXB0D3;
    CanRxBuf[9]=RXB0D4;
    CanRxBuf[10]=RXB0D5;
    CanRxBuf[11]=RXB0D6;
    CanRxBuf[12]=RXB0D7;
    HexToASCII(CanRxBuf,asc,5);
    StrToLCD(asc,0x80,1);
  //  HexToASCII(CanRxBuf+5,asc,8);
    StrToLCD(CanRxBuf+5,0xc0,1);
    RXB0CONbits.RXFUL=0;
}
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=1;
    RXB0CONbits.RXM1=1;
    RXB0CONbits.RXB0DBEN=0;
/*
//20MHz 50kbps
    BRGCON1=0x18;
    BRGCON2=0x90;
    BRGCON3=0x02;
    */
/*
//20MHz 100kbps
    BRGCON1=0x09;
    BRGCON2=0xa0;
    BRGCON3=0x02;
*/
    /*
//20MHz 150kbps
    BRGCON1=0x02;
    BRGCON2=0xbc;
    BRGCON3=0x07;
*/
//20MHz 250kbps
    BRGCON1=0x04;
    BRGCON2=0x90;
    BRGCON3=0x02;
 /*
//20MHz 500kbps
    BRGCON1=0x00;
    BRGCON2=0xba;
    BRGCON3=0x07;
*/
    CIOCONbits.ENDRHI=1;
    CIOCONbits.CANCAP=0;
    CANCON=0b00000000;
    while ((CANSTAT & 0b11100000) != 0b00000000);
}
void MyHighInt(void){
}
void MyLowInt(void){
}
char* HexToASCII(char *sour,char *dest,int len)
{
    int i;
    char tmp;
    int j=0;
    for(i=0;i<len;i++){
        tmp=((sour[i]>>4)&0x0f);
        if(tmp<=9){
            dest[j]=tmp+0x30;
        }
        else if(tmp>=0x0A && tmp<=0x0F){
            dest[j]=tmp+0x37;
        }
        j++;
        tmp=sour[i];
        tmp=tmp &= 0x0f;
        if(tmp<=9){
            dest[j]=tmp+0x30;
        }
        else if(tmp>=0x0A && tmp<=0x0F){
            dest[j]=tmp+0x37;
        }
        j++;
    }
    dest[j]=0;
    return dest;
}
void ClrLCD(char addr){
    int i;
    while(BusyXLCD());
    SetDDRamAddr(addr);
    for(i=0;i<16;i++){
        while(BusyXLCD());
        WriteDataXLCD(' ');
    }
}
void  StrToLCD(char* str,char addr,char delay){
    //ClrLCD(addr);
    while(BusyXLCD());
    SetDDRamAddr(addr);
    putsXLCD(str);
    Delay10KTCYx(delay);
}


Back to Top