Hallo,
hm.. okay.. das bringt mich wenigstens schon mal einen schritt weiter. Allerdings hab ich nun das Beispielprogramm des Cmps03 mal wie folgt umgeschrieben:
Code:
/* 
 * ****************************************************************************
 * RP6 ROBOT SYSTEM - ROBOT BASE EXAMPLES
 * ****************************************************************************
 * Example: I2C Master - Hdmm01 Rp6
 * Author(s): M.Hunfeld
 * ****************************************************************************
 * Description:
 *
 * This Example shows how to use the compass module Hdmm01
 * with RP6Library.
 *
 * ****************************************************************************
 */

/*****************************************************************************/
// Includes:

#include "RP6RobotBaseLib.h"     


// IMPORTANT:

#include "RP6I2CmasterTWI.h"     // Include the I²C-Bus Slave Library


/*****************************************************************************/
// I2C Event handlers:

/**
 * This function gets called automatically if there was an I2C Error like
 * the slave sent a "not acknowledge" (NACK, error codes e.g. 0x20 or 0x30).
 * The most common mistakes are: 
 *   - using the wrong address for the slave
 *   - slave not active or not connected to the I2C-Bus
 *   - too fast requests for a slower slave
 * Be sure to check this if you get I2C errors!
 */
void I2C_transmissionError(uint8_t errorState)
{
    writeString_P("\nI2C ERROR --> TWI STATE IS: 0x");
    writeInteger(errorState, HEX);
    writeChar('\n');
}

/*****************************************************************************/


#define CMPS            0x60//Die Adresse des Hdmm01 Moduls 
#define Read             0x61//Die Adresse des Hdmm01 Moduls zum Lesen
#define MEASURE_16_BIT  0x00//Die Register-Adresse



uint16_t readCMPS(uint8_t datareg)
{uint16_t result = 0xffff; uint8_t results[3];
    I2CTWI_transmitByte(CMPS, datareg);
    if (datareg == MEASURE_16_BIT) {
        I2CTWI_readBytes(Read, results, 2);
        result = (results[0] << 8) + results[1];
    }
    else {
        result = I2CTWI_readByte(Read);
    }
    return result;
}


void task_CMPS(void)
{uint16_t degrees;
    if (getStopwatch1() > 500) {
        degrees = readCMPS(MEASURE_16_BIT);
        writeString_P("Richtung: "); 
        writeIntegerLength((degrees / 10), DEC, 3);
        writeChar('.');
        writeIntegerLength(degrees, DEC, 1);
        writeString_P(" Grad\n");
        setStopwatch1(0);
    }
}


/*****************************************************************************/
// Main - The program starts here:

int main(void)
{
    initRobotBase();
    
    I2CTWI_initMaster(100); // Initialize the TWI Module for Master operation
                            // with 100kHz SCL Frequency
    
    // Register the event handlers:
    I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);


    
    powerON();

    startStopwatch1();
    
    while(true)  
    {
        task_I2CTWI();
        task_RP6System();
        task_CMPS();
        
    }
    return 0;
}
Allerdings, das Ergebnis:


Code:
I2C ERROR --> TWI STATE IS: 0x20
 
I2C ERROR --> TWI STATE IS: 0x48
Richtung: 000.0 Grad
 
I2C ERROR --> TWI STATE IS: 0x20
 
I2C ERROR --> TWI STATE IS: 0x48
Richtung: 000.0 Grad
Es wird wahrscheinlich daran liegen, dass es bei dem Hdmm01 Modul nur ein Register gibt, welches man allerdings manipulieren muss. Malthy hat es in Bascom so gelöst:
072.' sensor adressieren (schreiben)
073.I2cwbyte Cmp_w
074.' register adressieren
075.I2cwbyte &H00
076.'
077.' register manipulieren -> reset coil
078.I2cwbyte &B00000100

Doch wie realisiert man dies in "C", für die Rp6 Lib tauglich?

Liebe Grüße Marcel