|
|
View previous topic :: View next topic |
Author |
Message |
nordin59
Joined: 04 Jun 2009 Posts: 3
|
18F2480 CAN bus and MCP2551 |
Posted: Mon Jun 08, 2009 8:25 am |
|
|
I'am trying to configure the can bus of the pic 18f2480 with the CAN Transceiver MCP2551.
I'am using a 40Mhz crystal and i would a speed of 250kbits/s.
I'am also using the library functions titled can18xxx8.c and can18xxx8.h
I configured the 3 baud rate registers by using the software that was given by PCM Programmer :MBTime
Code: | #IFNDEF CAN_USE_EXTENDED_ID
#define CAN_USE_EXTENDED_ID TRUE
#ENDIF
#IFNDEF CAN_BRG_SYNCH_JUMP_WIDTH
#define CAN_BRG_SYNCH_JUMP_WIDTH 1 //synchronized jump width (def: 1 x Tq)
#ENDIF
#IFNDEF CAN_BRG_PRESCALAR
#define CAN_BRG_PRESCALAR 7 //baud rate generator prescalar (def: 4) ( Tq = (2 x (PRE + 1))/Fosc )
#ENDIF
#ifndef CAN_BRG_SEG_2_PHASE_TS
#define CAN_BRG_SEG_2_PHASE_TS FALSE //phase segment 2 time select bit (def: freely programmable)
#endif
#ifndef CAN_BRG_SAM
#define CAN_BRG_SAM 0 //sample of the can bus line (def: bus line is sampled 1 times prior to sample point)
#endif
#ifndef CAN_BRG_PHASE_SEGMENT_1
#define CAN_BRG_PHASE_SEGMENT_1 4 //phase segment 1 (def: 6 x Tq)
#endif
#ifndef CAN_BRG_PROPAGATION_TIME
#define CAN_BRG_PROPAGATION_TIME 0 //propagation time select (def: 3 x Tq)
#endif
#ifndef CAN_BRG_WAKE_FILTER
#define CAN_BRG_WAKE_FILTER FALSE //selects can bus line filter for wake up bit
#endif
#ifndef CAN_BRG_PHASE_SEGMENT_2
#define CAN_BRG_PHASE_SEGMENT_2 2 //phase segment 2 time select (def: 6 x Tq)
#endif
#ifndef CAN_USE_RX_DOUBLE_BUFFER
#define CAN_USE_RX_DOUBLE_BUFFER TRUE //if buffer 0 overflows, do NOT use buffer 1 to put buffer 0 data
#endif |
And my program is :
Code: | #include <18F2480.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=40M,oscillator=10M)
#include <can-18xxx8.c>
#define put_off output_low
#define put_on output_high
#define can_error pin_C1
#define can_led pin_C3
void main() {
int out_data[8];
int32 tx_id=24;
int1 tx_rtr=1;
int1 tx_ext=0;
int tx_len=8;
int tx_pri=3;
int i;
for (i=0;i<8;i++) {
out_data[i]=0;
}
can_init();
while(1)
{
if ( can_tbe() && (delay_ms(200))
{
i=can_putd(tx_id, out_data, tx_len,tx_pri,tx_ext,tx_rtr);
if (i != 0xFF) {
put_on(can_led);
delay_ms(150);
put_off(can_led));
}
else {
put_on(can_error);
delay_ms(150);
put_off(can_error);
}
}
}
} |
I have the software called NSI527 on my computer in order to check the communication of the CAN bus.
The problem is the pic doesn't send any data. And when i tried to send datas from my pc just for checking the status of the connection, it sends 1 or 2 datas then the software is in mode BUS OFF !!!!
Here is a scheme of my connection:
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jun 08, 2009 11:02 am |
|
|
Quote: |
I have the software called NSI527 on my computer in order to check the
communication of the CAN bus. |
What CAN bus adapter hardware is used with the NSI527 program ?
There must be some kind of cable or adapter board that goes between
your PC and your CAN bus board. I assume that it is connected to J1
on your board. Explain how you connect the PC to the CAN bus on your
board. |
|
|
nordin59
Joined: 04 Jun 2009 Posts: 3
|
|
Posted: Mon Jun 08, 2009 1:14 pm |
|
|
I have on my computer a CAN PCI and the software NSI527.
With Windows Millenium, It allows to send and receive frames on many channels CAN. Both are linked (pic an computer). |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jun 08, 2009 1:36 pm |
|
|
Quote: | I have on my computer a CAN PCI and the software NSI527. |
Is your PC program setup to use standard or extended ID's ?
In your posted code, you are using standard IDs. Make sure
the PC program is setup for the same thing.
Quote: | int out_data[8];
int32 tx_id=24;
int1 tx_rtr=1;
int1 tx_ext=0;
int tx_len=8;
int tx_pri=3; |
In my test program here, in can_putd(), I set tx_rtr = 0, so I think
you should try that.
http://www.ccsinfo.com/forum/viewtopic.php?t=29627&start=7
Quote: | while(1)
{
if ( can_tbe() && (delay_ms(200))
{
i=can_putd(tx_id, out_data, tx_len,tx_pri,tx_ext,tx_rtr);
if (i != 0xFF) {
put_on(can_led);
|
According to the CAN bus driver here,
Quote: | c:\program files\picc\drivers\can-18xxx8.c |
the data type returned by can_putd() is an 'int1'.
Code: |
int1 can_putd(int32 id, int * data, int len, int priority, int1 ext, int1 rtr) {
// Returns:
// If successful, it will return TRUE
// If un-successful, will return FALSE
|
It can only have a boolean value of 1 or 0 (TRUE or FALSE). But in your
code, you are comparing it to 0xFF. You need to fix that. |
|
|
nordin59
Joined: 04 Jun 2009 Posts: 3
|
|
Posted: Tue Jun 09, 2009 6:23 am |
|
|
Thanks for your help,
Yes, the PC program is setup for using standard IDs.
And i've modified the condition Code: | if ( i==1 ) {
put_on(can_led);} |
But the problem still not solved. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|