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
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