El código del receptor (en CCS) es:
#include <18F4580.h>
#include <stdlib.h>
#use delay (clock=20000000)
#use rs232(uart1, baud=9600,TIMEOUT=10)
#fuses HS,NOWDT,WDT256,NOPROTECT,NOPUT,BROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
#byte port_c = 0xF82
#byte port_d = 0xF83
#define CAN_DO_DEBUG TRUE
#include "can-18F4580.c"
int16 ms;
const int word_size = 8;//TAMAÑO DE LAS PALABRAS
char XX[word_size];
#define TSE1 0x201
void main() {
struct rx_stat rxstat;
int32 rx_id;
char buffer[8];
int rx_len=8;
int i;
for(i=0;i<8;i++) {
buffer[i]=0;
}
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
can_init();
enable_interrupts(GLOBAL);
printf("INICIO");
SETUP_WDT(WDT_ON);//inicializa el wdt cada 2304 ms
while(true){
if ( can_kbhit() ) {
printf("\r\n");
if(can_getd(rx_id, &buffer, rx_len, rxstat)) {//ID,DATO,TAMAÑO,...
if (rx_id == TSE1) {
for (i=0;i<word_size;i++) XX[i] = buffer[i];
printf("RECIBE: %c%c%c%c%c%c%c%c\r\n",XX[0]XX[1]XX[2]XX[3]XX[4]XX[5]XX[6]XX[7]);
}//END IF IDENTIFICACION RX CAN
}//END IF CAPTURA CAN
}//end can kbhit
restart_wdt();
}//end while
}//end main
El código del transmisor (mikroC) es:
unsigned char Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags; // can flags
unsigned char Rx_Data_Len; // received data length in bytes
char RxTx_Data[8]; // can rx/tx data buffer
char Msg_Rcvd;
//const long transmisor = 102, receptor = 3; // node IDs
const long main_node = 0x201;
long Rx_ID;
unsigned int cnt;
unsigned int temp_res;
char envio1[]="ENVIO 01";
void main() {
PORTC = 0; // clear PORTC
TRISA = 0xFF; // PORTA is input
CMCON=7;
T2CON = 0x07; // Timer2 settings
TMR2IF_bit = 0; // clear TMR2IF
TMR2IE_bit = 1; // enable Timer2 interrupt
cnt = 0; // initialize cnt
INTCON = 0xC0; // Set GIE, PEIE
TRISC = 0; // set PORTC as output
LATD = 0 ;
TRISD = 0 ; // set PORTD as output
value = 0; // When program starts, DAC gives
// the output in the mid-range
PORTC.F7 = 1;
PORTC.F6 = 0;
Can_Init_Flags = 0; //
Can_Send_Flags = 0; // clear flags
Can_Rcv_Flags = 0; //
Can_Send_Flags = _CAN_TX_PRIORITY_0 & // form value to be used
_CAN_TX_XTD_FRAME & // with CANWrite
_CAN_TX_NO_RTR_FRAME;
Can_Init_Flags = _CAN_CONFIG_SAMPLE_THRICE & // form value to be used
_CAN_CONFIG_PHSEG2_PRG_ON & // with CANInit
_CAN_CONFIG_XTD_MSG &
_CAN_CONFIG_DBL_BUFFER_ON &
_CAN_CONFIG_VALID_XTD_MSG &
_CAN_CONFIG_LINE_FILTER_OFF;
CANInitialize(1,3,3,3,1,Can_Init_Flags); // initialize external CAN module
CANSetOperationMode(_CAN_MODE_CONFIG,0xFF); // set CONFIGURATION mode
CANSetBaudRate(1,1,8,8,3,_CAN_CONFIG_SAMPLE_ONCE & _CAN_CONFIG_PHSEG2_PRG_ON & _CAN_CONFIG_LINE_FILTER_OFF); //500
CANSetMask(_CAN_MASK_B1,-1,_CAN_CONFIG_XTD_MSG); // set all mask1 bits to ones
CANSetMask(_CAN_MASK_B2,-1,_CAN_CONFIG_XTD_MSG); // set all mask2 bits to ones
CANSetFilter(_CAN_FILTER_B2_F3,ID_1001,_CAN_CONFIG_XTD_MSG);// set id of filter B2_F3 to 1st node ID
CANSetOperationMode(_CAN_MODE_NORMAL,0xFF); // set NORMAL mode
while (1) {
CANWrite(main_node, envio1 , 8, Can_Send_Flags);
Delay_ms(1000);
}
}
Ambos códigos son para el pic 18F4580 con cristales de 20Mhz