10 de abril de 2011

Uso de máscaras en los temporizadores

En este ejemplo que vimos en clase, se configuraba el temporizador "T0" con un valor determinado. Nos fijaremos en las instrucciones: "TMOD |= 0x01 y TMOD &= 0xF1". En realidad fijan el modo de funcionamiento del temporizador (si es contador/temporizador, el número de bits, etc..) modificando las posiciones de bit del registro.

La cuestión es ¿por qué para ello hemos utilizado dos operaciones?


Cuando aplicamos la primera operación "TMOD |= 0x01" hacemos una "OR" al registro "TMOD" y ponemos a "1" sólo el primer bit --> 0x01 = 00000001.

Lo importante es que al utilizar una "OR", sólo tocamos el bit donde hemos puesto "1s", por lo tanto los demás bits se quedan como estaban. La operación "OR" nos permite poner a "1" los bits que necesitemos manteniendo su estado anterior (sin tocar otros bits).

No hemos terminado de configurar el registro "TMOD", sólo hemos puesto los "1s". Ahora nos falta poner "0s" en otras posiciones de bit y para ello usaremo la operación "AND". De hecho la línea "TMOD &= 0xF1" pone a cero tres posiciones del registro --> 0xF1 = 11110001, dejando los demás bits sin tocar.

Como resumen, cuando queramos poner "1s" y "0s" en un registro, manteniendo los valores anteriores, debemos usar las máscaras y además hacerlo en dos pasos (OR para poner a "1" y AND para poner a "0").

Y queda la pregunta del millón, ¿por qué querríamos hacerlo de esta manera? pues porque quizá otro programa podría estar usando el temporizador "T1" y los bits que controlan su funcionamiento están también en el mismo registro "TMOD". Si no usáramos máscaras y lo hiciéramos en una sóla operación, estaríamos "machacando" los valores en los bits que controlan el otro temporizador y si se estuviera usando, podríamos alterar su funcionamiento. Sencillo ¿no?

No hay comentarios: