I am using CAN module of MC9S12XHZ512 microcontroller, I successfully archive transmitting of data from my microcontroller, but problem is that I am able to receive data only one time after that my controller get hang, I think that I have not clear my CAN receiver interrupt flag, can anyone tell me where I can get CAN receiver interrupt flag in datasheet, I post my interrupt code for CAN below. Do MC9S12XHZ512 compiler support sprintf function.
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void Vcan1RxISR(void)
{
unsigned char RxBuffer[8],u8Length=8;
unsigned int R,temp;
LCD_Cmd(0x80);
R = CAN1RXDSR0;
Convert(R);
LCD_Data(D);
delay();
LCD_Data(C);
delay();
LCD_Data(B);
delay();;
LCD_Data(A);
delay();
PORTA = 0xFF;
CAN1RFLG_RXF = 1;
}
The flag should be cleared as following, for example:
CANTFLG = 0x01; //Clear the TXE flag in the CTFLG register to indicate this buffer is full
/* The following is another method to clear the TXE flag to indicate this buffer is full in assembly language.
Notice that the LDA and STA instructions are used. DO NOT USE THE BSET Instructions.
#asm
LDAA #0x01;
STAA $0x106;
#endasm
*/
Here is the link to an appnote Scalable Controller Area Network (MSCAN) Interrupts which is a bit old, but still usefull for your purpose.
Regards,
iggi
volatile unsigned int
volatile means ?
I am getting this error
This code is not working for input capture mode
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void IC0_ISR(void)
{
// new_capture = TC0; //save the value of input capture register
LCD_Cmd(0x80);
PORTA = 0xFF;
t[i]=TC0;
i++;
if(i==2) {
i=0;
// 6.0742270546073012209196379760675e-8
time_interval=(t[1]-t[0]);
time_period=(float)(0.0000256* time_interval);
frequency= 1/time_period;
sprintf(buffer,"%f",frequency);
for(j=0;j<4;j++)
{
LCD_Data(buffer[j]);
}
}
TFLG1 = 0x01; //clear interrupt flag
}
interrupt void TOI_ISR(void)
{
TFLG2 = 0x80; //clear interrupt flag
}
unsigned int TM;
/* User includes (#include below this line is not maintained by Processor Expert) */
void main(void)
{
/* Write your local variable definition here */
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
PE_low_level_init();
/*** End of Processor Expert internal initialization. ***/
/* Write your code here */
LCDIni();
// LCD_Cmd(0x01);
LCD_Cmd(0x80);
LCD_Data('T');
PPST_PPST0 = 0; //set pull-up
PERT_PERT0 = 1; //enable pull-up
TSCR1 = 0xE7; //enable timer, stop timer during wait and freeze, disable fast flag clear
TIOS_IOS0 = 0; //channel 0 as an input capture
TCTL4 = 0x01; //capture on rising edge
TIE_C0I = 0x01; //enable interrupt on channel 1
TSCR2 = 0x80; //timer overflow interrupt enable, timer prescaler is 0
for(;;){}
/*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
/*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/
I have written at end of my code
CANTFLG = 0x01;
but way is different
CAN1RFLG_RXF = 1;
I think CAN1RFLG_RXF show CAN receiver FIFO is full , I am looking for CAN receiver interrupt flag.
regard
kushal nandanwar