Go Down

Topic: Duda operadores y funciones ADXL345 (Read 99 times) previous topic - next topic

luisvc91

Hola,

Tengo algunas preguntas sobre operadores en arduino y sobre algunas funciones. Probablemente es por fallo de concepto de operadores y/o operaciones. He mirado el manual de arduino en la web, pero no doy con lo que es.
Esto pertenece al código de la libreria SparkFun_ADXL345.
Code: [Select]
void ADXL345::setRate(double rate){
byte _b,_s;
int v = (int) (rate / 6.25);
int r = 0;
while (v >>= 1)
{
r++;
}
if (r <= 9) {
readFrom(ADXL345_BW_RATE, 1, &_b);
_s = (byte) (r + 6) | (_b & B11110000);
writeTo(ADXL345_BW_RATE, _s);
}
}


1.- ¿"v >>= 1" que operación hace? Se que >> despalza los bits a la derecha... pero el igual me desconcierta
2.- ¿Realmente que hace la funcion? porque no entiendo porqué normaliza a 6.25 la variable "rate", luego se mete en un while... Después si la variable r (parece ser un contador de.... bits?) es menor o igual que 9, ejecuta el readFrom... despues hace la sentencia del _s (no entiendo nada de lo que se hace en esa línea de código) y por último lo que me itneresa, escribe en el registro "ADXL345_BW_RATE" el valor de _s... aunque a priori _s no se parece en nada al rate que yo he introducido...
3.-De igual manera, la funcion leer
Code: [Select]
double ADXL345::getRate(){
byte _b;
readFrom(ADXL345_BW_RATE, 1, &_b);
_b &= B00001111;
return (pow(2,((int) _b)-6)) * 6.25;
}

No entiendo porque hace esa operación matemática para mostrar el valor del registro en int...

Gracias

Un saludo

surbyte

Y te pregunto, has leido la hoja de datos del ADXL345, porque al leerla te aseguro que mucho de lo que preguntas se responde.

Yo no te voy a responder lo que consultas porque estas prenguntado sobre como esta hecha una librería y generalmente responden a como la Hoja de datos dice que el IC se comunica., entonces lo que lees es el resultado de interpretar la hoja de datos.

Esta respuesta que te doy es para que al menos tengas  una idea de donde posiblemente esten las respuestas que buscas.

luisvc91

Hola @surbyte,

Si, he leido el datasheet del ADXL345 y con el he conseguido entender todo lo que hace la libreria que estoy intentando usar.
Como la libreria no es mia, no entiendo algunas cosas y entiendo que tu tampoco a menos que la mires en detalle.
Te lo planteo de la siguiente manera a ver si puedo desatascar el lio que tengo. El siguiente codigo, que hace?
Code: [Select]

int v = 0;
v >>= 1

surbyte

#3
Jul 23, 2019, 03:42 pm Last Edit: Jul 23, 2019, 03:44 pm by surbyte
El siguiente codigo hace lo siguiente

obviamente pone a 0 la variable entera v.

Luego la idea planteada es similar a esta que tal vez te resulte mas fácil de ver

Code: [Select]
v += 1;

Si fuera +  el operador al valor anterior de v le incrementa 1, del mismo modo puedes hacer que multiplique divida, o desplace a izquierda o derecha una posicion como es tu caso. En tu caso desplaza a derecha.

Entonces al valor que tenga v lo desplaza a derecha 1 posicion.

0 >> 1 siempre será 0
1 >> 1 = 0
2 o 001 en binario >> 1 = 1
3 o 011 en binario >> 1 = 1
4 o 010 en binario >> 1 = 2
5 o 101 en binario >> 1 = 2
6 o 110 en binario >> 1 = 3

y asi podemos seguir

Go Up