Proteus [ Simulador electronico ]

Que es un simulador electronico?

Es una herramienta que utilizan los desarrolladores de sistemas integrados y componentes electronicos para ayudarse a crear un circuito en el cual se desee ensamblar de manera digital, logrando tener un mecanismo logico ( no fisico ) del componente o el sistema electronico. Esto con el fin de realizar pruebas y detectar fallos en el sistema antes de su implementacion.

En general la unica desventaja de utilizar un simulador electronico es que no se pueden contar con todos los factores naturales como humedad, presion, calor, etc...

Proteus

Proteus es una compilación de programas de diseño y simulación electrónica, desarrollado por Labcenter Electronics que consta de los dos programas principales: Ares e Isis. Hablando del programa ISIS, Intelligent Schematic Input System (Sistema de Enrutado de Esquemas Inteligente) permite diseñar el plano eléctrico del circuito que se desea realizar con componentes muy variados, desde simples resistencias, hasta alguno que otro microprocesador o microcontrolador, incluyendo fuentes de alimentación, generadores de señales y muchos otros componentes con prestaciones diferentes.

Este programa ISIS nos permite dibujar sobre un area de trabajo, un circuito que posteriormente podemos simular, y verificar para encontrar sus posibles errores.

Instalacion de Proteus

Bajo windows 7 

Primero descargamos el proteus completo de aqui

Despues seguimos el video, en el video aparece que le doy la opcion de Modificar, esto es porque ya contaba con el Proteus instalado. Solo hay que darle un instalacion completa y despues agregarle la llave que marca el video.




Como realizar una simulacion?


Este video presenta como se crea la simulacion de un PIC16F873A, aqui esta el codigo prueba y lo unico que hace es hacer parpadear la salida RB1.


Nota: esta instalacion de proteus funciona sobre el sistema operativo GNU/Linux utilizando wine
Comprobado sobre debian squeeze y arch linux 3.2 [simulacion e instalación]

Codigo Prueba

Programando en Assembly [ Entrega 1 ]

En esta liga podemos ver teoria sobre el lenguaje Assembly.

Que necesitamos?
 - un ensamblador para pasar nuestro codigo Assembly a un formato objeto.
 - un enlazador que combine nuestros archivos objeto con las librerias necesarias.

En este caso utilizaremos assembly con sintaxis de Intel, ya que a mi parecer es un codigo muy limpio. Nuestro ensamblador sera NASM ya que es propio del uso de la sintaxis de Intel para 16 y 32 bits.
Nuestro enlazador por fortuna viene agregado como herramienta de GNU en sistemas con nucleo linux, su nombre es ld.

Como instalar NASM?
NASM esta en los repositorios de muchas distribuciones, solo se tiene que usar el comando del gestor de paquetes como ejemplo para debian/ubuntu:

              sudo apt-get install nasm

y como mencionamos el enlazador viene por default.

Ahora veamos un Hola escrito para lenguaje assembly utilizando sintaxis Intel




El codigo esta lleno de comentarios utiles para la comprension del programa.

Ahora lo ensamblaremos y lo enlazaremos con sus librerias para que nos quede un ejecutable.


 Lo pasamos a un archivo de tipo ELF ( Archivo Ejecutable y enlazable ) para depues  enlazarlo usando ld.


Ahora nos queda un ejecutable y solo tenemos que mandarlo llamar.

Asi se hace una impresion utilizando Assembly con sintaxis intel sobre linux.

Dejando en claro cada linea de este programa.

SECTION .data es una seccion del programa que especifica la memoria del segmento de datos. Solo los datos iniciados se deber definir en este segmento.
En este segmento utilizamos db para reservar bytes, usamos la etiqueta msg para  despues guardar caracteres " H "," o "," l "... y ademas le agregamos dos caracteres de escape ( 10 y 13 ) para estetica. Ademas utilizamos otra etiqueta llamada lon para guardarle un numero que comprende de la resta de la posicion actual del puntero menos la posicion inicial del puntero, si no fallo seria un 15.


SECTION .text en esta seccion se define la parte del codigo.
     MOV nos permite mover valores hacia los registros.
     INT hace la llamada a una interrupcion y en este caso usamos la 0x80 que nos permite decirle al kernel que ejecute una llamada al sistema dependiendo de acumulador.


Ahora veremos otro programa que apartir de un argumento crea un nuevo archivo, le escribe una linea de caracteres predefinida.
Despues reabre el archivo, toma lectura de una linea y la imprime en pantalla.


Aqui estan las hojas de referencia para assembly
Manual para uso de NASM
Aqui les dejo la tabla de las llamadas al sistema

Lenguaje Ensamblador

Porque un lenguaje ensamblador?

Comunmente los ingenieros en software  utilizamos lenguajes que son ciertamente entendibles para el ser humano al tratar de ordenarle a la computadora que realize ciertas acciones.
A esta accion le llamamos programar.

No es mas que escribirle una serie de instrucciones en una archivo de texto para que despues mediante un proceso de compilacion y traduccion ese archivo sea entendible por la computadora.

La computadora solo entiende una secuencia binaria de ceros y unos 0,1. A esto le llamaremos lenguaje maquina, ya que es el lenguaje que la maquina puede comprender con respecto a su hardware.

Cada vez que nosotros reservamos una variable al momento de hacer un programa, lo que en realidad esta pasando es que una secuencia binaria es enviada y procesada por el maquina y con un conjunto de acciones basicas logra cumplir su funcion.

Este tipo de secuencias de numeros binarios al que denominaremos instruccion, es facilmente comprendida por la maquina, pero por los programadores es practicamente imposible saber que es lo que una secuencia como 0001110101001011010010 seria capaz de realizar al ser ejecutada.

Ahora que sabemos lo dificil que seria darle instrucciones directas a una maquina, debemos saber que es posible utilizar la propia maquina para ayudarnos a traducir lenguaje comprensible a lenguaje maquina. Es decir que si a una maquina especifica se le proporcionaba de un programa especifico que tradujera caracteres alfabeticos a instrucciones binarias, se podia construir un programa constituido de caracteres entendibles para los humanos, en el cual se utilizarian palabras especificas para realizar acciones concretas de la maquina.

 Entonces de ahora en delante la maquina podria tomar codigo que los humanos entendemos para poder traducirlo a un codigo que ella especificamente entienda. A esas palabras especificas se les llama mnemotecnico y existe un mnemotecnico para cada instruccion. se les llama asi porque ayudan a recordar el conjunto de instrucciones de una determinada maquina.
A los programas que logran pasar del programa escrito en forma de instrucciones de mnemotecnicos a un lenguaje maquina se les conoce como ensambladores.

Porque utilizar un lenguaje ensamblador?



  • A diferencia de un lenguaje de alto nivel, los programas que se escriben en un lenguaje ensamblador requieren mucho menos memoria y tienen un tiempo de ejecuccion mucho menor.
  • Los lenguajes ensambladores le dan la posibilidad a el programador de realizar acciones muy especificas y tecnicas que al contrario de los lenguajes de alto nivel son dificiles de realizar.
  • El conocimineto del lenguaje ensamblador de una maquina en especifico le confiere una compresion de la arquitectura de dicha maquina mucho mayor que la que le confiere un lenguaje de alto nivel.
  • Por lo general es una buena practica recodificar en lenguaje ensamblador las rutinas de aquellos sistemas que requieren de un procesamiento muy tardado, para asi optimizar las rutinas que le conlleven mas problemas a dicho sistema.
  • Si se quiere implementar porciones de código en un lenguaje de bajo nivel como ensamblador para disminuir el tiempo de procesamiento. Por ejemplo, en aplicaciones que necesiten renderizar gráficos 3D que requieren más tiempo de procesamiento, habrá que escribir una librería para gráficos en lenguaje ensamblador para tener un mejor rendimiento
  • Los programas que realizan interrupciones  y rutinas de servicio para los sistemas operativos casi siempre estan escritos en un lenguaje ensamblador.
Un lenguaje ensamblador trabaja sobre los registros del procesador interno de la maquina los cuales sirven par a controlar la ejecuccion, la memoria y proporcionan capacidad aritmetica, estos poseen 16 bits que se enumeran de izquierda a derecha. 15,14,13,...,0.
Nota: En arquitecturas x86 el largo de estos registros aumento a 32 bits, y eso se refleja en el codigo ensamblador anteponiendo la letra E (Extended) a los registros.

Tabla de Registros
Registro de datos  Estos registros se pueden direccionar como parte de una palabra o de un byte, el ultimo byte de la izquierda es considerado la parte alta y el ultimo byte de la derecha la parte baja. Como podemos ver en la tabla de registros, cada registro consta de una parte alta ( High ) y una baja ( Low ), es decir consta de 8 bits para cada parte, del 0 al 7 Low, del 8 al 15 high.
  • Registro AX ( Acumulador ). Este se utiliza en las operaciones E/S y en las   aritmeticas. Es el mas eficiente de los registros de datos.
  • Registro BX  ( Base ). Registro de proposito general que puede servir para direccionamiento o para hacer calculos.
  • Registro CX  ( Contador ). Conocido como registro contador, puede tener valores que controlan los ciclos o el valor del corrimiento de los bits.
  • Registro DX  ( Datos ). Este se utiliza en las operaciones E/S y por lo general las operaciones aritmeticas de punto flotante en conjunto con AX.
Registros de Apuntadores e indices Estos registros estan asociados con el registro de segmento de pila y permiten el acceso a los datos de este segmento.
  • Registro SP  (Stack Pointer / Apuntador de Pila ). Proporciona una valor de desplazamiento que se refiere a la palabra actual que esta siendo procesada.
  • Registro BP  (Base Pointer / Apuntador de Base ). Facilita la referencia de los parametros los cuales son datos y  direcciones transmitidas en la pila.
  • Registro SI  (Indicie fuente ) Esta asociado con el segmento de datos y en conjunto realizan operaciones con caracteres.
  • Registro DI  (Indice destino ) Al igual que el SI, este registro esta asociado con el segmento extra para realizar operaciones de cadenas de caracteres.
Registros de segmentos Son segmentos de 16 bits que facilitan el area de memoria para direccionamiento conocida como el segmento actual, es decir son partes de memoria que pueden pasar a estar en ejecuccion.
  • Registro CS  ( Segmento de Codigo ) Aqui se almacenan las instrucciones para ser ejecutadas.
  • Registro DS  ( Segmento de Datos ) Aqui se almacenan los datos para su uso posterior
  • Registro SS  ( Segmento de Pila ) Este registro permite el almacenamiento  en memoria de una pila, para guardar temporalmente datos y direcciones.
  • Registro ES  ( Segmento Extra ) Este registro se usa para operaciones con cadenas de caracteres.
El IP ( Instruction pointer / Puntero de instrucciones ) es un puntero que se usa con la mayoria de los registros de segmento para dar la direccion de cierta parte de datos de cada uno de esos registros.

Tambien esta un registro general que guarda las banderas que se pueden utilizar al momento de programar para señalar algunos eventos.

Flags

Cada uno refiere a un motivo diferente.

  • Overflow Flag (desbordamiento) Indica que se desbordo un bit despues de una operacion matematica.
  • Direction Flag (direccion) Indica la direccion hacia la izquierda o derecha para mover o comparar cadenas de caracteres.
  • Interruption Flag (interrupcion) Indica si deben ser tomadas en cuenta las interrupciones externas.
  • Trap Flag (trampa) permite la ejecuccion paso por paso, para debugeo.
  • Sign Flag (signo) el ultimo bit de la mantisa, contiene si es positivo o negativo
  • Zero Flag (cero) indica si el resultado de una comparacion aritmetica es uno(resultado es cero) o zero(resultado diferente de cero)
  • Auxiliar Flag (auxiliar) contiene un acarreo externo del BIT 3 en un dato de 8 bits para aritmética especializada.
  • Parity Flag (paridad) indica paridad en los bits de bajo nivel
  • Carry Flag (acarreo) contiene el acarreo de alto nivel despues de operaciones aritmeticas.

Referencias:
PDF assembly work creado por Carlos Navarro
Linux Assembly

Sistemas Integrados

Un sistema integrado tiene muchas definiciones, algunas de ellas son:


  • Es aquel en el cual un programa interactua directamente con el hardware computacional principalmente.
  • Es un sistema en el cual la codificacion esta estrechamente ligada a el hardware que se utilizara.
  • Es un sistema que esta diseñado especificamente para realizar una tarea que no este directamente activada por la interaccion humana.

Todos los dias usamos sistemas embebidos sin darnos cuenta, por ejemplo la licuadora, el refrigerador, el control remoto, el celular, el mouse, el teclado, etc..
Por lo general los sistemas embebidos constan de un pequeño microprocesador para poder realizas acciones especificas utilizando algo de logica matematica sencilla y alojando memoria a pequeña escala para asi lograr cumplir sus funciones.

La computadora esta diseñada para poder realizar un gran espectro de acciones y utilidades para la vida cotidiana, en cambio un sistema embebido suele ser creado para cumplir una funcion especifica que minimize la dependencia de jerarquias complejas en su diseño para ser utilizado satisfactoriamente.














Este es un ejemplo de un sistema embebido, consta de dos cuatro push buttons, un diodo emisor de infrarojos, un decoder, y un microprocesador ATMEL entre otras cosas mas.
El proposito de este pequeño sistema integrado es el de codificar señales dependiendo de la posicion de la tarjeta mediante la lectura de señales infrarojas. Ademas posee tres señales que van directas de push buttons ( una señal utiliza dos push ) que van directas al microprocesador y despues son enviadas mediante wireless. Dicho dispositivo no es mas que un Mouse inalambrico.

Otra forma de hablar de sistemas integrados es pensar en ellos como una diminuta computadora dispuesta a realizar determinada accion.


La importancia de los sistemas integrados esta implicita, son totalmente necesarios y sin duda aportan una gran usabilidad al tener sistemas y equipo para diversas acciones como los celulares, las camaras web, los reproductores de musica portatiles y en aplicaciones en la industria pueden ser controladores de maquinaria, robots, dispositivos electronicos. Dichos sistemas nos ahorran grandes componentes electronicos, nos permite tener componentes unitarios y que cumplan funciones diversas pero especificas a bajos costos y con un uso mas simple por su diseño ad hoc.


Inclusive podemos hablar de los sistemas embebidos "vestibles" ya que a medida que el desarrollo de microprocesadores y nano tecnologia se han incrementado se han logrado diseñar sistemas integrados muy pequeños capaces de ser transportados en el bolsillo, o en otras partes. Este tipo de sistemas se hacen diferentes propositos como el de recabar informacion clave de un individuo como sus latidos y pulsos etc. Un ejemplo de este tipo de sistemas es nano-tera el cual desarrolla un reloj que opera muchos de las señales de vida de un hombre para propositos medicos la liga a la pagina con mas informacion es esta Nano-tera




Referencias:

Ever Medina. Con la tecnología de Blogger.