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.
- Lunes a viernes = 00111110 = 62.
- Sábado = 01000000 = 64
- 62 and 64 = 0.
- El día no está en el rango.
- Lunes, miércoles y viernes = 00101010 = 42.
- Miércoles = 00001000 = 8
- 42 and 8 = 8
- El día está en el rango.
No hay comentarios.