Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Help Request:

Status
Not open for further replies.

prabhakarandhar

Newbie level 2
Joined
Jan 22, 2011
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,304
Hi

I have to interface between two Pic18f4580 using CAN bus... I wrote Program but it not Work please help me
#include<pic18.h>// Using Hitech


struct CANMessage
{
unsigned long Address;
unsigned char Data[8];
unsigned char NoOfBytes;
};
struct CANMessage RX_Message, TX_Message, ReturnMessage;



char CANPut(struct CANMessage Message)
{
TXB0D0 = Message.Data[0];
TXB0SIDL = Message.Address<<5&0xff;
TXB0SIDH = Message.Address>>3&0xff;
while(TXB0CONbits.TXREQ!=0);
TXB0CONbits.TXREQ = 1;
}

struct CANMessage CANGet(void)
{
unsigned int Add,Add1;
ReturnMessage.Data[0] = RXB0D0;
Add = RXB0SIDH;
Add1= RXB0SIDL;
Add1= (Add1 >> 5)|(Add<<3);
ReturnMessage.Address = Add1;
}

void Can_isr()
{
if(RXB0IF)
{
RXB0IF =0;
RXB0CONbits.RXFUL =0;
RX_Message = CANGet();
}
}


void Can_Set_Baudrate(void)
{
BRGCON1 = 0X01;
BRGCON2 = 0X90;
BRGCON3 = 0X42;
}

void Can_Set_TxBuffer(void)
{
TXB0CON = 0x03; // Highest Priority
TXB0SIDL = 0xE0;
TXB0SIDH = 0xFF;
TXB0DLC = 0x08; // 8 byte Data length
TXB0D0 = 0X00;
TXB0D1 = 0X01;
TXB0D2 = 0X02;
TXB0D3 = 0X03;
TXB0D4 = 0X04;
TXB0D5 = 0X05;
TXB0D6 = 0X06;
TXB0D7 = 0X07;
}

void Can_Set_RxBuffer(void)
{
RXB0CON = 0X20;
RXB0SIDL = 0XE0;
RXB0SIDH = 0XFF;
RXB0DLC = 0x80;
RXB0D0 = 0X00;
RXB0D1 = 0X00;
RXB0D2 = 0X00;
RXB0D3 = 0X00;
RXB0D4 = 0X00;
RXB0D5 = 0X00;
RXB0D6 = 0X00;
RXB0D7 = 0X00;
}

void Can_Set_AMFilter()
{
RXF0SIDL = 0xE0;
RXF0SIDH = 0xFF;
RXM0SIDH = 0X00;
RXM0SIDL = 0X00;
}


void Can_Init(void)
{
ECANCON = 0x00; //Mode-0
CANCON = 0x80;
while(CANSTAT&0X80==0);
Can_Set_Baudrate();
Can_Set_TxBuffer();
Can_Set_RxBuffer();
Can_Set_AMFilter();
CANCON = 0X00;
while(CANSTAT&0XE0!=0);
PIR3 = 0X00;
PIE3 = 0X01;
IPR3 = 0X01;
}

void main()
{
TRISB = 0x08;
Can_Init();
Tx_Message.Data[0]='A';
Tx_Message.Address=0x123;
Tx_Message.NoofBytes=1;
CANPut(Tx_Message);
while(1)
{
}
}
 

why not try basic compilers like proton or mikrobaisc they come with good library that makes coding easy. and you can even get very good help from their forums.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top