Construye tu computadora Mínimum.

Parte 2: Diagrama esquemático.

Por: Oscar Toledo Esteva.       Septiembre de 2018.


Cuando se conoce por primera vez el mundo digital, existe el riesgo de ver los árboles y no el bosque, de ver solo laptops, smartphones, o un pequeño algoritmo, olvidando la estructura del tema, el núcleo que cultiva la inteligencia humana en tareas de vanguardia con computadoras de capacidades decididamente sobrehumanas, compuesto de hardware, firmware y software con nidos de algoritmos para los circuitos microelectrónicos que manejan señales análogas al dominio digital. De esto está hecho la computadora Mínimum, útil para el campo educativo, control de mecanismos, programación de algoritmos con instrucciones del microprocesador, manejo de puertas de entradas y salidas para activar señales digitales o analógicas, para predecir el clima, el medio ambiente, construcción de instrumentos de laboratorio, manejo de señales de dispositivos al diseñar productos industriales o nuevas tareas en el area científica y tecnológica. Para crear Mínimum en una dimension de 3x3 centímetros, se construyeron varias computadoras e instrumentos de precisión de diseño propio para comprobar cada etapa del circuito, fabricación del circuito impreso, comunicación con el lenguaje ensamblador, software para ilustrar el uso de los periféricos interno del microprocesador, instrumentos para medir los intervalos de temporización, creación del protocolo para la grabación del MicroSD. UART, I2C, etc, grabación del firmware en la memoria flash interna, y el programa de comunicación con el microprocesador.

Fig 3. Interfaz serializado RS232C para comunicar la computadora anfitrión con el microprocesador. El switch de botón momentaneo reinicia Mínimum desde una locación prefijada para ejecutar el programa del usuario.

En la electrónica digital hay un tercer estado (triestado), es el umbral eléctrico o alta impedancia, y la ausencia de los estados uno y cero binarios, representa la desconexión de la señal de salida en la pata del microprocesador, esta habilidad facilitó que los microprocesadores estuvieran al alcance de todos.

Durante el desarrollo de las primeras computadoras, el triestado era un circuito con diodos bipolares para conducir, bifurcar y desconectar el flujo de datos en computadoras con relevadores, bulbos o transistores. Hoy los microprocesadores usan compuertas lógicas triestado que conectan y desconectan sus señales en nanosegundos, aunque sus patas operativas operan en milisegundos, velocidad suficiente para manejar periféricos externos, y ser analizados los estados lógicos por instrumentos multicanales, sofisticados y costosos. Una alternativa económica es utilizar un detector lógico capaz de detectar en cada pata los tres estados lógicos, además de los pulsos de flancos positivos y negativos.

Fig 4. Diagrama de la computadora Minimum. Las patas de las puertas para entradas y salidas GPIO (General Purpose Input/Output) disponibles del microprocesador al inicio siempre están en el modo para entrada, en el modo para salida y otras funciones alternas deben ser programadas, para visualizar LCD, canales de timer, lineas de control para periféricos, motores paso a paso, CNC, impresoras 3D, robots, drones, teléfonos o automóviles. Algunas puertas son exclusivas para interfazar memorias SD, USB, sensores, teclados, etc.
Foto 4. La computadora Mínimum montada en dos circuitos impresos con el regulador de voltaje, conectores para el interfaz UART, la fuente regulada de 5 voltios, display LCD, memoria SD, y botón RESET.
Foto 5. Circuito impreso de 3x3 centímetros de Mínimum, con pistas de doble capa para los componentes del microprocesador de la computadora, con regulador de voltaje e interfaz RS232, incluye islas de conexión para otros componentes como: condensadores de acoplo, resistencias e inductores contra ruidos eléctricos, diodo para batería, cristales de cuarzo para el reloj calendario y el microprocesador con la precisión para el interfaz USB.

Manejo de puertas de entradas y salidas

Cada patilla del microprocesador corresponde a una puerta programable por el GPIO (General Purpose Input/Output), para manejar señales de entradas o salidas para una función específica, para las señales de periféricos internos o externos, incluyendo señales analógicas. Cada patilla maneja funciones en forma multiplexada, en paralelo o serializado, sería un lujo usar las puertas para conexión en paralelo de memoria externa con 2 megabites, que usaría decenas de patas del microprocesador, por este motivo, los fabricantes de microprocesadores incluyen las memorias internamente.

Cada GPIO agrupa 16 puertas programables en 16 patas, que utiliza una letra como: GPIOA (0) que indica que es el GPIO del grupo A señalando la pata 0 de 0-15 patas. Las puertas pueden manejar desde uno hasta 16 bits de datos en conexión paralela, o miles de bits en comunicación serializada. El microprocesador de Mínimum tiene 10 registros para fijar los parámetros de cada función de las puertas.

Registros para manejar puertas

Indice Función  Significado
  00   MODER    2 bits para la función transmitir o recibir datos
  04   OTYPER   Función para la salida como Open Colector o Push Pull
  08   OSPEEDR  Operación para mínima o máxima velocidad de la puerta
  0C   PUPDR    Activa la puerta a nivel lógico 0 o 1
  10   IDR      Dato con 16 bits de la lectura externa
  14   ODR      Dato con 16 bits para la escritura externa
  18   BSPR     Fija y borra los bits de la puerta
  1C   LCKR     Fija el candado de la puerta
  20   AFRL     16 bits bajos de la función alterna (AF0-AF15)
  24   AFRH     16 bits altos de la funciòn alterna (AF0-AF15)

Al reiniciar el microprocesador la mayoría de los registros de las puertas contienen ceros, por ejemplo: MODER contiene 00 y funcionando como puerta de entrada, cada par de bits cubre los 32 bits para 16 puertas.

MODER   00      Modo para entrada de puerta
        01      Modo para salida de puerta
        10      Modo para una función alterna
        11      Modo análogo de la puerta

El registro MODER (Mode Register) usa dos bits para fijar la función de las 16 puertas. El bit 0 y el bit 1 es para la clave del GPIOC puerta 0, el bit 2 y 3 es la clave del GPIOC puerta 1, y así sucesivamente. Cada grupo de puertas tiene una dirección para colocar la clave de cada registro. La dirección del registro MODER de GPIOC es una cifra hexadecimal de 32 bits = 4002:0800. Al reinicio esta dirección contiene ceros.

4002:0800 = MODER = 0000 0000 hexadecimal

Contenido de MODER y sus funciones

Clave de la función MODER       Bit 31 30 29 28 ... 3  2  1  0

                                    0  0  0  0  ... 0  0  0  0  =  Modo entrada

Puerta                               15    14         1     0

Una vez fijados los parametros del GPIO para una tarea, el siguiente paso es activarlo con la cadencia de trabajo de la frecuencia del microprocesador, para esto se usa el registro RESET A CLOCK CONTROL (RCC), que activa cada GPIO y los demás periféricos disponibles. Por ejemplo; para activar GPIOC, se utiliza el registro Peripheral Clock 1 Enable (RCC_AHB1ENR), con el bit 2=1 se fija el reloj del grupo GPIOC. El binario equivalente se coloca en la dirección base de RCC = 4002:3800 hexadecimal + 30 hexadecimal, correspondiente a RCC_AHB1ENR = 4002:3830. Con esta programación quedan activadas las 16 puertas de GPIOC.

Manejo de instrucciones del microprocesador

La mayoría de los programas para los sistemas computarizados, se escriben con lenguajes de alto nivel, como el C y su compilador que traslada la edición del programador a código binario del microprocesador, incluso en las literaturas C se usa como ejemplo de programación para las escuelas, el otro lenguaje que maneja directamente las instrucciones del microprocesador queda relegado, este lenguaje edita ensamblando las instrucciones con sus iniciales o nemónicos, y su ordenador ilustra las cifras de las direcciones con el código de las instrucciones, además de las etiquetas de convenio, los nemónicos y los comentarios por cada paso del programa.

El lenguaje ensamblador no es fácil de manipular, pero maneja sin obstaculos los códigos del microprocesador, el lenguaje C usa librerías predefinidas para cada microprocesador, que excluye instrucciones especializadas, puertas de entradas y salidas, interrupciones de multitareas o la cadencia de tiempo para un sistema operativo. Aunque manejar directamente los códigos del microprocesador sea arduo, suele ser mas efectivo, mas cuando la velocidad del programa es crítica.

Un lenguaje ensamblador, tiene un editor de texto para la sintaxis de las etiquetas de inicio, bifurcación y las tablas de parámetros del programa, principalmente, los códigos nemónicos con sus valores y una franja para comentarios. Al ordenar la ejecución del programa escrito, toda la sintaxis pasa por un filtro del lenguaje para extraer solo las cifras binarias del código que se almacena en la dirección de la memoria de tareas, listo para ser ejecutado paso a paso.

Los microprocesadores tienen registros para guardar parámetros, traspasar datos a otros registros o almacenarlos en la memoria, cada registro es como una celda de memoria temporal que guarda un código con un valor binario, desde cero hasta un valor de 32 bits.

Minimum tiene un microprocesador con 16 registros básicos de 32 bits cada uno, utiliza tres de ellos para uso exclusivo del procesador al ejecutar las instrucciones, los demás son para uso general. Los registros 0 y 7 son los registros bajos que usan la instrucción MOVS Rd,n, y 8 y 12 son los registros altos, y se abrevian de r0 hasta r15. r13 es el Stack Pointer (SP), guarda la dirección de la parte alta de la memoria para la pila de almacenaje. r14 es el Link Register (LR), guarda la dirección de retorno de la memoria para ser ejecutado al regreso de una subrutina o subprograma. r15 es el Program Counter (PC), que guarda y apunta la dirección de la memoria de la próxima instrucción que será ejecutada. Hay registros especiales, uno de ellos es el registro de estatus XPSR, que activa los banderines condicionantes de un programa.

Grupos de instrucciones para:

Inicialmente las instrucciones usan los registros para fijar sus parametros, en el proceso y el resultado del programa. Las instrucciones tienen un formato que el ensamblador usa para presentar los nemónicos, aquí se ilustran algunas instrucciones con el registro 0:


        MOVS R0,#20             ; Se guarda en R0 un valor de 8 bits, 20 hexadecimal = 32 decimal
        MOVW R0,#2000           ; Se guarda en R0 un valor de 16 bits, 2000 hexadecimal = 8192 decimal
        MOV.W R0,#20000000      ; Se guarda en R0 un valor de 16 bits, 2000:0000 hexadecimal = 536870912 decimal.

En el proceso de programación con Mínimum solo se utilizan instrucciones del microprocesador, cada instrucción es un código binario de 16 o 32 bits, esta clave es una cifra exclusiva de la instrucción, como todos los programas que se ejecutan en las computadoras, tienes códigos precisos llamados software. Al crear y desarrollar un programa, se busca un procedimiento efectivo o algoritmo, que conduzca a la solución de un problema, esto no es nada nuevo, hace más de 2000 años, Euclides observó paso a paso como solucionar problemas matemáticos, ya en el siglo IX, del nombre de un matemático persa, Al-Khwarizmi derivó la palabra algoritmo. Ahora suele ser un método definido para ejecutar programas de computadoras, desde un programa que suma dos números hasta rutinas complejas de coma flotante. Un algoritmo se representa mediante un diagrama de flujo u organigrama, para bosquejar algoritmos complicados y visualizarlos, el algoritmo se expresa en una secuencia de instrucciones llamado código, al escribir el programa se utiliza un lenguaje estructurado de alto nivel -hay docenas de lenguajes de programación- que traduce literalmente del lenguaje cercano al programador las cifras binarias que finalmente son las claves o códigos de las instrucciones del microprocesador.

Por ejemplo: Algoritmo para activar 16 puertas del GPIOC con GPIOC(0) como puerta de salida, fijando los registros GPIOC y RCC_AHBTENR con las instrucciones de Mínimum:


        MOVW R0,#3800
        MOVT R0,#4002   ; R0 = 4002:3800 dirección base del registro RCC_CR
        MOVS R1,#04     ; R1 = 0100 binario, bit 2 = 1 habilita la puerta GPIOC
        STR R1,[R0,#30] ; Valor de R1 se guarda en la dirección 4002:3830 = registro RCC_AHB1ENR
        BIC R0,R0,#3000 ; Ahora R0 = 4002:0800 GPIOC
        MOVS R1,#01     ; R1 = 01 solo GPIOC(0) como un modo de puerta de salida.
        STR R1,[R0]     ; Valor de R1 se guarda en la dirección 4002:0800 y modo de puerta de salida 0 de GPIOC esta activado.

Ilustraremos el algoritmo euclidiano en un programa con Mínimum, este busca el máximo divisor común (MDC) de 2 enteros positivos. El MDC de A = 152 y B = 57 es R = 19, donde 19 es un divisor común de 152 y 57, y también el máximo divisor común.


Comprobación de A y B después de un número finito de pasos.

        152 57 MOD = 38         Primera iteración o ciclo
        57  38 MOD = 19         Segunda iteración o ciclo
        38  19 MOD = 0          Tercera iteración o ciclo = Final 0 Resultado MDC 19

Programa eficiente del máximo divisor común de Euclides en Mínimum, para que resulte fácil de entender se usan los registros bajos para guardar con 8 bits los dos enteros positivos con notación hexadecimal.


        MOVS R0,#98     ; Se guarda en R0 152 decimal
        MOVS R1,#39     ; Se guarda en R1 57 decimal
      X CMP R0,R1       ; Compara y define los valores de R0 y R1
        ITE GT          ; Condiciona los banderines N Z C V
        SUBGT R0,R0,R1  ; GT (Great Then) R0 - R1 si la condición lo permite
        SUBLT R1,R1,R0  ; LT (Less Then) R1 - R0 si la condición lo permite
        BNE X           ; Si R1 = 0, no salta

Salidas de resultados en el registro 0 = 13 = 19 decimal
                            registro 1 = 0
                            registro de estatus XPSR N=0 No hubo número negativo
                                                     Z=1 Hubo cero
                                                     C=1 Hubo acarreo
                                                     V=0 No hubo desbordamiento

 

Artículo anterior Artículo anterior Siguiente artículo Siguiente articulo