Mach ja nix wenn der Betrag schon etwas älter ist
Hab mir die aktuelle Beschreibung des CMPS03 auf robotikhardware.de angesehen und festgestellt das die mittlerweile geändert wurde.
Ich habe meinen Kompass mit der Pin Methode kalibriert nicht über I2C - im Endeffekt habe ich den Sensor 5x kalibriert Nord/Ost/Süd/West/Nord , dann hats funktioniert.

Bei mir ist der Kompass ganz vorne auf der Erweiterungsplatine montiert. Gemessen habe ich nur im Stillstand, während der Fahrt habe ich nie gemessen, so hatte ich keine Probleme damit.
Klicke auf die Grafik für eine größere Ansicht

Name:	RP6.jpg
Hits:	28
Größe:	86,9 KB
ID:	19306

Zur Abschirmung wäre wohl µ-Metall (http://de.wikipedia.org/wiki/Mu-Metall) am besten geeignet - aber woher nehmen.

--
Hab grad festgestellt das ich mein laufendes Programm gar nicht mehr hier reingestellt habe.
Code:
/*******************************************************************************
 * RP6 C-Control PRO M128 Erweiterungsmodul
 * ----------------------------------------------------------------------------
 * RP6 - M128 - CMPS03 Kompassmodul Test / Display Test
 * ----------------------------------------------------------------------------
 * by ScummVM
 ******************************************************************************/

// RP6CCLib einbinden
#include "RP6CCLib.cc"

// RP6 Master Lib einbinden
#include "RP6MasterLib.cc"

// Stopwatch einbinden
#include "RP6StopwatchesCClib.cc"

// I²C Bus Adresse des Controllers auf dem Mainboard
#define RP6_BASE_ADR    10

// Die I²C Adresse des CMPS03 ist 0xC0:
#define CMPS03_ADR      0xC0

// CMPS03 Daten Register:
#define VERSION         0               // Firmware Version
#define LOW             1               // Lowbyte
#define HIGH            2               // Highbyte
#define CALIBRATE       15              // Kalibrierung

//CMPS03 DATEN REGISTER AUSLESEN

float grad, value;
word messung;
char result[2];
byte messung_low, messung_high, version;

void readCMPS03(void)
{
    I2C_Start();
    I2C_Write(0xC0);
    I2C_Write(0xC2); // Register 2 lesen
    I2C_Stop();
    I2C_Start();
    I2C_Write(0xC1); // Register 1 lesen
    messung_high = I2C_Read_ACK();
    messung_low = I2C_Read_NACK();
    version = RP6_readRegister(0xC0, 0);
    messung = (( messung_high << 8 ) + messung_low);
    I2C_Stop();
    RP6_readRegisters(RP6_BASE_ADR, I2C_REG_ADC_UBAT_L, messageBuf, 2);
    adcBat = (messageBuf[1] << 8) | (messageBuf[0]);


    if (getStopwatch1() > 500) {

        value = (adcBat / 102.4);          // Spannung umrechnen
        grad = (messung / 10.0);           // Grad umrechnen
        print("Version: ");                // Version seriell
        printInteger(version);             // Version seriell ausgeben
        print(" | Richtung: ");            // Richtung seriell
        clearLCD();                        // LCD löschen
        printlnLCD("Richtung:",0,0);       // Richtung LCD
        Str_WriteFloat(grad,1,result,0);   // Winkel seriell ausgeben
        Serial_WriteText(0,result);
        setCursorPosLCD(1,0);              // Cursor Position
        writeStringLCD(result);            // Winkel am LCD ausgeben
        println(" Grad");                  // Grad seriell
        print(" | Akku: ");                // Akku seriell
        Str_WriteFloat(value,2,result,0);  // Spannung seriell ausgeben
        Serial_WriteText(0,result);
        println(" V");                     // Einheit Spannung
        setCursorPosLCD(1,6);              // Cursor Position
        printLCD("Grad");                  // Grad LCD
        setStopwatch1(0);
    }
}

// Mainprogramm

void main(void)
{
    RP6_CCPRO_Init(); // Auf Startsignal warten!
    I2C_Init(I2C_400kHz);

    newline();
    println("   ________________________");
    println("   \\| RP6  ROBOT SYSTEM |/");
    println("    \\_-_-_-_-_-_-_-_-_-_/ ");
    newline();
    println("        CMPS03 Test  ");
    newline();

    showScreenLCD("CMPS03 Test","");

    beep(100, 200, 300);

    setStopwatch1(0);
    startStopwatch1();

    while(true)
    {
        readCMPS03();
    }
}
Das Programm gibt die Richtung mit Kommastelle auf dem LCD aus und über die Serielle Schnittstelle die Version, Richtung und Akkuspannung. Es lässt sich sicher alles besser lösen - aber es läuft. Das Programm benutzt die Stopwatches für die M128 von Dirk https://www.roboternetz.de/community...ight=stopwatch

Gruß
ScummVM