sábado, 26 de marzo de 2016

Introduccion a Lab VIEW

El software NI LabVIEW es un entorno de programación gráfica (G) que utiliza íconos, terminales y cables en lugar de texto para ayudarle a programar de la misma manera en que usted piensa. Tal como aprender cualquier software de programación nuevo, aprender cómo programar en LabVIEW requiere saber cómo navegar en el entorno. El siguiente módulo explora las potentes herramientas y características en LabVIEW.

Instrumentos Virtuales (VIs)

Los programas de LabVIEW son llamados instrumentos virtuales o VIs ya que su apariencia y operación imitan a los instrumentos físicos, como osciloscopios y multímetros. LabVIEW contiene una extensa variedad de herramientas para adquirir, analizar, visualizar y almacenar datos, así como herramientas para ayudarle a solucionar problemas en el código que escriba.
Cuando crea un nuevo VI, ve dos ventanas: la ventana del panel frontal y el diagrama de bloques.
Panel Frontal
Cuando abre un VI nuevo o existente, aparece la ventana del panel frontal del VI. La ventana del panel frontal es lainterfaz de usuario para el VI. La Figura 1 muestra un ejemplo de una ventana del panel frontal.

Figura 1.Ventana del Panel Frontal, Barras de Herramientas y Paleta de Controles


Paleta de Controles

La paleta de Controles contiene los controles e indicadores que utiliza para crear el panel frontal. Puede tener acceso a la paleta de Controles de la ventana del panel frontal al seleccionar View»Controls Palette o al dar clic con botón derecho en cualquier espacio en blanco en la ventana del panel frontal. La paleta de Controles está dividida en varias categorías; puede exponer algunas o todas estas categorías para cumplir con sus necesidades. La Figura 2 muestra la paleta de Controles con todas las categorías expuestas y la categoría Moderna expandida.
vacío
Figura 2.  Paleta de Controles
Para ver o esconder las categorías (subpaletas), seleccione el botón View en la paleta y seleccione o anule la selección en la opción Always Visible Categories.
Controles e Indicadores
Usted crea el panel frontal con controladores e indicadores, los cuales son las terminales interactivas de entrada y salida del VI, respectivamente. Los controles pueden ser perillas, botones, barras deslizantes y otros dispositivos de entrada. Los indicadores son gráficas, LEDs y otras pantallas. Los controles simulan dispositivos de entrada de instrumentos y suministran datos al diagrama de bloques del VI. Los indicadores simulan dispositivos de salida de instrumentos y muestran los datos que el diagrama de bloques adquiere o genera.
Figura 1. tiene dos controles: Number of Measurements and Delay (sec). Tiene un indicador: una gráfica XY llamada Temperature Graph.
El usuario puede cambiar el valor de entrada para los controles Number of Measurements and Delay (sec). El usuario puede ver el valor generado por el VI en el indicador Temperature Graph. El VI genera los valores para los indicadores basados en el código creado en el diagrama de bloques.
Cada control o indicador tiene un tipo de datos asociado con él. Por ejemplo, el slide horizontal Delay (sec) es un tipo de datos numérico. Los tipos de datos utilizados con mayor frecuencia son numéricos, valor Booleano y cadena de caracteres.
Controles e Indicadores Numéricos
El tipo de datos numérico pueden representar números de varios tipos como un entero o real. Los dos objetos numéricos comunes son el control numérico y el indicador numérico, como se muestra en la Figura 3. Los objetos como medidores y perillas también representan datos numéricos.
vacío
Figura 3. Incremento/Reducción de Control Numérico, Control, Indicador
Para proporcionar o cambiar valores en un control numérico, haga clic en el botón de incremento y reducción o haga doble clic en el número, introduzca un nuevo número y presione la tecla <Enter>.
Controles e Indicadores Booleano
El tipo de datos Booleano representa datos que solamente tienen dos estados posibles, como TRUE y FALSE u ON y OFF. Use los controles e indicadores Booleano para proporcionar y visualizar valores Booleano. Los objetos Booleano simulan interruptores, botones y LEDs. El interruptor de encendido vertical y los objetos LED redondos se muestran en la  Figura 4.



vacío
Figura 4. Controles e Indicadores Booleano

Controles e Indicadores de Cadena de Caracteres
El tipo de datos cadena de caracteres es una secuencia de caracteres ASCII. Use controles en cadena para recibir texto del usuario como una contraseña o nombre de usuario. Use indicadores en cadena para mostrar texto al usuario. Los objetos en cadena más comunes son tablas y cuadros de texto, como se muestra en la Figura 5.

vacío
Figura 5. Controles e Indicadores de Cadena de Caracteres

Diagrama de Bloques
Los objetos del diagrama de bloques incluyen terminales, subVIs, funciones, constantes, estructuras y cables, los cuales transfieren datos junto con otros objetos del diagrama de bloques.

Figura 6. Terminales de Indicador, Cables, Nodos, Terminales de Control

Ventana del Diagrama de Bloques
Después de crear la ventana del panel frontal, añada código usando representaciones gráficas de funciones para controlar los objetos del panel frontal. La ventana del diagrama de bloques contiene este código de fuente gráfica.

Figura 7. Diagrama de Bloques

Terminales de Diagrama de Bloques
Los objetos en la ventana del panel frontal aparecen como terminales en el diagrama de bloques. Las terminales son puertos de entrada y salida que intercambian información entre el panel frontal y diagrama de bloques. Las terminales son análogos a parámetros y constantes en lenguajes de programación basados en texto. 
Los tipos de terminales incluyen terminales de control o indicador y terminales de nodo. Las terminales de control e indicador pertenecen a los controles e indicadores del panel frontal. Los datos que usted proporciona en los controles del panel frontal (a y b en el panel frontal anterior) pasan al diagrama de bloques a través de las terminales de control. Entonces los datos ingresan las funciones de Suma y Resta. Cuando las funciones de Suma y Resta terminan sus cálculos, producen nuevos valores de datos. Los valores de datos van a las terminales de indicador, donde actualizan los indicadores del panel frontal (a+b y a-b en el panel frontal anterior).
Controles, Indicadores y Constantes
Los controles, indicadores y constantes se comportan como entradas y salidas del algoritmo del diagrama de bloques. Considere la implementación del algoritmo para el área de un triángulo:
Área = .5 * Base * Altura
En este algoritmo, Base y Altura son entradas y Área es una salida, como se muestra en la Figura 8.

Figura 8. Panel Frontal del Área de un Triángulo


El usuario no cambiará o tendrá acceso a la constante .5, así que no aparecerá en el panel frontal a menos que se incluya como documentación del algoritmo.

La Figura 9  muestra una posible implementación de este algoritmo en un diagrama de bloques de LabVIEW. Este diagrama de bloques tiene cuatro terminales diferentes creadas por dos controles, una constante y un indicador.

Figura 9. Control, Indicador y Constante


Note que las terminales del diagrama de bloques Base (cm) y Altura (cm) tienen una apariencia diferente de la terminal Área (cm2). Existen dos características distintivas entre un control y un indicador en el diagrama de bloques. La primera es una flecha en la terminal que indica la dirección del flujo de datos. Los controles tienen flechas que muestran los datos que salen de la terminal, mientras que el indicador tiene una flecha que muestra los datos que entran a la terminal. La segunda característica distintiva es el borde alrededor de la terminal. Los controles tienen un borde grueso y los indicadores tienen un borde delgado.

Puede ver terminales con o sin vista de íconos. La Figura 10 muestra el mismo diagrama de bloques sin usar la vista de ícono de las terminales; sin embargo existen las mismas características distintivas entre los controles y los indicadores.

Figura 10. Diagrama de Bloques del Área de un Triángulo sin Vista de Terminal de Ícono

Nodos de Diagrama de Bloques
Los nodos son objetos en el diagrama de bloques que tienen entradas y/o salidas y realizan operaciones cuando el VI se ejecuta. Son análogos a instrucciones, operaciones, funciones y sub rutinas en lenguajes de programación basados en texto. Los nodos pueden ser funciones, subVIs o estructuras. Las estructuras son elementos de control de procesos, como Estructuras de Casos, Ciclos For o Ciclos While. Las funciones de Suma y Resta en la Figura 6 son nodos de función.
Funciones
Las funciones son los elementos de operación fundamentales de LabVIEW. No tienen ventanas del panel frontal o ventanas del diagrama de bloques pero no tienen paneles conectores. Al hacer doble clic en la función solamente selecciona la función. Una función tiene un fondo amarillo pálido en su ícono.
SubVIs
Los subVIs son VIs que usted crea para usar dentro de otro VI o que usted tiene acceso en la paleta de Funciones. Un subVI es similar a una función en un lenguaje de programación basado en texto.
Cualquier VI tiene el potencial para ser usado como un subVI. Cuando hace doble clic en un subVI en el diagrama de bloques, aparece la ventana del panel frontal. El panel frontal incluye controles e indicadores. El diagrama de bloques incluye cables, íconos, funciones, subVIs probables u otros objetos de LabVIEW.

Cada VI muestra un ícono en la esquina superior derecha de la ventana del panel frontal y la ventana del diagrama de bloques. Un ejemplo del ícono predeterminado se muestra arriba. Un ícono es una representación gráfica de un VI. El ícono puede contener texto e imágenes. Si usa un VI como un subVI, el ícono identifica al subVI en el diagrama de bloques del VI. El ícono predeterminado contiene un número que indica cuántos nuevos VI abrió después de iniciar LabVIEW.

Para usar un VI como un subVI, necesita construir un panel conector, como se muestra arriba. El panel conector es un conjunto de terminales en el ícono que corresponde a los controles e indicadores de ese VI, similares a la lista de parámetros de una función llamada en lenguajes de programación basados en texto. Obtenga acceso al panel conector al dar clic con botón derecho en el ícono en la parte superior derecha de la ventana del panel frontal. Usted puede tener acceso al panel conector desde el ícono en la ventana del diagrama de bloques.
Los subVIs también pueden ser Express VIs. Los Express VIs son nodos que requieren cableado mínimo ya que usted los configura con ventanas de diálogo. Use Express VIs para tareas de medidas comunes. Puede guardar la configuración de un Express VI como un subVI. Consulte el tema de Express VI de LabVIEW Help para más información sobre crear un subVI desde una configuración de Express VI.
LabVIEW utiliza los íconos de colores para distinguir entre Express VIs y otros VIs en el diagrama de bloques. Los íconos para Express VIs aparecen en el diagrama de bloques como íconos rodeados por un campo azul en tanto que los íconos de subVIs tienen un campo amarillo. 
Paleta de Funciones
La paleta de Funciones contiene los VIs, funciones y constantes que usted utiliza para crear el diagrama de bloques. Usted tiene acceso a la paleta de Funciones del diagrama de bloques al seleccionar View»Functions Palette. La paleta está dividida en varias categorías; usted puede mostrar y esconder categorías para cumplir con sus necesidades. La Figura 11 muestra la paleta de Funciones con todas las categorías expuestas y la categoría de Programación expandida.


Figura 11. Paleta de Funciones


Para ver o esconder categorías, haga clic en el botón View en la paleta y seleccione o anule la selección en la opción Change Visible Categories.

Buscar Controles, VIs y Funciones
Cuando usted selecciona View»Controls o View»Functions para abrir las paletas Controles y Funciones, aparecen dos botones en la parte superior de la paleta.

El botón Search cambia la paleta para el modo buscar, así usted puede realizar búsquedas basadas en texto para ubicar los controles, VIs o funciones en las paletas. Mientras una paleta está en modo de búsqueda, haga clic en el botón Return para salir del modo de búsqueda y regresar a la paleta.

El botón Customize proporciona opciones para seleccionar un formato para la paleta actual, mostrar y esconder categorías para todas las paletas y clasificar alfabéticamente elementos en los formatos de Texto y Árbol. Seleccione Options del menú de acceso directo para mostrar la página de paletas Controls/Functions de la ventana de diálogo Options, en la cual puede seleccionar un formato para todas las paletas. Este botón aparece solamente si hace clic en la tachuela en la esquina superior izquierda para prender la paleta.
Hasta que se familiarice con la ubicación de los VIs y funciones, busque la función o VI usando el botón Search. Por ejemplo, si desea encontrar la función Random Number, haga clic en el botón Search en la barra de herramientas de la paleta de Funciones y comience a escribir Random Number en la ventana de diálogo en la parte superior de la paleta. LabVIEW enlista todos los elementos parecidos que comienzan con o contienen el texto que escribió. Puede dar clic en alguno de los resultados de búsqueda y arrástrelo al diagrama de bloques, como se muestra en la Figura 12. Haga doble clic en le resultado de la búsqueda para identificar su ubicación en la paleta.

Figura 12. Buscar un Objeto en la Paleta de Funciones




Fuente de la información: National Instruments


martes, 15 de abril de 2014

Manejo de instrucciones básicas del procesador HCS12 de Freescale

Objetivo:
Hacer uso de las distintas instrucciones para el HCS12 en el programa code warrior, con el fin de aplicar y entender cada uno de ellos.
Material y Equipo:
Ø  Computadora personal
Ø  Programa: Code Warrior

Marco Teórico:
El procesador o CPU. Es el elemento más importante del microcontrolador y determina sus principales características, tanto a nivel hardware como software.
Se encarga de direccionar la memoria de instrucciones, recibir el código OP de la instrucción en curso, su decodificación y la ejecución de la operación que implica la instrucción, así como la búsqueda de los operandos y el almacenamiento del resultado. A continuación se explica de manera general como está formado un procesador. La función esencial de un procesador se describe en lo que se conoce como “ciclo de ejecución” consiste en 1.Traer una instrucción de la Memoria, 2. Decodificar la instrucción y 3. Ejecutar la instrucción, el ciclo continúa indefinidamente. El primer paso se realiza en varias etapas, puesto que tiene que acceder a la memoria para leer la instrucción, esto requiere enviar la dirección donde se encuentra la instrucción, las señales de lectura y selección de la memoria se envían mediante un grupo de señales que forman el bus de control.

Desarrollo:
Instrucciones de carga y almacenamiento.
Las instrucciones de carga copian el contenido de una localidad de memoria a un acumulador o registro, nótese que el contenido de la memoria no cambia debido a la operación de carga. En cambio las instrucciones de almacenamiento copian lo que se encuentra en un acumulador o registro del CPU a una localidad de memoria sin alterar el valor que se encuentre en el registro o acumulador del CPU.
Las instrucciones de carga se representan con las iniciales LD que quiere decir Load, la segunda parte del mnemónico depende del acumulador o registro que se esté utilizando, ya sea el acumulador A, B o los registros X, Y o SP (de los cuales SP no es recomendable usar si no se tiene suficiente experiencia programando) que se representan de la siguiente manera LDAA, LDAB, LDD, LDX, LDY, LDS.
Para tener un concepto más detallado a continuación se vera una tabla que muestra los códigos objetos que se generan para el acumulador A cuando se le carga el contenido de una localidad de memoria, nótese que este código varía dependiendo del modo de direccionamiento que se esté usando.
Para ejemplificar esto, veamos ahora como en el simulador de code warrior se representa el código objeto en los distintos acumuladores y registros.
Para las instrucciones de almacenamiento al igual que las instrucciones de carga se reprecentan con un mnemónico, el cual inicia con ST y dependiendo del acumulador o registro es la terminación de este, las cuales son STAA, STAB, STD, STX, STY, STS (del cual no se recomienda usar el STS sin alta experiencia como  programador). Como demostración a continuación se mostrara una tabla con los códigos objetos de almacenamiento para el acumulador A.
Si somos observadores notaremos que en diferencia con la tabla de carga, la de almacenamiento no se puede usar el modo de direccionamiento inmediato, ya que si hacemos uso del sentido común nos daremos cuenta que no se puede guardar a un valor desde un acumulador o registro, sino solamente a localidades de memoria.
Para ilustrar esto, se mostrara como se almaceno desde los registros a localidades de memoria:
Transferencia, intercambio y extensión de signo.
La instrucción de transferencia copia el contendió de un acumulador o registro a el contenido de otro acumulador  o registro. Se pueden hacer transferencias de A a B usando la instrucción TAB, ó de B a A usando la instrucción TBA. También hay una instrucción que podría decirse que es universal dentro de las instrucciones de transferencias, ya que no necesita un mnemónico relacionado con algún la letra de acumulador o registro, este mnemónico es TFR, capaz de transferir (copiar) de cualquier acumulador o registro a cualquier otro acumulador o registro no importando la cantidad de bits que se quieran transferir.
En comparación con las instrucciones de transferencia, la instrucción EXG intercambia los valores de ambos acumuladores o registros, por ejemplo si en A<=$20 y en B<=30, después de usar la instrucción EXG ahora los acumuladores tendrán A<=30 y en B<=20. Hay que tomar en cuenta que si queremos intercambia un dato de 16 bits a un acumulador de solo 8 bits, se perderá la parte alta del dato de 16 bits, en cambio si queremos intercambiar un dato de 8  bits a un registro de 16 bits, se hará a la parte baja del registro llenando con ceros la parte más alta de este registro.
Para la extensión de signo, hay una instrucción especial SEX, ya que cuando transferimos o intercambiamos de una acumulador de 8 bits a un registro de 16 bits este dato quede en la parte baja del registro (como ya se explicó anteriormente), entonces si este dato es negativo al momento de que este en un registro de 16 bits se hará positivo ya que el ultimo bit es el que define si es positivo o negativo el dato (1-> negativo, 0-> positivo). Para hacer el cambio de signo se utiliza la instrucción SEX, la cual rellena con 1’s en lugar de 0’s los otros 8 bits del registro de 16 bits, y de esta manera el dato que anteriormente era de 8 bits y se transfirió o intercambio al de 16 bits ya conserve el signo negativo en caso de que lo haya sido.

Intercambio de datos:



: Transferencia y extensión de signo



Sumas y restas.
La suma entre registros y registro, y registro y memora de 8 y 16 bits con y sin signo. También hay instrucciones de suma que suman el bit de acarreo (carry) en el CCR. Al igual que en la suma también en la resta se puede hacer entre registro y registro y registro y memoria de 8 y 16 bits con signo y sin signo. Y al igual que en las sumas se usa un bit de acarreo del CCR, pero en esta ocasión nos sirve como pedir prestado (borrow).
Como se mencionó anteriormente, se considera un bit del CCR para realizar la suma o resta en algún registro o memoria, además de que se alteran los registros de las banderas medio acarreo (H), signo (N), cero (z), sobrecupo (V) y por supuesto el acarreo (C). Algunas de estas instrucciones son solamente inherentes como la suma y resta entre registros, en cambio la suma y resta entre un registro y memoria los modo de direccionamiento son los complementarios al inherente, es  decir, aplican el resto de los modos de direccionamiento. A continuación se mostrara la lo anterior dicho de los modos de direccionamiento.
 
Ejemplificando la suma entre registros se realiza una suma entre registros A + B ($70 + $90) y el resultado de esta suma es $100, en el cual en el procesador solo nos dará el resultado de $00, ya que se queda cargado el resultado de esta operación en acumulador A (y este es de 8 bits), entonces se queda el resultado de $00 ahí, pero se activa la bandera de acarreo y esto nos indica que el resultado de esta operación es un número mayor a 8 bits.
Ahora, para la suma de un registro con memoria, al igual que en el ejemplo anterior se usa el modo de direccionamiento inmediato. Hay que notar que el ejemplo anterior para cargar los datos que se usaron se utilizó el modo inmediato, pero solo para cargar el dato, no para realizar la operación, como ya se había explicado anteriormente en la suma o resta entre registros solo se puede usar el modo inherente. Ahora, para el siguiente ejemplo de suma que se realizara entre registro y memoria se suma al $00 un $FF, entonces esto nos dará como resultado $FF, pero hay que notar el para esta instrucción se toma en cuenta el carreo y en caso de que el bit este activado debido al resultado de la suma anterior, entonces se le suma 1 al resultado de la operación, es decir, $FF+1 y el resultado efectivo de esta suma (por así llamarlo) es $00 y se vuelva a activar el bit de acarreo, porque el resultado real es $100.
Para el caso de la resta ocurre lo mismo, pero en lugar de ser acarro es pedir prestado (carry/borrow).
Instrucciones BCD
Las instrucciones BCD, son usadas para ajustar un número hexadecimal a un número decimal, una de las principales condiciones es que los números en hexadecimal no contengan letras, es decir, que los operandos no sean mayores a $9. Para el uso de ajuste decimal se usan las instrucciones de suma que consideran el medio acarreo (H) del CCR, y después se ajusta el resultado de la operación usando la instrucción DAA. Para ejemplificar esto, se realizara una suma entre un registro y memoria después, como el resultado está en el registro B se cambia al registro A para poder realizar el juste decimal.
Instrucciones de decrementos e incrementos.
Estas instrucciones pueden ser usadas para registros de 8 y 16 bits. Estas instrucciones se usan o aplican para realizar contadores ascendentes o descendentes, ya que el bit de acarreo (C) en el CCR no afecta. A continuación se mostrara una tabla de los distintos tipos de decrementos e incrementos.

Hay que destacar que estas instrucciones son inherentes, si se desea guardar en una localidad de memoria como por ejemplo, una tabla se pueden usar varios métodos distintos, pero en si, estas instrucciones son puramente inherentes.
A continuación se presentara una aplicación de un contador y llenado de una tabla con los resultados.
 
En este ejemplo primero se carga la dirección de la tabla (que para este caso está en el origen de la RAM) después el valor de inicio $FF, y por sentido común sabremos que será un contador descendente. Después se guarda en cierta localidad de memoria, que para este caso es la primera localidad de la dirección de la tabla, y por último se incrementa el índice de la tabla, por lo tanto cambia de dirección después de haber guardado el valor, y posteriormente decrementamos 1 al valor inicial provocando que este vaya contando descendentemente, y como dije anteriormente guardando los datos, generando una tabla de 255 datos.




Instrucciones de comparaciones:
Estas instrucciones se utilizan para hacer una prueba a un registro o a una localidad de memoria, la manera de comparar es haciendo una resta entre lo que se dece comparar, pero a diferencia de las instrucciones de resta en esta resta que se realiza en la comparación no se genera resultado alguno, solo se afectan las banderas del CCR. Estas instrucciones son usualmente usadas para establecer las condiciones de para las instrucciones de bifurcación.


Como ejemplo de esto, se realiza una comparación un cero de un registro, para esto se usa la instrucción de TSTA, la cual compara con cero la localidad de memoria A, esto con el fin de activar la bandera Z, en caso de que sea igual a cero lo que se encuentre cargado en el acumulador A. se hace una bifurcación o salta a otra sección de programa.






Operaciones lógicas.
Para las operaciones lógicas booleanas se realizan operaciones entre acumuladores, memoria e incluso el CCR. Las operaciones lógicas que se realizan son AND, OR y OR exclusiva.

A continuación se mostrara la tabla de las distintas instrucciones booleanas que se pueden usar.
Como ejemplo de esto, se realiza una operación entre el acumulador A y una localidad de memoria (en modo inmediato) de la cual se realizara la operación booleana AND, donde el resultado se quedara cargado en el registro A, notemos que esta instrucción se puede usar como enmascaramiento de bits,de manera que solo los bits que sean 1’s tanto en la memoria como en el registro son los que se mantendrán iguales en el resultado como se muestra en la tabla de verdad de AND.
Ahora, para demostrar la compuerta OR, se carga otro valor en modo inmediato y el resultado de igual manera se mantiene en A, pero ahora en donde sea que haya 1’s tanto en A como en memoria se mantendrá en 1, no importando si en A o memoria había un cero como se muestra en la tabla de la verdad de OR.
Y por último se le aplica la instrucción XOR, para que los bits que sean diferentes se mantengan en 1’s y los bits que son iguales se hagan 0’s, como se muestra en la tabla de verdad de XOR.


Limpiar, complementar y negar.
Las instrucciones de limpieza sirven para poner en cero localidades de memoria , acumuladores y algunos bits del CCR. Como por ejemplo CLC que consiste en mandar un 0 a bit de acarreo (C) del CCR, el CLR hace lo mismo pero para una localidad e memoria  y el CLRA para el acumulador A.
Las instrucciones de complemento, dan como resultado el valor que falta para completar el valor máximo de un acumulador o memoria, es decir si es de 8 bits (FF) se realiza una resta entre ese valor y lo que se tiene en el Acumulador o localidad de memoria, entonces el resultado es lo que falta para obtener valor del byte. Un  ejemplo sencillo es: el complemento de 0, si este es de 8 bits, entonces el valor máximo es FF, lo que se hace es una resta FF-0 el resultado es FF, y ese es el complemento de 0, es decir lo que le falta para llegar a su valor máximo.
La negación es el complemento de 2, algo muy similar a lo realizado anteriormente, al diferencia está en que se le suma 1 después de haber complementado A continuación se mostrara la tabla de las instrucciones:
Para ejemplificar lo anterior dicho se hace un programa muy sencillo.
Primero se borra lo que está en B con la instrucción de limpiar, después se complementa y el resultado es FF (como se explicó anteriormente), y por último se hace la negación que es el complemento de 2, el cual consiste en obtener el complemento y después sumarle 1 como se muestra a continuación.




Multiplicación y división.
Dentro de las instrucciones de multiplicaciones y división, hay operaciones con signo y sin signo. Las operaciones de 8 bits tienen un producto de 16 bits y las multiplicaciones de 16 bits tienen productos de 32 bits. Para las divisiones, ocurre algo similar, pero inverso, ya que si se tiene un dividendo de 16 bits  y un divisor de 8 bits y se produce un consiente y residuo de 8 bits cada uno, pero también hay divisiones con un dividendo de 32 bits y un divisor de 16 bits y estos tiene un cociente y residuo de 16 bits cada uno. Para ver esto más claro se mostrara la tabla de instrucciones y se podrá apreciar que registros se concatenan para formas 32 bits tanto en multiplicaciones como en divisiones.
Como se puede apreciar en la tabla, para hacer uso de multiplicaciones de 32 bits se usa como producto el registro Y y D para formar un producto de 32 bits, de tal manera que en el Y queda la parte alta del producto y en D la parte baja del producto. Para el dividendo de las divisiones ocurre exactamente igual, se usa el registro Y para la parte más alta y el registro D para la parte más baja. A continuación se verá un ejemplo para tener esto más claro.
Para la multiplicación con signo ocurre exactamente lo mismo, solo hay que tomar en cuenta que el ultimo bit es quien definirá el signo del producto. Ahora, como se comentó anteriormente para la división y división con signo y división fraccionaria  se hace algo similar con lo que sucedió con el producto de la multiplicación, solo que en esta ocasión ocurre eso para los dividendos, lo cual es concatenar 2 registros de 16 bits para crear un dividendo de 32 bits como se muestra a continuación.


Instrucciones de corrimientos y rotaciones.

En estas instrucciones hay corrimientos para todos los registros y acumuladores, y también para memoria. Para todos los desplazamientos y rotaciones pasan a través del bit de acarreo (C) del CCR, pero la diferencia es que para los corrimientos los bits recorridos se remplazan por ceros, en cambio en rotación los bits recorridos se remplazan por los lo bits que van saliendo por el bit de acarreo (C), claro tomando en cuenta que el primer bit rotado es el bit de acarreo, pero no hay que olvidar que el ultimo bit rotado se queda en el bit de acarreo (C).

Como ejemplo de esto tenemos un $3C y corremos a la derecha el valor, entonces cada vez que se corra se rellenaran con ceros los bits que se recorrieron. En cambio sí se rota a la derecha el bit de acarreo, aunque no haya habido nada en ese acumulador si se le asigna un 1 al bit de acarreo cada vez que se haga una rotación se llena de 1’s el acumulador.

Este pequeño programa recorre el bit hacia la derecha 8 veces dejando en cero lo que hay en el acumulador a.
 


En este programa ocurre lo contrario rotando el bit de acarreo asignándole siempre 1 al bit de acarreo antes de rotarlo hacia la izquierda dejando puros el valor final del registro en 1’s.





Conclusiones:
Durante la práctica se aprendió en funcionamiento de cada una de las instrucciones del HCS12, además de ver los diferentes modos de direccionamiento que se utilizan en cada una de las instrucciones haciendo sencillos programas demostrativos.






Bibliografía:
ü  El Microcontrolador HCS12
TutorialHC12:http://caos.uab.es/~dlugones/courses_archivos/HC12tutorial.pdf
ü  HCS12_CPU
www.freescale.com ó http://michelletorres.mx/modos-de-direccionamiento/#.UwbKDPl5O1U
ü  Apuntes vistos en clase

Escritos por alumno de ingeniería en electrónica: Juan Daniel Flores Gutiérrez

martes, 3 de abril de 2012

Display de 4 Caracteres


Seguramente ya sabrás a que nos referimos cuando mencionamos un display de 7 segmentos. Estos útiles dispositivos de salida, constan de 7 LED cuasi-rectangulares, uno por tramo, dispuestos en forma de “8” y uno redondo que es el punto decimal. Mediante el encendido de algunos de los tramos que forman el “8” se puede representar cualquier digito del “0” al “9”, e incluso algunos caracteres, como la “A” o la “U”, aunque no siempre resultan muy legibles.

Uno de los problemas que presentan estos displays es su reducido tamaño. En efecto, aunque teóricamente es posible encontrarlos tan grandes como 12 pulgadas de alto (unos 30 centímetros), su precio resulta prohibitivo, sobre todo para el aficionado. Y los mas comunes, de 1 o 2 centímetros, muchas veces son demasiado pequeños para leerlos desde un par de metros de distancia.


Imagen:DLED14.jpg
Display terminado.


La solución a este problema es utilizar varios LED comunes, redondos o rectangulares, para armar los segmentos, y construirnos nosotros mismos el display del tamaño que queramos. A pesar de que emplearemos una cantidad importante de LEDS, su costo individual es tan bajo que el importe total que desembolsaremos será mucho menor que si compramos un display grande.

A lo largo de este artículo explicaremos paso a paso como construir un display gigante de 4 dígitos, que podremos conectar a un ordenador o microcontrolador para mostrar información en él.

Algunos de sus usos posibles son el empleo como un reloj digital, cronometro, termómetro, dispensador de turnos, etc.

Como ya es costumbre, los alentaremos a que modifiquen este proyecto para construir un display que se adapte exactamente a sus necesidades. Para que eso sea posible, les brindaremos toda la información necesaria sobre su funcionamiento.

Un segmento

La célula básica de nuestro proyecto será el segmento. Efectivamente, deberemos diseñar un segmento en base a algunos LEDs(y otros componentes), y luego repetirlo 7 veces para formar un digito.

Como se puede ver en la figura de mas abajo , para encender un LED hace falta que lo atraviese una corriente determinada en el sentido correcto. La intensidad de la corriente depende un poco de cada tipo de led en particular, pero se suele tomar como correcto un valor de entre 10 y 20 mA. Nosotros tomaremos un valor de 15mA, pero el lector podrá rehacer sus cálculos para otros valores.

El sentido de circulación de esta corriente por dentro del LED debe ser desde el ánodo hacia el cátodo para que este se ilumine, por lo que el ánodo se conectara al positivo de la fuente, y el cátodo al negativo.


Imagen:DLED02.gif
La corriente debe atravesar el LED para encenderlo


La tensión necesaria en los pines del LED también varia de un modelo a otro, pero 2V es un valor bastante adecuado para un LED rojo como el que usaremos aquí.

Generalmente, el valor de la fuente de alimentación no es el correcto para el LED, por lo que se debe incluir una resistencia limitadora en serie. El cálculo se realiza mediante la formula que acompaña la figura, y para una fuente de 12V, debe tener un valor de 666.66 ohms. Como las resistencias no se fabrican de todos los valores posibles, deberemos utilizar el valor comercial más cercano, en este caso, 680 ohms.

Ahora bien, todo lo explicado esta muy bien para encender un LED, pero nuestro segmento, para ser visible debe constar de al menos 3 o 4 leds (¡o mas!). El número elegido de LEDs se conectaran en serie, el cátodo de uno unido eléctricamente al cátodo del siguiente, y así.

Esto significa que la corriente que los atravesara a todos será la misma, y el voltaje aplicado deberá ser mayor que la tensión necesaria en cada uno (2V) por el número de LEDs.

En el segundo diagrama vemos tres leds conectados en serie, y la formula para calcular la resistencia limitadora. En el caso de usar la misma fuente de alimentación de 12V, la resistencia necesaria será de 400 ohms. Nuevamente, al buscar en un catalogo vemos que el valor mas cercano disponible es de 390 ohms, y es el que en la practica emplearemos.


Imagen:DLED03.gif
Forma de conectar varios LEDs en serie.

Tenemos que ver que si en la formula introducimos un numero de LEDs elevado, puede darse el caso de que el termino nLeds x VLedssea mayor que la tensión de alimentación, con lo que el valor de R será negativo, lo que por supuesto es una incongruencia. Esto nos esta indicando que la tensión de la fuente de alimentación es insuficiente para encender tantos LEDS, y deberemos utilizar una de un voltaje mayor.

En nuestro display, cada segmento constara de tres LEDs.



Dígitos

Una vez que tenemos la teoría necesaria sobre como construir un segmento, debemos dar el siguiente paso lógico: la construcción de undigito.

En realidad, un digito no es mas que repetir el esquema de un segmento 7 veces. Pero (lamentablemente siempre hay un “pero”) si tenemos intenciones de controlar nuestro digito gigante desde la PC o desde un microcontrolador, necesitaremos alguna etapa adicional, capaz de manejar el consumo de un numero elevado de LEDs, y si fuera posible, sin requerir un pin de E/S de los pocos disponibles, para manejar cada segmento.


Imagen:DLED04.gif
Un par de transistores permiten manejar varios LEDs.


El problema de manejar una corriente mas elevada de la que es capaz de brindar la PC o el microcontrolador se soluciona fácilmente mediante el uso de un transistor.

Aunque muchos de los lectores de este articulo lo tienen seguramente muy claro, intentaremos explicar con palabras sencillas y sin involucrar formulas complicadas como utilizar un transistor para excitar una serie de LEDs.

Explicado en términos simples, un transistor puede ser visto como un dispositivo de tres pines, donde la corriente que se aplica a uno de ellos, denominado “base”, controla una corriente mayor entre sus otros dos terminales, llamados “emisor” y “colector”. Esta es una gran simplificación de lo que es un transistor, pero es suficiente para entender lo que sigue.

Supongamos que el port paralelo de la PC, o el pin de salida de un microcontrolador solo puede entregar una corriente de 5mA.

Esta corriente es a todas luces insuficiente para encender los LEDs, pero si para excitar un transistor que a su vez le entregue a los LEDs los 15mA que necesita para brillar. Si no pusiéramos el transistor, el puerto se dañaría debido a que circularía por el una corriente 3 veces mayor a la que puede manejar.

El esquema de la izquierda muestra un segmento, controlado por dos transistores. T1 es un transistor PNP, y T2 es un transistor NPN. Cuando la base de T1 esta puesta a masa (un un 0 lógico lógico) y la base de T2 a un “1” los LEDs se encenderán. Las resistencias conectadas a las bases de los transistores limitan la corriente que deberá entregar el puerto de nuestra PC, y “R” se calcula tal como lo explicamos antes.

Esto soluciona el primero de los problemas. Los lectores mas avispados se habrán dado cuenta que esto se podría haber resuelto con solo un transistor. Pero para abordar el segundo problema, el no requerir un gran numero de pines de control, necesitamos multiplexar los segmentos de los 4 dígitos, y ahí necesitamos el transistor extra.



Multiplexado

Multiplexar significa básicamente reutilizar unos pocos recursos disponibles para que a lo largo del tiempo realicen diferentes funciones.

Una de las formas seria encender brevemente cada segmento, apagarlo, pasar al siguiente digito, encenderlo brevemente, pasar al otro… y así sucesivamente. Este es un sistema muy utilizado (y recomendado) pero que para nosotros tiene un problema importante: requiere que estas tareas se lleven a cabo continuamente, y cada unos pocos milisegundos, para que no se noten parpadeos o apagados indeseables de algunos segmentos. Esto obligaría a que nuestra PC este pendiente completamente del manejo del display, lo que es poco practico.

Dado que los datos del display seguramente no van a cambiar con una frecuencia muy elevada, podemos utilizar un registro de desplazamiento como el visto en otros artículos. La ventaja del registro de desplazamiento es que una vez que introducimos un dato en el, este se mantiene hasta que necesitemos cambiarlo, sin requerir la atención de la computadora. Por ejemplo, en el caso de un reloj, si no tenemos segundero, solo deberemos escribir la hora una vez por minuto.

No nos explayaremos demasiado sobre el funcionamiento del registro de desplazamiento aquí, que ya como se trata de un circuito útil y utilizado a menudo, le dedicaremos un articulo especial en este sitio. Solo mencionaremos que gracias a su empleo, con cuatro líneas del puerto paralelo podremos controlar los 28 segmentos de los cuatro dígitos, y el par de LEDs que hay entre el segundo y tercer digito.

Las salidas tendrán las funciones siguientes: proveer pulsos de CLOCK, los datos en forma serial (DATA), RESET para borrar todos los dígitos, y la ultima controla el encendido y apagado de todos los segmentos para proceder a la escritura de los datos sin que aparezcan parpadeos.



El circuito

En los diagramas podemos ver el esquema eléctrico del display en si mismo, y del registro de desplazamiento que será nuestra placa de control, el vínculo entre el display y la PC o el microcontrolador.

Cada uno de ellos va montado en su propio circuito impreso, de manera que se puedan montar en un espacio mas reducido, colocando una plaqueta detrás de la otra, unidas entre si por cables flexibles, y unidas mediante los mismos separadores plásticos que se emplean para montar los motherboards en las computadoras.

Como siempre, para construir los impresos utilizaremos la técnica explicada aquí.

Al momento de soldar los leds, debemos tener cuidado con la orientación de los semiconductores, ya que si los colocamos al revés, el proyecto no funcionara. Si observan atentamente, los conectores de la placa controladora se corresponden con los del display, y una vez que tengamos listas ambas, deberemos unir cada punto con un cable, y luego doblar el mazo de conductores para poner una placa a espaldas de la otra. Se deben practicar agujeros para unir ambas plaquetas, teniendo cuidado de que al agujerear no perforemos un componente o cortemos una pista del circuito impreso. Las imágenes que ilustran la nota nos muestran como debe quedar el modelo terminado.



El circuito eléctrico del display es extenso pero sencillo.



Este es el circuito de nuestro registro de desplazamiento.

PCB

Imagen:DLED07.gif

Circuito impreso correspondiente al display de LEDs.


Imagen:DLED08.gif
Este es el circuito impreso que corresponde al registro de desplazamiento.




Aquí hemos puesto algunas fotos del display terminado.


Imagen:DLED11.jpg
Display montado sobre el registro de desplazamiento

Puede verse el conector de entrada de datos que debe conectarse al controlador, ya sea una PC o un microcontrolador.


Imagen:DLED12.jpg
Los transistores se deben montar cortando sus pines para que queden a menor altura que los LEDs.


Imagen:DLED13.jpg
La mayor parte de los componentes de este montaje son diodos LED.






Créditos al autor del proyecto:
Ariel Palazzesi