Hi Marcel,
das Modul CMPS03 wird völlig anders ausgelesen als der HDMM01. Daher kannst du mein Programm nicht 1:1 nehmen.
Ich habe den HDMM01 nicht selbst. Du kannst folgendes Testprogramm mal als Anfang für eigene Experimente nehmen:
Ein Problem bei der Lesefunktion ist, dass an einer Stelle (siehe Kommentar) eigentlich kein Stop gesendet werden darf. Das macht aber die RP6 Library.Code:/* * **************************************************************************** * RP6 ROBOT SYSTEM - ROBOT BASE EXAMPLES * **************************************************************************** * Example: I2C Master - HDMM01 * Author(s): Dirk * **************************************************************************** * 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'); } /*****************************************************************************/ /** * Write a long number (with specified base) to the UART. * * Example: * * // Write a hexadecimal number to the UART: * writeLong(0xAACC,16); * // Instead of 16 you can also write "HEX" as this is defined in the * // RP6uart.h : * writeLong(0xAACC, HEX); * // Other Formats: * writeLong(1024,DEC); // Decimal * writeLong(044,OCT); // Octal * writeLong(0b11010111,BIN); // Binary */ void writeLong(int32_t number, uint8_t base) {char buffer[33]; ltoa(number, &buffer[0], base); writeString(&buffer[0]); } /*****************************************************************************/ // The I2C slave address of the compass module HDMM01 is 0x60: #define HDMM01_ADR 0x60 // HDMM01 Data Register: #define DATA_REG 0 // HDMM01 Commands: #define SET_COIL 0b00000010 #define RESET_COIL 0b00000100 #define MEASURE 0b00000001 uint8_t results[5]; /** * READ HDMM01 DATA REGISTER * * This function reads the data register of the HDMM01. * */ void readHDMM01(void) { I2CTWI_transmit2Bytes(HDMM01_ADR, DATA_REG, SET_COIL); mSleep(1); I2CTWI_transmit2Bytes(HDMM01_ADR, DATA_REG, RESET_COIL); mSleep(5); I2CTWI_transmit2Bytes(HDMM01_ADR, DATA_REG, MEASURE); mSleep(5); I2CTWI_transmitByte(HDMM01_ADR, DATA_REG); // Hier sollte eigentlich kein Stop sein ... I2CTWI_readBytes(HDMM01_ADR, results, 5); return; } /** * HDMM01 TASK * * This is the HDMM01 task. * */ void task_HDMM01(void) {uint16_t X, Y; if (getStopwatch1() > 500) { readHDMM01(); results[1] = results[1] & 0b00001111; results[3] = results[3] & 0b00001111; X = results[1] * 256; X = X + results[2]; Y = results[3] * 256; Y = Y + results[4]; writeString_P("XY: "); writeLong(X, DEC); writeChar(' '); writeLong(Y, DEC); writeString_P(" \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); setLEDs(0b111111); mSleep(500); setLEDs(0b000000); powerON(); startStopwatch1(); while(true) { task_HDMM01(); task_I2CTWI(); task_RP6System(); } return 0; } /****************************************************************************** * Additional info * **************************************************************************** * Changelog: * - v. 1.0beta (initial release) 04.03.2012 by Dirk * * **************************************************************************** */ /*****************************************************************************/
Aber: Probier das doch erst einmal.







Zitieren

Lesezeichen