Scooter
Cascarrabias crónico
En el 8052 que es el que mejor conozco se puede usar el bit de carry como "acumulador de 1 bit" y hacer transferencias etc bit a bit a las posiciones de memoria direccionables por bit que creo recordar que son 128, los otros 128 se reservan para registros de la uart, timers etc que también se pueden pilotar por bit.
Así puedo leer un pin de un puerto, moverlo al carry y guardarlo en un bit de memoria interna con dos instrucciones sin necesidad de emplear máscaras ni nada:
mov c,pin ; El valor del pin del puerto se copia al carry
mov variable,c ; el valor del carry se copia al bit de la memoria interna
y ya está.
Si otro micro no puede hacer esas operaciones directamente; tengo que leer el puerto, extraer el bit con una máscara y guardarlo con otra, tiene mas sentido usar variables de tamaño byte. Algo así, suponiendo que el bit donde almaceno la variable no está en la misma posición en la que lo leo:
pseudocódigo:
mov a,puerto ; leo los 8 bits del puerto
and a,00000100 ;leo el bit que me interesa
si es 1 ; compruebo si es 0 o 1
or memoria, 1000000 ; si es 1 activo un bi de la memoria
Si es 0 ; y si no lo es
and memoria,01111111 ; borro un bit de la memoria
Lo cual lleva a 6 instrucciones, con un condicional o dos y bastantes líos. Eso podría suponer que mejor guardar un byte entero aunque solo se use un bit.
Quedarían tres instrucciones:
mueve a acumulador el puerto
and acumulador con 0000000100
guarda acumulador en memoria
De todos modos en el 8052 las variables de bit se agotan rápido así que "hay que cuidarlas"
En cualquier otro compilador, como siempre, hay que leer los detalles del compilador, y si por defecto INT son 16 bits pues ya lo sabemos y actuamos en consecuencia. Otros compiladores de C que conozco por defecto INT son 8 bits. El motivo; pues el que programó el compilador sabrá por que
Así puedo leer un pin de un puerto, moverlo al carry y guardarlo en un bit de memoria interna con dos instrucciones sin necesidad de emplear máscaras ni nada:
mov c,pin ; El valor del pin del puerto se copia al carry
mov variable,c ; el valor del carry se copia al bit de la memoria interna
y ya está.
Si otro micro no puede hacer esas operaciones directamente; tengo que leer el puerto, extraer el bit con una máscara y guardarlo con otra, tiene mas sentido usar variables de tamaño byte. Algo así, suponiendo que el bit donde almaceno la variable no está en la misma posición en la que lo leo:
pseudocódigo:
mov a,puerto ; leo los 8 bits del puerto
and a,00000100 ;leo el bit que me interesa
si es 1 ; compruebo si es 0 o 1
or memoria, 1000000 ; si es 1 activo un bi de la memoria
Si es 0 ; y si no lo es
and memoria,01111111 ; borro un bit de la memoria
Lo cual lleva a 6 instrucciones, con un condicional o dos y bastantes líos. Eso podría suponer que mejor guardar un byte entero aunque solo se use un bit.
Quedarían tres instrucciones:
mueve a acumulador el puerto
and acumulador con 0000000100
guarda acumulador en memoria
De todos modos en el 8052 las variables de bit se agotan rápido así que "hay que cuidarlas"
En cualquier otro compilador, como siempre, hay que leer los detalles del compilador, y si por defecto INT son 16 bits pues ya lo sabemos y actuamos en consecuencia. Otros compiladores de C que conozco por defecto INT son 8 bits. El motivo; pues el que programó el compilador sabrá por que