|
|
View previous topic :: View next topic |
Author |
Message |
longmenok
Joined: 23 Oct 2006 Posts: 12
|
CAN Problem? How to work 18F2431 +mcp2515 |
Posted: Tue Jun 19, 2007 10:36 am |
|
|
Hello! I have a work about CAN communication.
The following is my code. If it were used for 16F877A, it are good!
But it arenot work for 18F2431
I want to know how to correct it.
Thanks ,say sorry to my poor english.
osc=20M mcp2515 20M CAN bitrate =500K
2431 -----> 2515
PIN_C6(17) ----->> CS(16)
PIN_C7(18) ----->> SI(14)
PIN_C4(15) ----->> SO(15)
PIN_C5(16)----->> SCK(13)
PIN_C3(14) ----->> INT(12)
transmit code
Code: |
#include <18F2431.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#include "MCP2515.c"
//////////////////////////////////////////////////////////////////////////
// main code //
//////////////////////////////////////////////////////////////////////////
void main()
{
unsigned char buffer[2]={0x19,0x82};
output_low(PIN_C1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
can_init();
while(TRUE)
{
if(can_tbe())
{
can_putd(0x201,&buffer[0],2,3,0,0);
// receive ID 201 is good.
delay_ms(900);
output_high(PIN_C1); //led on
delay_ms(100);
output_low(PIN_C1); //led off
}
}
}
|
"MCP2515.c"
Code: |
#ifndef EXT_CAN_CS
//18F2341
#define EXT_CAN_CS PIN_C6
#define EXT_CAN_SI PIN_C7
#define EXT_CAN_SO PIN_C4
#define EXT_CAN_SCK PIN_C5
... ... ... ... ... ... ... ... ... ... ... ...
void can_set_baud(void) {
struct struct_CNF1 new_CNF1;
struct struct_CNF2 new_CNF2;
struct struct_CNF3 new_CNF3;
//use MBtime setup CAN Bitrate osc=20M bitrate=500k
new_CNF1=0x00;
new_CNF2=0xBA;
new_CNF3=0x07;
... ... ... ... ... ... ... ... ... ... ... ...
//other codes are the same as can-mcp251x.c
|
MBTIME Download
http://www.intrepidcs.com/index.php?name=CmodsDownload&file=index&req=viewdownload&cid=2&orderby=dateD |
|
|
longmenok
Joined: 23 Oct 2006 Posts: 12
|
|
Posted: Mon Jun 25, 2007 9:30 am |
|
|
help |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jun 25, 2007 11:26 am |
|
|
Quote: |
The following is my code. If it were used for 16F877A, it are good!
But it are not work for 18F2431. |
Does the only difference between the two programs consist
of the #include file line ? Other than that, are the two programs
completely identical ?
Code: |
#include <18F2431.h>
or
#include <16F877A.h>
|
Are the hardware connections between the PIC and the MCP2515
the same, for the 18F2431 and the 16F877A ?
Is the MCP2515 circuit the same, for each PIC ?
Does the MCP2515 have a 20 MHz crystal in each case ?
In other words, you said it works for 16F877A, but I want to get
a confirmation from you that the only thing you changed for the
new project is the PIC, and the #include statement.
Also, post the CCS compiler version that you used with each PIC. |
|
|
longmenok
Joined: 23 Oct 2006 Posts: 12
|
|
Posted: Sun Jul 08, 2007 9:53 pm |
|
|
MCP2515 is used. can-mcp2510.c is modified as following.
MCP2515 have a 20 MHz crystal in each case
can-mcp2510.c connect with 16F877A is following
Code: |
//877A IO pins connected to MCP2515
#ifndef EXT_CAN_CS
#define EXT_CAN_CS PIN_A5
#define EXT_CAN_SI PIN_C5
#define EXT_CAN_SO PIN_C4
#define EXT_CAN_SCK PIN_C3
// mcp2515's PIN INT connect with 877A's RB0
|
set_baud
Code: |
void can_set_baud(void) {
struct struct_CNF1 new_CNF1;
struct struct_CNF2 new_CNF2;
struct struct_CNF3 new_CNF3;
new_CNF1=0x00;
new_CNF2=0xBA;
new_CNF3=0x07;
MCP2515_write(CNF1, (int)new_CNF1);
MCP2515_write(CNF2, (int)new_CNF2);
MCP2515_write(CNF3, (int)new_CNF3);
}
|
can-mcp2510.c connect with 18F2431 is following
Code: |
//18F2431 IO pins connected to MCP2515
#ifndef EXT_CAN_CS
//2341
#define EXT_CAN_CS PIN_C6 //SS
#define EXT_CAN_SI PIN_C7 //SDO
#define EXT_CAN_SO PIN_C4 //SDI//SDA
#define EXT_CAN_SCK PIN_C5 //sck/scl
//mcp2515' PIN INT connect with 2431's RC3
|
the above is the difference for their connect
18F2431'baud is the same as 16F877A
the following is code for 16F877A and 18F2431 to transmat
Code: |
#include <16F877A.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#include "can-mcp2510.c"
//////////////////////////////////////////////////////////////////////////
// main code //
//////////////////////////////////////////////////////////////////////////
void main()
{
unsigned char buffer[2]={0x19,0x82};
output_low(PIN_C1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
can_init();
while(TRUE)
{
if(can_tbe())
{
can_putd(0x722,&buffer[0],2,3,0,0);
delay_ms(900);
output_high(PIN_C1);
delay_ms(100);
output_low(PIN_C1);
}
}
}
|
Code: |
#include <18F2431.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#include "can-mcp2510.c"
//////////////////////////////////////////////////////////////////////////
// main code //
//////////////////////////////////////////////////////////////////////////
void main()
{
unsigned char buffer[2]={0x19,0x82};
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
can_init();
while(TRUE)
{
if(can_tbe())
{
can_putd(0x722,&buffer[0],2,3,0,0);
}
}
}
|
the following is code for 18F458 to receive //correct it
Code: |
#include <18F458.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include "can-18xxx8.c"
// set baud in Ccan-18xxx8.c
// BRGCON1 = 0x00;
// BRGCON2 = 0xBA;
// BRGCON3 = 0x07;
///////////////////////////////////////////////////////////////////////
/// main code //////
///////////////////////////////////////////////////////////////////////
void main(void)
{
struct rx_stat rxstat;
int32 rx_id;
unsigned char buffer[2];
unsigned char rx_len;
output_low(PIN_D1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
can_init();
while(TRUE)
{
if(can_kbhit())
{
if(can_getd(rx_id,&buffer[0],rx_len, rxstat))
{
if((rx_id==0x722)&&(buffer[0]==0x19)&&(buffer[1]==0x82))
{
output_high(PIN_D1);
delay_ms(100);
output_low(PIN_D1);
}
}
}
}
}
|
Thanks! PCM programmer
Last edited by longmenok on Thu Jul 12, 2007 1:14 am; edited 3 times in total |
|
|
longmenok
Joined: 23 Oct 2006 Posts: 12
|
|
Posted: Tue Jul 10, 2007 7:38 pm |
|
|
Can you help me! Thanks! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Jul 11, 2007 11:57 am |
|
|
Quote: |
The following is code for 16F877A and 18F2431 to receive:
#include <18F458.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include "can-18xxx8.c"
// set baud in Ccan-18xxx8.c
// BRGCON1 = 0x00;
// BRGCON2 = 0xBA;
// BRGCON3 = 0x07;
|
The can-18xxx8.c file only works with 18F chips that have a built-in
CAN module. The 16F877A and 18F2431 do not have one.
This code will not work with those two PICs. |
|
|
longmenok
Joined: 23 Oct 2006 Posts: 12
|
|
Posted: Thu Jul 12, 2007 1:10 am |
|
|
I use 18F2431+mcp2515 to transmit motor QEI data, and use 18F458 to receive data. when I use 16F877A+mcp2515, CAN Communication can good work. However I use 18F2431+mcp2515 , 18F458 can't receive any data.
IN transmit code use "can-mcp2510.c" for 18f2431
and in receive code use "can-18xxx8.c" for 18f458
their bauds are same,
Code: |
Transmit by 18F2431
void can_set_baud(void) {
struct struct_CNF1 new_CNF1;
struct struct_CNF2 new_CNF2;
struct struct_CNF3 new_CNF3;
new_CNF1=0x00; //Set baud
new_CNF2=0xBA;
new_CNF3=0x07;
MCP2515_write(CNF1, (int)new_CNF1);
MCP2515_write(CNF2, (int)new_CNF2);
MCP2515_write(CNF3, (int)new_CNF3);
}
Receive by 18F458
// BRGCON1 = 0x00; set baud
// BRGCON2 = 0xBA;
// BRGCON3 = 0x07;
|
why 18F2431 can't communiate?
Thanks! PCM programmer. |
|
|
longmenok
Joined: 23 Oct 2006 Posts: 12
|
|
Posted: Thu Jul 12, 2007 2:01 am |
|
|
I test it, can_init() can't good work.
In can_mcp2510.c
Code: | void can_set_mode(CAN_OP_MODE mode) {
struct struct_CANCTRL old_CANCTRL;
old_CANCTRL=MCP2515_read(CANCTRL);
old_CANCTRL.reqop=mode;
MCP2515_write(CANCTRL, (int)old_CANCTRL);
do {
old_CANCTRL=MCP2515_read(CANCTRL); // In there, it is always LOOP
} while (old_CANCTRL.reqop != mode);
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
|
|
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
|