Hallo,
ich verwende den Code von RN (https://www.roboternetz.de/wissen/in...08_mit_avr-gcc) um mit dem Sensor zu kommunizieren.
Nun habe ich ihn leicht geändert, um die Werte im ANN-Modus zu bekommen:
Wenn ich die Daten auslesen möchte, bekomme ich mit diesem Code zwar die richtigen Werte vom Register 0x02 und 0x03, jedoch die "ANN"-Werte ab (einschließlich) Register 0x04 sind immer 0xFF. Egal wie nah das Objekt ist:Code:void SRF08_messung_starten(void)
{
if(srf08_ready())
{
i2c_start(SRF08_adress+I2C_WRITE);
i2c_write(0x01);//Gainregister
i2c_write(SRF08_gainvalue);//Gain setzen
i2c_write(SRF08_rangevalue);
i2c_rep_start(SRF08_adress+I2C_WRITE);
i2c_write(0x00);//Befehlsregister wählen
i2c_write(0x54);//Messung (ANN) starten, Ergebnis in cm
i2c_stop();
}
}
Wenn ich nachfolgenden Code verwende, bekomme ich zwar (beim ersten Durchlauf) die richtigen Werte, jedoch macht der Sensor keine weitere Messungen mehr bis der Mikrocontroller resetet wurde:Code:void srf08_auslesen(void)
{
if(srf08_ready())
{
i2c_start(SRF08_adress+I2C_WRITE);
i2c_write(0x01);//Ergebnisregister Lichtsensor wählen
i2c_rep_start(SRF08_adress+I2C_READ);
SRF08_light= i2c_readAck();
SRF08_messwert = ((i2c_readAck())<<8); //highbyte
SRF08_messwert += (i2c_readNak()); //lowbyte
SRF08_ANN_value[0] = i2c_readAck(); // reg 0x04 !!! hier steht leider immer 0xFF. Auch wenn der Abstand < 35cm ist
SRF08_ANN_value[1] = i2c_readAck(); // reg 0x05
SRF08_ANN_value[2] = i2c_readAck(); // reg 0x06
SRF08_ANN_value[3] = i2c_readAck(); // reg 0x07
SRF08_ANN_value[4] = i2c_readAck(); // reg 0x08
SRF08_ANN_value[5] = i2c_readAck(); // reg 0x09
SRF08_ANN_value[6] = i2c_readAck(); // reg 0x10
SRF08_ANN_value[7] = i2c_readAck(); // reg 0x11
SRF08_ANN_value[8] = i2c_readAck(); // reg 0x12
SRF08_ANN_value[9] = i2c_readAck(); // reg 0x13
SRF08_ANN_value[10] = i2c_readAck();// reg 0x14
SRF08_ANN_value[11] = i2c_readAck();// reg 0x15
SRF08_ANN_value[12] = i2c_readAck();// reg 0x16
SRF08_ANN_value[13] = i2c_readAck();// reg 0x17
SRF08_ANN_value[14] = i2c_readAck();// reg 0x18
SRF08_ANN_value[15] = i2c_readAck();// reg 0x19
SRF08_ANN_value[16] = i2c_readAck();// reg 0x20
SRF08_ANN_value[17] = i2c_readAck();// reg 0x21
i2c_stop();
}
}
Was ich nicht verstehe ist, dass die beiden Varianten eigentlich die absolut gleichen Ergebnisse liefern müssten. Keine von beide ist für eine durchgehende Messung verwendbar.Code:void srf08_auslesen(void)
{
if(srf08_ready())
{
i2c_start(SRF08_adress+I2C_WRITE);
i2c_write(0x01);//Ergebnisregister Lichtsensor wählen
i2c_rep_start(SRF08_adress+I2C_READ);
SRF08_light= i2c_readAck();
// SRF08_messwert = ((i2c_readAck())<<8); //highbyte // auskommentiert
// SRF08_messwert += (i2c_readNak()); //lowbyte // auskommentiert
SRF08_ANN_value[0] = i2c_readAck(); // reg 0x02 !!! hier steht das highbyte
SRF08_ANN_value[1] = i2c_readAck(); // reg 0x03 !!! hier steht das lowbyte
SRF08_ANN_value[2] = i2c_readAck(); // reg 0x04 !!! hier steht richtiger weise 0, wenn Abstand < 35cm ist
SRF08_ANN_value[3] = i2c_readAck(); // reg 0x05
SRF08_ANN_value[4] = i2c_readAck(); // reg 0x06
SRF08_ANN_value[5] = i2c_readAck(); // reg 0x07
SRF08_ANN_value[6] = i2c_readAck(); // reg 0x08
SRF08_ANN_value[7] = i2c_readAck(); // reg 0x09
SRF08_ANN_value[8] = i2c_readAck(); // reg 0x10
SRF08_ANN_value[9] = i2c_readAck(); // reg 0x11
SRF08_ANN_value[10] = i2c_readAck();// reg 0x12
SRF08_ANN_value[11] = i2c_readAck();// reg 0x13
SRF08_ANN_value[12] = i2c_readAck();// reg 0x14
SRF08_ANN_value[13] = i2c_readAck();// reg 0x15
SRF08_ANN_value[14] = i2c_readAck();// reg 0x16
SRF08_ANN_value[15] = i2c_readAck();// reg 0x17
SRF08_ANN_value[16] = i2c_readAck();// reg 0x18
SRF08_ANN_value[17] = i2c_readAck();// reg 0x19
i2c_stop();
}
}
Ich bin nun schon sehr lange am rum rätsel und hoffe ihr könnt mir helfen.