PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C LSM303 auslesen



boecki91
24.02.2012, 12:03
Hallo,

ich habe ein sehr merkwürdiges Problem mit einem LSM303 (Beschleunigung und Magnetfeldsensor). Weis auch nicht genau wie ich es beschreiben soll.
Lasse ich eine If drin, funktioniert es, entferne ich sie, funktioniert das Auslesen des Wertes nicht mehr.:confused:
Verwendet wird ein Atmega644P

/Initalisierung abgeschlossen

while(1)
{
if((timer%SPA) == 0 && !isschon)
{
isschon = 1; // Nur einmal auslesen
uart_puts("Zeit: ");
uart_int(timer/100);
int16_t xwh = i2c_readregister(ACC_ADDRESS, LSM303_OUT_X_H_A); // High Byte auslesen
int16_t xwl = i2c_readregister(ACC_ADDRESS, LSM303_OUT_X_L_A); // Low Byte auslesen
int16_t schieb = (xwh<<8 | xwl)>>4; // Auflösung beträgt 12 Bit, also muss etwas rumgeschoben werden
uart_puts("\r\n X: ");
uart_int(schieb); // Integer ausgeben
if(timer/100 %10== 0 && 1) // Alle 10 Sek. alles ausgeben (&& 1 siehe unten)
{
uart_puts("\r\n XH: ");
uart_int(xwh); // Ausgabe Highbyte
uart_puts("\r\n XL: ");
uart_int(xwl); // Ausgabe Lowbyte
}
uart_puts_P("\r\n\r\n");

}
if((timer%SPA) == 1)
{
isschon = 0;
}
timer++; // Krücke weil wegen Fehlersuche Timer-Interrupt deaktiviert
_delay_ms(10);
}Wenn ich im Code oben in der if && 1 in && 0 ändere (der Compiler dürfte es erkennen und nimmts dann weg) werden mir vollkommen wilde Werte angezeigt.
Hier mal ein Log mit if:

Zeit: 0
X: 898
XH: 56
XL: 32

Zeit: 1
X: 903

...Sensor steht nicht ganz auf der X Achse, 1000 = 1g, somit dürfte das passen. Nun eins ohne If:
Zeit: 0
X: 219

Zeit: 1
X: 531

Zeit: 2
X: 861

Zeit: 3
X: 1169

Zeit: 4
X: 1514

Zeit: 5
X: 1850

Zeit: 6
X: -1916

Zeit: 7
X: -1556

Zeit: 8
X: -1204

Zeit: 9
X: -860

Zeit: 10
X: -504Irgendetwas zählt da wohl hoch, irgendwann overflow bei 2^11 -> einzige "12 bit" Variable ist schieb, nur die lese ich in beiden Varianten gleich aus, mit (fast) gleichem Timing und allem. Alle Funktionen sind aus Bibs von Peter Fleury (http://homepage.hispeed.ch/peterfleury/avr-software.html), außer die:


uint8_t i2c_readregister(uint8_t address, uint8_t reg)
{
i2c_rep_start(address+I2C_WRITE);
i2c_write(reg);
i2c_rep_start(address+I2C_READ);
uint8_t ret =i2c_readNak();
i2c_stop();
return ret;
}
void i2c_writeregister(uint8_t address, uint8_t reg, uint8_t data)
{
i2c_rep_start(address +I2C_WRITE);
i2c_write(reg);
i2c_write(data);
i2c_stop();
}
void uart_int(int16_t integer)
{
char buffer[10];
itoa(integer, buffer, 10);
uart_puts(buffer);
} Wo liegt also der Fehler? Hoffe ihr könnt mir helfen. Braucht ihr noch Informationen, poste ich diese.
Gruß
boecki