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.
Verwendet wird ein Atmega644P
PHP-Code:
/Initalisierung abgeschlossen

while(1)
{
    if((
timer%SPA) == && !isschon)
    {
        
isschon 1// Nur einmal auslesen
        
uart_puts("Zeit: ");
        
uart_int(timer/100);
        
int16_t xwh i2c_readregister(ACC_ADDRESSLSM303_OUT_X_H_A); // High Byte auslesen
        
int16_t xwl i2c_readregister(ACC_ADDRESSLSM303_OUT_X_L_A); // Low Byte auslesen
        
int16_t schieb = (xwh<<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== && 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:
Code:
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:
Code:
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: -504
Irgendetwas 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, außer die:
PHP-Code:
uint8_t i2c_readregister(uint8_t addressuint8_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 addressuint8_t reguint8_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(integerbuffer10);
    
uart_puts(buffer);

Wo liegt also der Fehler? Hoffe ihr könnt mir helfen. Braucht ihr noch Informationen, poste ich diese.
Gruß
boecki