![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
705150
Joined: 25 Apr 2013 Posts: 14
|
pic18f46k80 canbus readfail |
Posted: Wed Sep 17, 2014 11:58 am |
|
|
i have made 2 programs with the help of this forum, a transmiter and a receiver for the canbus. i don't receive any data on the Rx line (pin_b3) on the board2_id. i use board1_id just to transmit and the other one just to receive.
can someone tell me if the code is correct?
compiler version is 5.008
can driver mcp2551 - rs conected to gnd (0 ohm)
thank you in advance
board1_id
Code: | #include <18F46K80.h>
#fuses HSH, NOPROTECT, PUT, BROWNOUT, NOWDT, NOPLLEN
#fuses CANB
#use delay(clock=20000000)
#include <can-18F4580.c> // Use correct driver
#define BOARD1_ID 24 //cu ecran lcd
#define BOARD2_ID 25
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
int16 ms;
#int_timer2
void isr_timer2(void) {
ms++; //keep a running timer that increments every milli-second
}
void main() {
struct rx_stat rxstat;
int32 rx_id;
int in_data[8];
int rx_len;
//send a request (tx_rtr=1) for 8 bytes of data (tx_len=8) from id 24 (tx_id=24)
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;
in_data[i]=0;
}
printf("\r\n\r\nCCS CAN EXAMPLE\r\n");
setup_timer_2(T2_DIV_BY_4,79,16); //setup up timer2 to interrupt every 1ms if using 20Mhz clock
can_init();
enable_interrupts(INT_TIMER2); //enable timer2 interrupt
enable_interrupts(GLOBAL); //enable all interrupts (else timer2 wont happen)
printf("\r\nRunning...");
while(TRUE)
{
if ( can_kbhit() ) { //if data is waiting in buffer...
output_high(pin_e0);
if(can_getd(rx_id, &in_data[0], rx_len, rxstat)) { //...then get data from buffer
printf("\r\nGOT: BUFF=%U ID=%LU LEN=%U OVF=%U ", rxstat.buffer, rx_id, rx_len, rxstat.err_ovfl);
printf("FILT=%U RTR=%U EXT=%U INV=%U", rxstat.filthit, rxstat.rtr, rxstat.ext, rxstat.inv);
printf("\r\n DATA = ");
for (i=0;i<rx_len;i++) {
printf("%X ",in_data[i]);
}
printf("\r\n");
}
else {
printf("\r\nFAIL on GETD\r\n");
}
}
//every two seconds, send new data if transmit buffer is empty
if ( can_tbe() && (ms > 2000)) {
ms=0;
i=can_putd(tx_id, out_data, tx_len,tx_pri,tx_ext,tx_rtr); //put data on transmit buffer
if (i != 0xFF) { //success, a transmit buffer was open
output_toggle(pin_e0);
printf("\r\nPUT %U: ID=%LU LEN=%U ", i, tx_id, tx_len);
printf("PRI=%U EXT=%U RTR=%U\r\n DATA = ", tx_pri, tx_ext, tx_rtr);
for (i=0;i<tx_len;i++) {
printf("%X ",out_data[i]);
}
printf("\r\n");
}
else { //fail, no transmit buffer was open
printf("\r\nFAIL on PUTD\r\n");
can_abort();
}
}
else {
//
//printf("\r\nFAIL on PUTD\r\n");
}
}
} |
board2_id:
Code: | #include <18F46K80.h>
#fuses HSH, NOPROTECT, PUT, BROWNOUT, NOWDT, NOPLLEN
#fuses CANB
#use delay(clock=20000000)
#include <can-18F4580.c> // Use correct driver
#define BOARD1_ID 24
#define BOARD2_ID 25 //cu sursa 7805
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
int16 ms;
#int_timer2
void isr_timer2(void) {
ms++; //keep a running timer that increments every milli-second
}
void main() {
struct rx_stat rxstat;
int32 rx_id;
int in_data[8];
int rx_len;
int1 transmit=0;
//send a request (tx_rtr=1) for 8 bytes of data (tx_len=8) from id 24 (tx_id=24)
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;
in_data[i]=0;
}
printf("\r\n\r\nCCS CAN EXAMPLE\r\n");
setup_timer_2(T2_DIV_BY_4,79,16); //setup up timer2 to interrupt every 1ms if using 20Mhz clock
output_high(pin_d3);
can_init();
enable_interrupts(INT_TIMER2); //enable timer2 interrupt
enable_interrupts(GLOBAL); //enable all interrupts (else timer2 wont happen)
printf("\r\nRunning...");
delay_ms(100);
output_low(pin_d3);
while(TRUE)
{
if ( can_kbhit() ) { //if data is waiting in buffer...
output_high(pin_d3);
if(can_getd(rx_id, &in_data[0], rx_len, rxstat)) { //...then get data from buffer
printf("\r\nGOT: BUFF=%U ID=%LU LEN=%U OVF=%U ", rxstat.buffer, rx_id, rx_len, rxstat.err_ovfl);
printf("FILT=%U RTR=%U EXT=%U INV=%U", rxstat.filthit, rxstat.rtr, rxstat.ext, rxstat.inv);
printf("\r\n DATA = ");
for (i=0;i<rx_len;i++) {
printf("%X ",in_data[i]);
}
printf("\r\n");
}
else {
printf("\r\nFAIL on GETD\r\n");
}
}
//every two seconds, send new data if transmit buffer is empty
if ( can_tbe() && (ms > 2000) && (transmit)) {
ms=0;
i=can_putd(tx_id, out_data, tx_len,tx_pri,tx_ext,tx_rtr); //put data on transmit buffer
if (i != 0xFF) { //success, a transmit buffer was open
printf("\r\nPUT %U: ID=%LU LEN=%U ", i, tx_id, tx_len);
printf("PRI=%U EXT=%U RTR=%U\r\n DATA = ", tx_pri, tx_ext, tx_rtr);
for (i=0;i<tx_len;i++) {
printf("%X ",out_data[i]);
}
printf("\r\n");
}
else { //fail, no transmit buffer was open
printf("\r\nFAIL on PUTD\r\n");
}
}
}
} |
|
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
![](templates/subSilver/images/spacer.gif) |
705150
Joined: 25 Apr 2013 Posts: 14
|
|
Posted: Thu Sep 18, 2014 9:35 am |
|
|
@PCM programmer i am once again thankful for your support, i have tried your code at the beginning, but i now suspect a defect mcp2551 at that time. It works with your code for 18f46k80.
But what i need now is to know how can i transfer text or variables over the canbus (eg temp reading or calendar time). I will have a i2c lcd connected to one 18f46k80 and receive various text/variables from another 18f46k80 that needs to be displayed on the lcd.
Also, if you could tell me the maximum length of the data one transmission can provide (believe its 8byte but I've heard of as much as 64bytes?)
Thank you once again |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Sep 18, 2014 10:20 am |
|
|
CAN FD is something new. For anything we can currently do, it's 8 bytes.
With regard to sending text, read this old thread. I had some doubts,
but then other people contacted Microchip Support and got a work-around:
http://www.ccsinfo.com/forum/viewtopic.php?t=17941
This concerns sending entire sentences (like this one), that are longer
than the 8 bytes in one frame. If all you want to do is send, eg.,
TACH1234 or TEMP0180, etc, then there's no problem. Then you don't
need the above link. |
|
![](templates/subSilver/images/spacer.gif) |
705150
Joined: 25 Apr 2013 Posts: 14
|
|
Posted: Thu Sep 18, 2014 10:30 am |
|
|
thank you PCM programmer for your response. it will do for now the 8byte length.
have a pleasant day |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|