Vistas de página en total

Mostrando entradas con la etiqueta HARDWARE. Mostrar todas las entradas
Mostrando entradas con la etiqueta HARDWARE. Mostrar todas las entradas

jueves, 5 de diciembre de 2013

EMULADOR 8051 (HARDWARE)

   Propósito

 Para poder seguir ampliando el blog y subiendo el nivel de los programas, siempre basándome solamente en código propio, hoy voy a colocar una tarjeta muy sencillas, que unida a la anterior tarjeta de 48IO, me permitió en su día crear una de mis mejores herramientas de desarrollo.
    En este caso el resultado del conjunto es un emulador de 8051. 
 
   Esta tarjeta es una versión para el 8051 de un emulador Z80 previo que desarrolle durante las vacaciones de navidad de 1993. Por ello este año cumple 20 años. Y por eso, como si se tratase de una patente, lo hago de  dominio público.


    Este emulador permitirá insertar un pincho en el lugar del microprocesador y tracear, ejecutar, y ver la ejecución de un programa sobre un hardware que desarrollemos con 8051.

 Historia

    Esto ahora está muy extendido, pero en 1993, que es cuando lo desarrollé era una herramienta muy cara.
   Este al igual que otro que podré para Z80, se puede realizar por 30€, y el coste entonces de uno equivalente estaba en 6000€. Por lo que valía la pena hacerlo.

   Me lo intentaron copiar, por supuesto, pero no llegue a comercializarlos, por estar metido en otra guerra. Ahora servirá simplemente para mostrar código ASM. No solo el hard es sencillo, sino además el software de emulación está enteramente en ensamblador. 
   Esto me permite ahora colocar todo el código del depurador, el cual incorpora un  desensamblador, ventanas de Dump, Gestión de la tarjeta 48iocent, Traceo, control DMA etc.

 Hardware

  La tarjeta es esta:


EMULADOR 8051

  



     Como se puede ver la tarjeta no puede ser mas simple. 
      Básicamente esta tarjeta es un medio de conseguir acceder a la tarjeta a probar y al micro de forma separada. 
     Mediante una serie de elementos, vamos a poder aislar el microprocesador de la placa, para poder leer y manejar el Hard de la placa a probar desde el PC. 
     Igualmente estos elementos de la placa nos permitirán tener conectado al microprocesador 8051 a la placa de prueba cuando lo deseemos, pudiendo poner en marcha el sistema.
       En ningún momento ejecutaremos instrucciones, ni secuencias desde el PC. Esto no maneja la placa de prueba emulando al 8051. Lo que realmente hace es conectar a este con la placa cuando lo necesitemos. De esta forma, la ejecución es siempre real. Pudiendose poner el sistema en marcha a la velocidad de reloj real.
       Para conseguir mayor velocidad en el traceo, realicé el soft en ensamblador.

Principio de Funcionamiento

       El principio del sistema es DMA. Generamos DMA, para acceder al programa interno de la placa a probar, para conocer su estado de memoria y sus datos, y para leer y escribir el programa o los datos. 
       En este caso, como el 8051 no tiene gestión de DMA, hemos colocado unos buffer que realizarán esta función. Los integrados U2,U3 y U4 tienen la misión de aislar el 8051 del bus de la tarjeta. De esta forma podremos tomar el control de la tarjeta desde el PC cuando lo necesitemos. Esto nos genera un control DMA, básico para poder tracear.
     Esta tarjeta emulador será transparente 100% para el programa. No consume interrupciones, no consume memoria, no consume, puertos. Podrá ser enchufado a cualquier placa que se desarrolle o haya sido ya montada. No necesita tener el programa en el PC, pues el emulador toma el programa de la propia tarjeta. Por ello se puede tracear una tarjeta desconocida, con solo soltar el micro y conecta en su lugar el zócalo de este emulador.
        

Funcionamiento

      El conector JP1 es el conector en el que están, en orden, los 6 puertos de la tarjeta 48iocent. En este caso mediante un conector con cable plano de 60 pines, se conecta a esta tarjeta, y por el otro lado el cable se divide para ir conectado 6 conectores de 10 pines para cable plano. Uno a cada puerto,de la tarjeta 48IOCEN.
       El conector JP2 es en cambio un conector de 40 pines para cable plano de formato DIP40, el cual será usado para enchufar en el zócalo en que irá luego el microprocesador.

       Dado que esto se usará con una placa real, el reloj de ejecución debería de poder ser el el real. Por ello el U7, se encargará de generar un reloj mediante el cristal que se encuentre en la placa de prueba, preparado para el 8051. La frecuencia generada por este reloj podrá ser usada como frecuencia de reloj del 8051. Así mismo, mediante un señal recogida del PC a través de la tarjeta 48iocent, podremos generar otro reloj controlado por el PC. De esta forma se podrá trabajar con la placa de prueba a la velocidad real, o a velocidad controlada. Incluso se podrá detener la ejecución en cualquier momento, y en cualquier ciclo de reloj del microcontrolador. Esto nos permite verificar mediante un simple milímetro cualquier el estado de cualquier señal del bus, en cualquier estado de acceso a programa, datos, buses, etc.
   La frecuencia de reloj que llega al microporcesador U6, estará tomada de este generador interno de la placa Emulador 8051, o de una señal que viene del PC a través de la tarjeta 48IOcent. Esta selección se hace mediante U5. Mediante esta selección podremos pasar de Modo Run,en tiempo real, a Mode Trace, paso a paso, o como he dicho, parar la instrución en cualquier punto de ejecución.  Esto nos permite tracear prácticamente a nivel de microinstrución.
   
     El Acceso Directo a Memoria, DMA se activa mediante la señal RQPC, la cual bloque el paso de datos desde el microprocesador a la placa prototipo. Para ello, la señal procedente de la placa 48IOcent. Es enviada a un inversor (U3B), para que active o desactive los buffers U1, U2 y U4. El U3B simplemente mantiene la lógica, para que un nivel alto en RQPC bloquee las puertas y pase los integrados 74LS245 a estado flotante. De esta forma quedan los buses libres para que el PC pueda escribir en ellos.

    U1 y U2 aíslan el bus de datos y direcciones entre el microprocesador de la tarjeta y el zócalo del micro de la tarjeta a probar. Aísla el micro para crear el DMA. U2 funcionará en modo bidireccional, seleccionado por RD.

     U4 aísla las señales de control de microprocesador, para que sea el PC y no el micro el que controle el bus de la placa.

      Cuando el micro esté ejecutando, la señal RQPC estará a 0, y los puertos de la tarjeta 48IOcENT, que estén conectados a los buses de datos, direcciones y control estarán en estado flotante, para no interferir.
       Cuando deseemos conectarnos y leer la memoria de la tarjeta prototipo analizada pondremos RQPC a 1 y activaremos los puertos de la tarjeta 48IOCEN, para que desde y por ellos activemos las señales de control, datos y direcciones de la placa.
    
   La señal del pin 16 que va a la placa prototipo, y sería el WR del micro original ,está procesada por medio de U5 de manera que no solo mande escribir en la memoria, siempre que se de orden de leer desde el PC.

   Ahora solo queda realizar un programa capaz de controlar esta tarjeta, y desensamblar  y tracear el programa que contenga el prototipo.

     Para ello, como siempre, primero crearé una libería de funciones para el simulador 8051, la cual, configurará la carta 48IOCENT, para cada operación, y nos permitirá realizar todas las funciones de acceso a memoria de la tarjeta y de traceo. Así mismo tendremos las funciones de pantalla para realizar el dump, visualizar los registros del microprocesador, y visualizar el programa.

       Un caso muy especial es sacar los registros del microprocesador al exterior.



  
Prototipo inicial del emulador
Prototipo unido a la tarjeta prototipo 48IOCENT
                   


Prototipo 8051, ya en placa



sábado, 23 de noviembre de 2013

TARJETA 48IO CONTROLADA POR CENTRONICS (HARDWARE)

    Esta vez voy a colocar hardware en vez de software, por primera vez. No tiene sentido el ensamblador sin hardwre, por ello para aprender ensamblador hace falta hard.

   Voy a colocar el desarrollo de una tarjeta de 48 entradas/salidas, que será controlada por puerto centronics.

      Mediante esta tarjeta podremos controlar 6 puertos de 8 bits, configurables. 
      Esta tarjeta es una aplicaión de uso general que puede servirnos para probar, controlar o desarrollar otras futuros desarrollos hardware.
      Como la complejidad de control de manejo de los puertos de esta tarjeta aumenta respecto de la ya de por si complicada forma de manejo del Centronics, para manejarla deberemos de crear una librería de funciones.
      Estas librería estará compuesta por unas macros para crear llamadas a funciones de manejo, y una librería de funciones, que implementen las diferentes configuraciones y las diferenteS aperturas y cierres de puertos para el control a través del Centronics.
     Con la librería "48IO", que pondré en sucesivas entradas, haremos tanto el puerto Centronics, como esta tarjeta transparente a nuestras aplicaciones, de manera que será muy fácil centrarse en la tarjeta aplicación que estemos desarrollando olvidándonos del hardware que sirve de interface.
     
      Dado que la comunicación resulta crítica en muchos casos, por su ralentización en la respuesta de la aplicación que estemos desarrollando, el puerto Centronics resulta perfecto, dado que la velocidad de respuesta es muy alta en comparación con un puerto serie. Así mismo que las librerías de comunicación estén en ensamblador nos permitirá tener una gran velocidad de proceso, reservando para el proceso real, todo el mayor tiempo posible, y reduciendo al mínimo el tiempo de lectura y escritura de datos sobre la tarjeta prototipo.



ESQUEMA TARJETA 48IOCENT
 Copyright (C) 2013  José Ángel Moneo Fernández

    This program is free hardware: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

    This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

     Esta tarjeta aunque es simple, pues lleva pocos componentes, puede que necesite algunas aclaraciones.

     JP8 es el conector de alimentación
     JP7 es el conector centonics, el cual se usa para conectar al PC.
     JP1 a JP6 son los puertos de salida, colocados en conectores de 8 bits con toma de tensión y tierra, de forma que puedan usarse independientemente para alimentar y controlar diferentes tarjetas.

      El corazón del equipo son dos 8255, los cuales se utilizarán directamente como puertos. Por ello no se utilizan latch y buffer de protección. igualmente no se han colocado ningún tipo de sistema de optoacoplamiento, pues esta tarjeta es de propósito general. Estos elementos deberán ser parte de los prototipos colgados de esta carta. De manera que la protección de los 8255 queda en manos de las cartas adicionales. Esto es necesario para permitir que esta tarjeta pueda trabajar como entradas o salidas en cualquier caso.

      Como interface entre los 8255 y el puerto centronics están el U1,U4 y U5. El U1 es un buffer que sirve de puerta para pasar los datos del puerto de salida centronics a los 8255. Esto nos permitirá mover los datos del puerto centronics, sin que el 8255 vea los cambios hasta que la información esté estable. Esta puerta será abierta a través de la señal WR mediante el Strobe del puerto centronics (pin 1), que pasará a tener la función de WR.

     A su vez U4 y $5 son dos latch de 4 bits que nos permitirán recoger el bus de datos de 8 bits del 8255, y descomponerlo en dos nible. Dado que el puerto centronics no tiene un puerto de 8 bits de entradas sino solo de 4 bits. Por lo tanto usaremos el puerto de estado del centronics para recoger los datos de los 8255, en dos partes, una el nible alto y otra el nibel bajo. Este direccionamiento se hará a través de las señales RDL y RDH que serán controladas por los pines 14 y 16 del centronics. La señal del pin 14 está en el centronics invertida, por lo que para que sea más transparente a nuestro programa la invertimos por hardware mediante el inversor U2B(74LS04). De esta manera en programa consideraremos un 1 lectura, independientemente de que la señale en el centronics la inverta.

    Los diodos D1 y D2 con U2D forman una NOR qye nos permite tener una señal común de lectura para abrir el puerto de lectura de los 82555 tanto si leemos el nible bajo como si leemos el nible alto.

    El U3 es un lacth, o bufer para el almacenamiento del direccionamiento interno de los 8255. En el almacenaremos la dirección del registro al que queremos acceder dentro de los 8255. De este registro solo se usan 3 bits, y el bit alto, bit 2, será el que seleccione el 8255, mientras que los dos bit bajos seleccionan el registro interno dentro del 8255. De esta forma el mapa quedará como 4 direcciones consecutivas. Las cuatro primeas 0-3 direccionan los puertos de U6 y las siguientes 4-7 los puertos del U7.

   Para finalizar indicar simplemente que las resistencias R2,R4,R5 están puestas para asegurar el estado correcto de las señales a falta de señal.

    Esta tarjeta ha sido probada durante mucho tiempo en aplicaciones posteriores, muy complejas. Y puedo garantizar su estabilidad y perfecto funcionamiento.
     
     El esquema es tan sencillo que no resulta difícil fabricarlo en placas pretaladradas, mediante cables soldados. De hecho el primer prototipo lo fabrique así, y todavía funciona. por ello fabricar esta placa resulta muy barato. Por 15€ se puede hacer.

     Aquí tenéis el Esquema en formato PDF.
  
                                   
Prototipo Inicialtarjeta 48IOCENT
Prototipo Inicial tarjeta 48IOCENT

Prototipo Inicial tarjeta 48IOCENT

Prototipo Final tarjeta 48IOCENT