Ich habe gerade die M128 und die Base mit der Remotrol am laufen, aber die M128 bekommt nix von den Bumpern und dem ACS mit. Wenn ich das richtig sehe, dann weil es nicht im Register steht.
Register Base:
Code:
/*****************************************************************************/
// I2C Registers that can be read by the Master. Their names should 
// be self-explanatory and directly relate to the equivalent variables/functions 
// in the RP6Library

#define I2C_REG_STATUS1          0
#define I2C_REG_STATUS2          1
#define I2C_REG_MOTION_STATUS      2
#define I2C_REG_POWER_LEFT          3
#define I2C_REG_POWER_RIGHT      4
#define I2C_REG_SPEED_LEFT          5
#define I2C_REG_SPEED_RIGHT      6
#define I2C_REG_DES_SPEED_LEFT      7
#define I2C_REG_DES_SPEED_RIGHT  8
#define I2C_REG_DIST_LEFT_L      9
#define I2C_REG_DIST_LEFT_H      10
#define I2C_REG_DIST_RIGHT_L     11
#define I2C_REG_DIST_RIGHT_H      12
#define I2C_REG_ADC_LSL_L          13
#define I2C_REG_ADC_LSL_H          14
#define I2C_REG_ADC_LSR_L          15
#define I2C_REG_ADC_LSR_H          16
#define I2C_REG_ADC_MOTOR_CURL_L 17
#define I2C_REG_ADC_MOTOR_CURL_H 18
#define I2C_REG_ADC_MOTOR_CURR_L 19
#define I2C_REG_ADC_MOTOR_CURR_H 20
#define I2C_REG_ADC_UBAT_L          21
#define I2C_REG_ADC_UBAT_H          22
#define I2C_REG_ADC_ADC0_L          23
#define I2C_REG_ADC_ADC0_H          24
#define I2C_REG_ADC_ADC1_L          25
#define I2C_REG_ADC_ADC1_H          26
#define I2C_REG_RC5_ADR              27
#define I2C_REG_RC5_DATA          28
#define I2C_REG_LEDS              29


/**
 * This very important function updates ALL registers that the Master can read.
 * It is called frequently out of the Main loop. 
 */
void task_updateRegisters(void)
{
    if(!I2CTWI_readBusy) 
    {
        I2CTWI_readRegisters[I2C_REG_STATUS1] =          (uint8_t)(interrupt_status.byte);
        I2CTWI_readRegisters[I2C_REG_STATUS2] =          (uint8_t)(status.byte);
        I2CTWI_readRegisters[I2C_REG_MOTION_STATUS] =      (uint8_t)(drive_status.byte);
        I2CTWI_readRegisters[I2C_REG_POWER_LEFT] =          (uint8_t)(mleft_power);
        I2CTWI_readRegisters[I2C_REG_POWER_RIGHT] =      (uint8_t)(mright_power);
        I2CTWI_readRegisters[I2C_REG_SPEED_LEFT] =          (uint8_t)(getLeftSpeed());
        I2CTWI_readRegisters[I2C_REG_SPEED_RIGHT] =      (uint8_t)(getRightSpeed());
        I2CTWI_readRegisters[I2C_REG_DES_SPEED_LEFT] =      (uint8_t)(getDesSpeedLeft());
        I2CTWI_readRegisters[I2C_REG_DES_SPEED_RIGHT] =  (uint8_t)(getDesSpeedRight());
        I2CTWI_readRegisters[I2C_REG_DIST_LEFT_L] =      (uint8_t)(getLeftDistance());
        I2CTWI_readRegisters[I2C_REG_DIST_LEFT_H] =      (uint8_t)(getLeftDistance()>>8);
        I2CTWI_readRegisters[I2C_REG_DIST_RIGHT_L] =      (uint8_t)(getRightDistance());
        I2CTWI_readRegisters[I2C_REG_DIST_RIGHT_H] =      (uint8_t)(getRightDistance()>>8);
        I2CTWI_readRegisters[I2C_REG_ADC_LSL_L] =          (uint8_t)(adcLSL);
        I2CTWI_readRegisters[I2C_REG_ADC_LSL_H] =          (uint8_t)(adcLSL>>8);
        I2CTWI_readRegisters[I2C_REG_ADC_LSR_L] =          (uint8_t)(adcLSR);
        I2CTWI_readRegisters[I2C_REG_ADC_LSR_H] =          (uint8_t)(adcLSR>>8);
        I2CTWI_readRegisters[I2C_REG_ADC_MOTOR_CURL_L] = (uint8_t)(adcMotorCurrentLeft);
        I2CTWI_readRegisters[I2C_REG_ADC_MOTOR_CURL_H] = (uint8_t)(adcMotorCurrentLeft>>8);
        I2CTWI_readRegisters[I2C_REG_ADC_MOTOR_CURR_L] = (uint8_t)(adcMotorCurrentRight);
        I2CTWI_readRegisters[I2C_REG_ADC_MOTOR_CURR_H] = (uint8_t)(adcMotorCurrentRight>>8);
        I2CTWI_readRegisters[I2C_REG_ADC_UBAT_L] =          (uint8_t)(adcBat);
        I2CTWI_readRegisters[I2C_REG_ADC_UBAT_H] =          (uint8_t)(adcBat>>8);
        I2CTWI_readRegisters[I2C_REG_ADC_ADC0_L] =          (uint8_t)(adc0);
        I2CTWI_readRegisters[I2C_REG_ADC_ADC0_H] =          (uint8_t)(adc0>>8);
        I2CTWI_readRegisters[I2C_REG_ADC_ADC1_L] =          (uint8_t)(adc1);
        I2CTWI_readRegisters[I2C_REG_ADC_ADC1_H] =          (uint8_t)(adc1>>8);
        I2CTWI_readRegisters[I2C_REG_LEDS] =              (uint8_t)(statusLEDs.byte);
        I2CTWI_readRegisters[I2C_REG_RC5_ADR] =          (uint8_t)((lastRC5Reception.device)|(lastRC5Reception.toggle_bit<<5));
        I2CTWI_readRegisters[I2C_REG_RC5_DATA] =          (uint8_t)(lastRC5Reception.key_code);
        if(I2CTWI_dataWasRead && I2CTWI_dataReadFromReg == 0)
            clearInterrupt();
    }
}
Register M128:
Code:
// I2C Read Register des I2CSlave Programms:

#define I2C_REG_STATUS1          0
#define I2C_REG_STATUS2          1
#define I2C_REG_MOTION_STATUS      2
#define I2C_REG_POWER_LEFT          3
#define I2C_REG_POWER_RIGHT      4
#define I2C_REG_SPEED_LEFT          5
#define I2C_REG_SPEED_RIGHT      6
#define I2C_REG_DES_SPEED_LEFT      7
#define I2C_REG_DES_SPEED_RIGHT  8
#define I2C_REG_DIST_LEFT_L      9
#define I2C_REG_DIST_LEFT_H      10
#define I2C_REG_DIST_RIGHT_L     11
#define I2C_REG_DIST_RIGHT_H      12
#define I2C_REG_ADC_LSL_L          13
#define I2C_REG_ADC_LSL_H          14
#define I2C_REG_ADC_LSR_L          15
#define I2C_REG_ADC_LSR_H          16
#define I2C_REG_ADC_MOTOR_CURL_L 17
#define I2C_REG_ADC_MOTOR_CURL_H 18
#define I2C_REG_ADC_MOTOR_CURR_L 19
#define I2C_REG_ADC_MOTOR_CURR_H 20
#define I2C_REG_ADC_UBAT_L          21
#define I2C_REG_ADC_UBAT_H          22
#define I2C_REG_ADC_ADC0_L          23
#define I2C_REG_ADC_ADC0_H          24
#define I2C_REG_ADC_ADC1_L          25
#define I2C_REG_ADC_ADC1_H          26
#define I2C_REG_RC5_ADR              27
#define I2C_REG_RC5_DATA          28
#define I2C_REG_LEDS              29
Stimmt das? Was muss ich denn ändern, wenn ich sowohl die beiden ACS (left, right) haben will, als auch Bumper left, Bumper Right, Bumper back left und bimper back right?
Letztere werden in meiner Lib so eingeführt (wie vom nil.at) :
Code:
uint8_t getBackBumperLeft(void) 
{ 
   PORTC &= ~SL2; 
   DDRC &= ~SL2; 
   nop(); 
   uint8_t tmp = PINC & SL2; 
   if(statusLEDs.LED2) { 
      DDRC |= SL2; 
      PORTC |= SL2; 
   } 
   return tmp; 
} 

uint8_t getBackBumperRight(void) 
{ 
   PORTB &= ~SL5; 
   DDRB &= ~SL5; 
   nop(); 
   uint8_t tmp = PINB & SL5; 
   if(statusLEDs.LED5) { 
      DDRB |= SL5; 
      PORTB |= SL5; 
   } 
   return tmp; 
}
Danke euch schon mal!