ayuda con un programa burbuja del 8051
PROGRAMACIÓN DEL 8051
Realizar los dos siguientes programas en ensamblador del 8051:
1.- Se tiene una tabla 1 (bloque de números BCD de dos dÃgitos, 1 byte) en la memoria RAM. La dirección inicial de la tabla 1 se encuentra en la localidad 18F0H y la dirección final en la localidad 18F2H. Se pide un programa en el cual haga tres cosas:
a) Crear una subrutina 1 que pase todos los datos BCD que estén en la tabla 1, a una tabla 2 (que tú crearás y cuya dirección inicial es 1900H), convertidos a BINARIO.
b) El programa principal deberá agregar un checksum (el complemento a dos de la suma de N bytes en binario, despreciando los acarreos) al final de la tabla 2 (descrita en el inciso "a").
c) Al comenzar la subrutina uno antes de la conversión, hay que verificar si el número a convertir es diferente de cero. Si lo es, entonces convierte el número BCD a BINARIO y escrÃbelo en la tabla 2. Pero si no lo es, es decir si es cero, llama a una subrutina 2 (anidada dentro de la 1), la cual deberá borrar el cero de la tabla 1, recorrer la lista y actualizar la longitud de la misma COMPRIMIENDOLA, de tal forma que al final del programa la tabla 1, NO contenga ningún cero.
Es necesario remarcar que la eliminación de ceros y la conversión de datos debe ser en paralelo.
NOTAS:
1) Por lo anterior, el programa deberá consistir en un programa principal (el que calcula y escribe el checksum al final de la tabla 2), una subrutina 1 (que convierta los números en la tabla 1 de BCD a BINARIO a escribirse en la tabla 2) y una subrutina 2 (que elimine de la tabla 1 los ceros y la comprima).
2) Se debe anidar forzosamente la subrutina 2 dentro de la 1, es decir, no se puede en un primer momento eliminar los ceros de la tabla 1 y después convertir, sino que la conversión de BCD a BINARIO y la eliminación de ceros y por ende la compresión de la tabla 1, deben ser en paralelo.
3) Cualquier transferencia de datos entre las subrutinas o el programa principal, sólo se podrá hacer a través de la pila, NO se vale utilizar ningún registro.
4) El programa deberá estar codificado a partir de la 1800H.
5) La pila deberá estar en la dirección 3FH
6) La longitud del bloque no excede de 256 bytes.
7) La tabla 1 puede tener una cadena de varios ceros consecutivos.
2.- Hacer un programa para generar por un pin de un puerto, una señal que represente tiempos de espera en múltiplos de 100 us de la manera más exacta posible +/-2%. El programa recibirá como parámetros de entrada la Unidades Básicas de Espera UBE que puede tomar los siguientes valores “001b” = 100 us, “010b” = 1 ms, “100b” = 10 ms, y el Número de Unidades Básicas de Espera a generar (0<=NUBE<=255). Por ejemplo, si UBE = “001b” y NUBE = 4, la subrutina deberá generar 400 us de tiempo de espera o si UBE = 10 y NUBE = 4, la subrutina deberá generar 4 ms de tiempo de espera, etc. Los parámetros de entrada se introducirán por los puertos disponibles (8 bits para NUBE y 3 bits para UBE), de acuerdo al tiempo de espera deseado. Este programa deberá mostrarse funcionando con un osciloscopio para ver una señal cuadrada, con tiempo en bajo igual al tiempo de espera y tiempo en alto igual al tiempo en bajo.
El valor de UBE se introduce en decimal, si se activan dos valores de UBE simultáneamente, el programa le debe asignar prioridad a la entrada de mayor peso. El programa deberá muestrear continuamente los valores de NUBE Y UBE para que tan pronto se modifiquen la frecuencia de la señal de salida también cambie.
Realizar los dos siguientes programas en ensamblador del 8051:
1.- Se tiene una tabla 1 (bloque de números BCD de dos dÃgitos, 1 byte) en la memoria RAM. La dirección inicial de la tabla 1 se encuentra en la localidad 18F0H y la dirección final en la localidad 18F2H. Se pide un programa en el cual haga tres cosas:
a) Crear una subrutina 1 que pase todos los datos BCD que estén en la tabla 1, a una tabla 2 (que tú crearás y cuya dirección inicial es 1900H), convertidos a BINARIO.
b) El programa principal deberá agregar un checksum (el complemento a dos de la suma de N bytes en binario, despreciando los acarreos) al final de la tabla 2 (descrita en el inciso "a").
c) Al comenzar la subrutina uno antes de la conversión, hay que verificar si el número a convertir es diferente de cero. Si lo es, entonces convierte el número BCD a BINARIO y escrÃbelo en la tabla 2. Pero si no lo es, es decir si es cero, llama a una subrutina 2 (anidada dentro de la 1), la cual deberá borrar el cero de la tabla 1, recorrer la lista y actualizar la longitud de la misma COMPRIMIENDOLA, de tal forma que al final del programa la tabla 1, NO contenga ningún cero.
Es necesario remarcar que la eliminación de ceros y la conversión de datos debe ser en paralelo.
NOTAS:
1) Por lo anterior, el programa deberá consistir en un programa principal (el que calcula y escribe el checksum al final de la tabla 2), una subrutina 1 (que convierta los números en la tabla 1 de BCD a BINARIO a escribirse en la tabla 2) y una subrutina 2 (que elimine de la tabla 1 los ceros y la comprima).
2) Se debe anidar forzosamente la subrutina 2 dentro de la 1, es decir, no se puede en un primer momento eliminar los ceros de la tabla 1 y después convertir, sino que la conversión de BCD a BINARIO y la eliminación de ceros y por ende la compresión de la tabla 1, deben ser en paralelo.
3) Cualquier transferencia de datos entre las subrutinas o el programa principal, sólo se podrá hacer a través de la pila, NO se vale utilizar ningún registro.
4) El programa deberá estar codificado a partir de la 1800H.
5) La pila deberá estar en la dirección 3FH
6) La longitud del bloque no excede de 256 bytes.
7) La tabla 1 puede tener una cadena de varios ceros consecutivos.
2.- Hacer un programa para generar por un pin de un puerto, una señal que represente tiempos de espera en múltiplos de 100 us de la manera más exacta posible +/-2%. El programa recibirá como parámetros de entrada la Unidades Básicas de Espera UBE que puede tomar los siguientes valores “001b” = 100 us, “010b” = 1 ms, “100b” = 10 ms, y el Número de Unidades Básicas de Espera a generar (0<=NUBE<=255). Por ejemplo, si UBE = “001b” y NUBE = 4, la subrutina deberá generar 400 us de tiempo de espera o si UBE = 10 y NUBE = 4, la subrutina deberá generar 4 ms de tiempo de espera, etc. Los parámetros de entrada se introducirán por los puertos disponibles (8 bits para NUBE y 3 bits para UBE), de acuerdo al tiempo de espera deseado. Este programa deberá mostrarse funcionando con un osciloscopio para ver una señal cuadrada, con tiempo en bajo igual al tiempo de espera y tiempo en alto igual al tiempo en bajo.
El valor de UBE se introduce en decimal, si se activan dos valores de UBE simultáneamente, el programa le debe asignar prioridad a la entrada de mayor peso. El programa deberá muestrear continuamente los valores de NUBE Y UBE para que tan pronto se modifiquen la frecuencia de la señal de salida también cambie.
