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) == 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:
	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 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
						
					
Lesezeichen