TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Iria en 14 de Junio de 2009, 11:47:12
-
tengo otra duda.... :( :( :( :( :(
si tengo un teclado con 16 teclas independientes, como 16 pulsadores conectados al micro, y quiero transmitir a traves del canal serie el nº de decenas y el nº de unidades que representa cada tecla..... como puedo hacer ?¿?¿?¿?¿?¿? porque un 00000001 en P4 no representa el 00 que quiero transmitir a través del canal serie; supongo que habrá que hacer una tabla con las combinaciones del puerto y el numero que quieres transmitir o algo, pero no se como hacerla; como actualizar los punteros etc.....
espero que alguien me ayude por favor :( :( :( :( :(
Muchas gracias
-
Si coges los 16bits como si fueran un valor y le haces el logaritmo en base2 tendrás un número que va de 0 a 15. Pero computar un log2 probablemente te lleve más ciclos que hacer algo así:
salida=0;
while(entrada!=1)
{
entrada=entrada/2;
salida++;
}
Lo que básicamente va dividiendo entre 2 hasta reducir el número a 1. El valor de salida son las divisiones que han sido necesarias: ejemplo, al pulsar la tecla más alta (1000000000000000=32768) necesitas hacer 15 divisiones consecutivas para obtener un 1. Creo que es mucho más optimo, pues en asm las divisiones entre 2 se pueden hacer desplazando 1 bit hacia la derecha...
-
gracias por contestarme tan pronto :)
entiendo lo que quieres decir, pero mi micro (SA80C537 de intel) solo tiene una instrucción de división, que es DIV AB, donde A y B son de 8bits..... guarda el cociente en A y el resto en B
-
Pues coges primero los 8 bits menos significativos, compruebas si ese byte es mayor que cero, y si lo es haces la operación anterior. El numero de divisiones será tu resultado.
Si el byte formado por los 8bits menos significativos es 0, coges los 8 más significativos, haces la misma operación y al resultado le sumas 8.
Entiendo que estás programandolo en ensamblador. Si es así tienes que tener una instrucción para realizar desplazamientos, revisa tu documentación, creo que desplazar a la derecha (dividir) era SAR. Sino usa DIV... pero seguramente consuma más ciclos de ejecución.
-
De acuerdo, entiendo; puedo ir desplazando los bits a la derecha por ejemplo y contar el numero de desplazamientos hasta que el primer bit se ponga a 1.
Muchas gracias por todo lo que me has dicho, me has sido de gran ayuda :) :) :) :) :)
-
Exacto, ya que una división entre 2 no es más que desplazar una posición hacia la derecha :)
Al final lo hice más complicado de lo que era :D