User manual

mikroC PRO for dsPIC
MikroElektronika
341
ECAN1Write(Tx_ID, RxTx_Data, 1, Can_Send_Flags); // send initial message
while (1) { // endless loop
Msg_Rcvd = ECAN1Read(&Rx_ID , RxTx_Data , &Rx_Data_Len, &Can_Rcv_Flags); // receive
message
if ((Rx_ID == 3u) && Msg_Rcvd) { // if message received check id
PORTB = RxTx_Data[0]; // id correct, output data at PORTB
RxTx_Data[0]++ ; // increment received data
Delay_ms(10);
ECAN1Write(Tx_ID, RxTx_Data, 1, Can_Send_Flags); // send incremented data back
}
}
}
Code for the second ECAN node:
Copy Code To Clipboard
#include "__Lib_ECAN1_Defs.h"
unsigned int Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags; // can ags
unsigned int Rx_Data_Len; // received data length in
bytes
char RxTx_Data[8]; // can rx/tx data buffer
char Msg_Rcvd; // reception ag
unsigned long Tx_ID, Rx_ID; // can rx and tx ID
void C1Interrupt(void) org 0x005A { // ECAN event iterrupt
IFS2bits.C1IF = 0; // clear ECAN interrupt ag
if(C1INTFbits.TBIF) { // was it tx interrupt?
C1INTFbits.TBIF = 0; // if yes clear tx interrupt ag
}
if(C1INTFbits.RBIF) { // was it rx interrupt?
C1INTFbits.RBIF = 0; // if yes clear rx interrupt ag
}
}
void main() {
// Set PLL : Fosc = ((Fin/PLLPRE)*PLLDIV)/PLLPOST ; (((10MHz/2)*32)/4) = 20MHz
// refer the pic24 family datasheet for more details
CLKDIV &= 0xFFE0; //CLKDIVbits.PLLPRE = 0;
PLLFBD = 0x1E; //PLLFBDbits.PLLDIV = 0x1E;
CLKDIV &= 0xFF3F; //CLKDIVbits.PLLPOST = 1;
CLKDIV |= 0x00C0;
AD1PCFGH = 0xFFFF; //
AD1PCFGL = 0xFFFF; // all ports digital I/O
AD2PCFGL = 0xFFFF; //