Vamos a programar #105 - Enmascaramiento y secuencias de bits - Camino a ClockView 3.0

Hola de nuevo a todos, el día de hoy vamos a ver como hacer uso del enmascaramiento y cómo ahorrar un poco de memoria para algunos tipos de variables.


 

 

Desde hace tiempo actualicé ClockView, si no sabes de lo que hablo, puedes darte una vuelta por el post de la versión dos.

Desde el principio planee poner una serie de alarmas muy similares a las de un reloj casio que tengo, este tiene la particularidad de que se puede establecer por fecha: es decir, si queremos que suene el tres de julio, eso hará; por mes: es decir, si establecemos solo el mes, sonará todos los días de octubre (por solo decir una fecha); por año: la alarma sonará todos los días del año. Además se podía establecer para que la alarma sonara ciertos días de la semana, está función me es realmente útil, ya que normalmente solo algunos días de la semana requiero de la alarma (aunque ya no tanto, creo que llegué a la edad en que le gano al despertador).

 


Si recordamos la versión anterior de clock view, este, carecía de una función de alarma, pero el modulo de reloj en tiempo real DS1302, además de llevar la cuenta del tiempo, posee la capacidad de llevar los días de la semana. Para poder guardar los datos de los días de la semana en los cuales queremos que la alarma suene, vamos a usar un solo byte.

Para eso, podemos estructurar los días de la semana cómo se muestra en la siguiente imagen:

Oportunamente para nosotros, la semana consta de siete días, y cada byte consta de ocho bits, con lo que podemos asignar un valor cómo se muestra en la imagen anterior. Pero mas que su valor numérico, debemos de ver cómo es su representación en binario.

 


Pero ahora que hemos asignado un valor a cada día de la semana ¿cómo debemos de usarlos? Antes de entrar esos detalles, supongamos que queremos que la alarma suene los días: domingo, jueves y sábado, deberíamos de hacer algo cómo lo que sigue:

  • Tomar el valor del primer día deseado.
  • Tomar el valor del segundo día deseado
  • Aplicar el operador "or" a ambos números y asignarlos a una variable.
  • Si se desean agregar mas días, al valor anterior se le aplica de nuevo el operador "or" junto con el día a agregar

Si lo convertimos a código en c, quedaría algo cómo lo que sigue:

uint8_t BuildTheDaysOfAlarms(uint8_t TheDay1, uint8_t TheDay2)
{
  return TheDay1|TheDay2;
}

Entonces los días que queremos usar en la alarma quedarían cómo:

  • 00000001 or 00100000 or 01000000 = 01010001.
  • que es igual en decimal a: 1 or 16 or 64 = 81.
¨Para probar si el día de hoy está dentro del rango marcado, bastará con aplicar la operación "and" entre los días a usar y el día de hoy, si el resultado es cualquier valor diferente a cero, quiere decir que el valor del día está en el rango. Para entender mejor lo que pasa, tomado como ejemplo que hoy es sábado y la alarma debería de sonar solo de lunes a viernes, tenemos:

  • Lunes a viernes = 00111110 = 62.
  • Sábado = 01000000 = 64
  • 62 and 64 = 0.
  • El día no está en el rango.
Ahora veamos otro ejemplo donde es miércoles y la alarma está ajustada para que suene lunes, martes y miércoles;
  • Lunes, miércoles y viernes = 00101010 = 42.
  • Miércoles = 00001000 = 8
  • 42 and 8 = 8
  • El día está en el rango.
La ventaja que hay al utilizar secuencias de bits, es sencilla, ya que estamos almacenando información en poca memoria (que en arduino es importante), pero además las operaciones cómo "or" o "and" normalmente requieren un solo ciclo del CPU para realizarse, con lo que se agrega velocidad al programa.

Y bien, por ahora es todo, en las próximas semanas, voy a ir liberando detalles del clock view para finalmente llegar a la versión tres que ya tengo lista desde hace algún tiempo, pero por una o por otra cuestión, no he podido liberar.

Los leo luego.


No hay comentarios.