Hi inka,
habs versucht ...
Ich auch ...

1. Die Funktion:
Code:
uint8_t read_IR_value(void)
{
//    uint8_t temp = 0;
    I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 30); // Start with register 30
    I2CTWI_readBytes(I2C_RP6_BASE_ADR, temp_IR, 1);
    return temp;
}
... tut nicht das, was sie soll.
Wenn du sie im Programm mit temp = read_IR_value(); aufrufst, wird von der Funktion nicht der IR-Sensor-Wert zurückgegeben, sondern der Wert der (globalen) Variablen temp.
Allerdings wird der IR-Sensor-Wert in der (ebenfalls globalen) Variablen temp_IR gespeichert, die im Programm als Array definiert ist.
temp_IR[0] wird von dir aber nicht weiter benutzt.
Die Funktion müßte so aussehen:
Code:
uint8_t read_IR_value(void)
{
    uint8_t tmp = 0;
    I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 30); // Start with register 30
    I2CTWI_readBytes(I2C_RP6_BASE_ADR, tmp, 1);
    return tmp;
}
Dann kriegst du mit temp = read_IR_value(); den IR-Sensor-Wert in temp.

2. Nochmal zur Hauptschleife:
Code:
    while(true)
    {

        do
        {

            // Alles weitere ...


            task_checkINT0();
            task_I2CTWI();
        }
        while(!bumper_left && !bumper_right);
        stop();

    }
... und dem Problem, dass sie m.E. nicht funktioniert. Warum soll diese Schleife auf die Bumper reagieren? Teste das mal! Wird der Stop-Befehl erreicht, wenn du einen Bumper drückst?

3.
reflektionen, ansonsten siehe kommentare
Ich kann nicht verstehen, warum durch eine Abfrage des IR-Empfängers rasch hintereinander im 50ms-Teil Reflektionen "erkannt" bzw. ausgeblendet werden können. In einem Raum können Lichtreflektionen durch ein einfaches GCC-Programm nicht berechnet/erkannt werden. Sie unterscheiden sich in der Laufzeit in einem Zimmer nur im Nanosekundenbereich.

4. ... (so viel erstmal ...)