boeser_bube
21.11.2008, 00:32
Hallo,
ich verwende den Code von RN (https://www.roboternetz.de/wissen/index.php/SRF08_mit_avr-gcc) um mit dem Sensor zu kommunizieren.
Nun habe ich ihn leicht geändert, um die Werte im ANN-Modus zu bekommen:
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 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:
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();
}
}
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:
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();
}
}
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.
Ich bin nun schon sehr lange am rum rätsel und hoffe ihr könnt mir helfen.
ich verwende den Code von RN (https://www.roboternetz.de/wissen/index.php/SRF08_mit_avr-gcc) um mit dem Sensor zu kommunizieren.
Nun habe ich ihn leicht geändert, um die Werte im ANN-Modus zu bekommen:
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 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:
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();
}
}
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:
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();
}
}
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.
Ich bin nun schon sehr lange am rum rätsel und hoffe ihr könnt mir helfen.