This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Interrupt function handle location error

Hello, I am rather new to the embedded programming land and I was using an interrupt to handle my I2C interface.

I am using:
uVision 5 - ide and debugger
R8051CX2 - chip
C51 - compiler
windows 7 professional - OS

I initialize everything with:

void init_i2c(void)
{
  I2CADR = SLAVE_ADDRESS & 0xFF;                                    // slave address (1011010_0) last bit is "general call" bit
        I2CCON |= 0x44;                                                                                                                 // enable I2C
        TMOD |= 0x01;                               // timer 0 mode 1
        IEN0 = 0x82;                                                                                                                            // enable all interupts and timer 0 overflow
        IEN1 |= 0x01;                                                                                                                           // enable external interrupt 7 (for I2C)
        //S1CON = 0x10;                               // enable serial comm. (port 1)   - no acknowledgements will be generated
        //IEN2 = 0x01;                                                                                                                          // enable serial port 1 interrupts
        //ES1 = 1;                                                                                                                                              // enable serial port 1 interrupts
        //May or may not need pin code below
  //P1 ^= 0x40;
  //P1 ^= 0x80;
}

The beginning of my ISR is: (My device is running as a slave receiver)

void i2c_isr(void) interrupt 7 // EX7 is the SI (i2c) interrupt port
{
  switch(I2CSTA)
  {
    // RECEIVED ADDRESS AND RETURNED ACK (ASSUMED SLAVE)
    case 0x60:
          start_timer();                          // start timer 0 to start measuring the timeout period
      break;

And the problem I see after running the debugger and using the I2C peripheral tool (when the SI bit triggers the interrupt) is:

C:0x003B    020800   LJMP     i2c_isr(C:0800)
C:0x003E    00       NOP
C:0x003F    00       NOP
C:0x0040    00       NOP
C:0x0041    00       NOP
C:0x0042    00       NOP
C:0x0043    00       NOP

In the data sheet, you will notice the interrupt vector for I2C is ORed with the Interrupt 7 module which is located at 0x0043, so it seems the simulator is working, but I am not quite sure why the handle function is placed at 0x003B?

If you need it my main looks like:

void main(void)
{
        init_i2c();

        while(!TF0 || i2c_status != I2C_ERROR);  // run I2C and program dump until timeout occurs
                                                                                                                                                                         // Timeout could be from failed comm. or end of transmission

        EAL = 0;                                                                                                                                 // disable all interupts
        if(i2c_status == I2C_ERROR)
        {
                write_byte_to_progmem(NOP);
        }


        // set pointer to initial spot for OTP
        // blahblah = PROGRAM_MEM_START;

}

NOTE: I am using the provided register header file "REG51CX2.H" from the uVision website for the respective chip. Also, my full code does compile, no errors.

0