|
|
View previous topic :: View next topic |
Author |
Message |
defoxe
Joined: 30 Jan 2015 Posts: 8
|
PIC18F25K80 UART and ECAN problems [SOLVED] |
Posted: Fri Jan 30, 2015 9:43 am |
|
|
Hello,
I have two boards with PIC18F25K80 connected via ECAN (MCP2551 and resistors).
I am using INTRC_IO.
Here is a code for RX board (#define BOARDRX 1 uncommented).
CAN isnt work, also from UART I have a lot of errors (Iam using MAX232)
UART example:
Iam running@@@
RX[H���+��
Code: |
#include <18F25K80.h>
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,NOCPD,BROWNOUT,NOIESO,NOFCMEN
#use delay(clock=4000000)
//xmit=PIN_C6,rcv=PIN_C7
#use rs232(uart1,baud=9600,bits=8,parity=N,stop=1)
#define BLINKER PIN_C0
//#define BOARDTX 1
#define BOARDRX 1
#define CAN_USE_EXTENDED_ID FALSE
#include <can-18xxx8.c>
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;
int1 tx_rtr=0;
int1 tx_ext=1;
int tx_len=8;
int tx_pri=3;
int i;
can_init();
//can_set_mode(CAN_OP_LOOPBACK);
delay_ms(1000);
output_high(BLINKER);
delay_ms(500);
output_low(BLINKER);
delay_ms(300);
printf("\nuC OK\n");
delay_ms(300);
while(TRUE)
{
delay_ms(600);
printf("\nIam running");
delay_ms(600);
delay_ms(1000);
output_high(BLINKER);
delay_ms(500);
output_low(BLINKER);
delay_ms(500);
#ifdef BOARDRX
printf("\n RX MODE ");
delay_ms(800);
if ( can_kbhit() ) //if data is waiting in buffer...
{
printf("\nCAN KBHIT");
if(can_getd(rx_id, in_data, rx_len, rxstat)) { //...then get data from buffer
printf("\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("\n DATA = ");
for (i=0;i<rx_len;i++) {
printf("%X ",in_data[i]);
}
printf("\n");
}
else {
printf("\nFAIL on GETD\n");
}
}
#endif
#ifdef BOARDTX
delay_ms(900);
delay_ms(900);
if ( 1==1 )
{
output_high(BLINKER);
delay_ms(500);
output_low(BLINKER);
out_data[0]= 0; // *** Add these 8 lines
out_data[1]= 1;
out_data[2]= 2;
out_data[3]= 3;
out_data[4]= 4;
out_data[5]= 5;
out_data[6]= 6;
out_data[7]= 7;
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
delay_ms(200);
printf("\n PUT %U: ID=%LU LEN=%U ", i, tx_id, tx_len);
printf("PRI=%U EXT=%U RTR=%U\n DATA = ", tx_pri, tx_ext, tx_rtr);
for (i=0;i<tx_len;i++) {
printf("%X ",out_data[i]);
}
printf("\n");
}
else { //fail, no transmit buffer was open
printf("\nFAIL on PUTD\n");
}
}
#endif
}
}
|
Last edited by defoxe on Tue Feb 10, 2015 3:09 am; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jan 30, 2015 10:37 am |
|
|
The first thing you should do is get the UART working reliably.
Remove all the CAN code. Just test the UART.
Also post your CCS compiler version. It's given at the top of the .LST file
which is in your project directory after a successful compilation. |
|
|
defoxe
Joined: 30 Jan 2015 Posts: 8
|
|
Posted: Fri Jan 30, 2015 11:20 am |
|
|
PCM programmer wrote: | The first thing you should do is get the UART working reliably.
Remove all the CAN code. Just test the UART. |
I was trying with simply code for UART. Two different uC and speed 300, 600, 9600.
Its working but I have also crazy signs:
Code: |
Iam running �@��@@�I
$�$ � H@�
RX[H���+��
H� �@ HI��
Iam running
��@��@
|
PCM programmer wrote: | Also post your CCS compiler version. It's given at the top of the .LST file
which is in your project directory after a successful compilation. |
My version is 5.025 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jan 30, 2015 11:44 am |
|
|
Post a small test program only for the UART and I'll test it with your
version. The program should be complete, with #include, #fuses, #use delay, etc. |
|
|
defoxe
Joined: 30 Jan 2015 Posts: 8
|
|
Posted: Sat Jan 31, 2015 11:25 am |
|
|
PCM programmer wrote: | Post a small test program only for the UART and I'll test it with your version. The program should be complete, with #include, #fuses, #use delay, etc. |
Today I am using my laptop and USB-RS232 converter.
This simple code is working, transmission via UART is clear with no errors.
Also my previous code is working on this adapter.
Code: |
#include <18F25K80.h>
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,NOCPD,BROWNOUT,NOIESO,NOFCMEN
#use delay(clock=8M)
#use rs232(uart,baud=9600,bits=8,parity=N,stop=1)
void main() {
delay_ms(300);
printf("\n\ruC OK\n");
delay_ms(300);
while(TRUE)
{
delay_ms(600);
printf("\n\rIam running\n");
delay_ms(600);
}
}
|
I was trying to wake up CAN.
#use delay(clock=4M) - nothing special on the oscilloscope
#use delay(clock=8M) and #use delay(clock=64M) - waveforms on an oscilloscope
But no data received and I am not sure if it has been transmitted... |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Jan 31, 2015 1:35 pm |
|
|
What PIC pins are you using for the CAN bus ? The 18F25K80 can have
the CAN bus on PortB or on PortC, depending upon the #fuses, which
are CANB and CANC. If no fuse is specified, it defaults to PortB.
Try doing the 2-board test with the code that I have posted here.
http://www.ccsinfo.com/forum/viewtopic.php?t=51749&start=13 |
|
|
defoxe
Joined: 30 Jan 2015 Posts: 8
|
|
Posted: Tue Feb 03, 2015 1:15 pm |
|
|
PCM programmer wrote: | What PIC pins are you using for the CAN bus ? The 18F25K80 can have the CAN bus on PortB or on PortC, depending upon the #fuses, which
are CANB and CANC. If no fuse is specified, it defaults to PortB.
|
I am using CAN bus on PortB and UART from PortC.
My modification:
Code: |
#include <18F25k80.h>
#fuses INTRC_IO, NOPROTECT, PUT, BROWNOUT, NOWDT
#use delay(clock=8000000)
|
And its pretty working!
Thank you for this! |
|
|
|
|
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
|