Construye tu computadora Mínimum.

Parte 2: Diagrama esquemático.

Por: Oscar Toledo Esteva.       Septiembre de 2018.


Al descubrir el mundo digital, existe el riesgo de ver los árboles y no el bosque, de ver solo teléfonos o computadoras, olvidando la estructura principal, el núcleo de la computadora con capacidades sobrehumanas, que desafia nuestra inteligencia en la hechura de algoritmos con el hardware, firmware y el software, capaz de manejar en tiempo real las señales análogas al dominio digital. Minimum cumple con estas funciones para el area educativa, 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 utilizaron varias computadoras e instrumentos de precisión de diseño propio para comprobar cada etapa del circuito electrónico, fabricación del circuito impreso con cobre, 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, interface gráfico a color, 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 al microprocesador con la computadora anfitrión. El switch de botón momentaneo reinicia Mínimum desde una locación prefijada para ejecutar el programa del usuario.

La electrónica digital maneja los dos estados conocidos: "cero", "uno" y un tercer estado llamado "Z", que significa alta impedancia o 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. Los circuitos triestado facilitaron la creación de las puertas programables, aceptando que una pata del microprocesador tenga diversas funciones como: señales de entrada, salida o análogo, para que sea cómodo diseñar proyectos prácticos en pequeños espacios. La mayoría de los fabricantes están de acuerdo que todas las patas del microprocesador en su función inicial estén en el modo entrada, exceptuando las patas de control. Un circuito interno de una pata del microprocesador ocupa dos compuertas triestado programables con interruptores lógicos para las señales de entrada o salida, estos se activan para recibir o transmitir señales con nivel eléctrico alto (pull-up) o nivel bajo (down), además, la programación de la velocidad que el interfaz externo puede soportar.

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 un detector lógico capaz de detectar en cada pata los tres estados lógicos, además 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 la frecuencia del reloj calendario y la frecuencia del interfaz USB del microprocesador.

Manejo de puertas de entradas y salidas

Cada patilla del microprocesador es una puerta programable del GPIO (General Purpose Input/Output), que maneja señales de entradas o salidas para una función específica de los periféricos integrados o externos, incluyendo señales analógicas. Las patillas manejan funciones en forma multiplexada, en paralelo o serializado, lo cual es importante tener en cuenta a la hora de crear un desarrollo. Minimum tiene varios procesadores que utilizan las patillas del microprocesador central, por ejemplo; un UART requiere por lo menos dos patas del GPIO, mientras un controlador SD para uso profesional utiliza 6 o 8 GPIOs, de esta manera el GPIO será exclusivo para los interfaces elegidos, y lo que resta del GPIO no debe interferir con los GPIO de controladores asignados por el microprocesador. Por ejemplo, las patas para PC12, PC11, PC10, PC9, PC8 y PD2 son exclusivas para el controlador de memoria MicroSD, una vez ocupadas para esta función no pueden ser utilizadas para otra tarea. Es 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 internamente las memorias.

Cada GPIO agrupa 16 puertas programables en 16 patas indicado por una letra, GPIOA (0) es del grupo A señalando la pata 0 de 0-15 puertas. Cada puerta maneja 16 bits de datos en conexión paralela, o miles de bits en comunicación serializada. Mínimum tiene 10 registros para cada grupo; A, B, C y D del GPIO, para programar los parámetros de cada función del microprocesador.

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 un par de ceros para cada puerta ocupando los 32 bit para 16 puertas (0-F), la clave 00 indica que el modo de operación es entrada de una señal externa.

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 convenientes para los nemónicos y los comentarios de cada linea del programa.

El lenguaje ensamblador no es fácil de manipular, pero maneja directamente 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 ejecutar el 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 por el microprocesador.

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. El microprocesador de Mínimum usa en sus instrucciones la arquitectura de cargar y almacenar (Load and Store) en sus registros, al construir programas con el repertorio de instrucciones ningún registro se puede utilizar sin antes colocar un dato al registro, que posteriormente se almacena en la memoria, en el proceso mueve el valor binario con el primer operando del registro. El valor para la instrucción MOVS cubre el rango de un grupo de 8 bits = 1 byte para cubrir la cuarta parte de 32 bits, Por ejemplo: MOVS R1,#04 coloca el valor 4 al registro R1. Por lo tanto 0 4 = 0000 0100 binario, equivale a dos valores hexadecimales como lo indica la tabla de conversión numérica. Se utilizan 16 registros de 32 bits cada uno, donde los registros 0 y 7 son los registros bajos que usan la instrucción MOVS Rd,n, R8 hasta R12 son los registros superiores para uso general, mientras que R13 hasta R15 son los registros especiales del microprocesador.

El registro 13 (R13) es de uso exclusivo para Stack Pointer (SP) que guarda la direcciòn de la pila de memoria, R13 comparte dos funciones como indicador; la pila principal (Main Stack MSP) y la pila de procesos complejos (Process Stack PSP). En el arranque inicial, el microprocesador utiliza la pila MSP, el programador siempre fija la dirección de SP en la parte superior de la memoria disponible para los programas. R13 apila datos de 32 bits de la parte superior a la inferior de la memoria de trabajo, para salvar el contenido de un registro este se guarda en la pila de memoria que maneja SP, y en automático se pueden almacenar los retornos de subprogramas o subrutinas con la instrucción apropiada, igual que una cadena de datos de los registros, cada locación de memoria ocupada desciende 32 bits el indicador del registro SP. Al meter y sacar datos de los registros se utilizan las instrucciones PUSH y POP, otras instrucciones pueden guardar y obtener el contenido de multiples registros de la pila de memoria. R14 es el Registro de Enlace (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, como el XPSR (Program Status Register) que activa las cinco banderas principales o banderines: N (Negative), Z (Zero), C (Carry), V (Overflow) y Q (Saturation).

La bandera N se pone a 1 si el resultado de una cifra de 32 bits es negativo, de lo contrario N = 0. El bit 31 = 1 significa que es un número negativo, 31 = 0 es un número positivo.
La bandera Z se pone a 1 si el resultado de una cifra es 0, de lo contrario Z = 0.
La bandera C se pone a 1 si ocurre un acarreo en un resultado aritmético, de lo contrario C = 0.
La bandera V se pone a 1 si ocurre un desborde aritmético en la frontera del bit 31, de lo contrario V = 0.
La bandera Q se pone a 1 si las instrucciones SSAT o USAT causan saturación, de lo contrario Q = 0.

El registro XPSR tiene una franja de bits para examinar las banderas. Bit 31 = N, bit 30 = Z, bit 29 = C, bit 28 = V y bit 27 = Q. Bit 19:16 son banderas de GE (Greater-Equal) que indican: igual o mayor que, para instrucciones DSP (Digital Signal Processing), bit 8:0 indica con número hexadecimal mas de 256 errores de programación, que pueden ocurrir al realizar programas. Es necesario un programa externo especial llamado depurador que ayuda al programador para ver donde y porque ocurre un error.

Solo la instrucción MRS puede leer el contenido de los registros especiales. Por ejemplo:

MRS R0,XPSR ; Lee en el registro 0 las banderas del registro especial XPSR.
              Bit 31 30 29 28 27... 0
                   N  Z  C  V  Q

El resultado de una operación con instrucciones de aritmética, lógicas, comparaciones de datos, desplazamiento y rotaciones de bits, activan las banderas de XPSR que deciden la dirección de las bifurcaciones de los saltos condicionantes.

Instrucción para activar dos banderas

CMP.W R0,#80000000 ; El valor de R0 se compara con 8000:0000.
                   ; El resultado es un desbordamiento y el bit 31 = 1
                   ; indica que es un número negativo y por lo tanto N=1 V=1

Los principales grupos de instrucciones son:

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 del microprocesador, 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 directo o algoritmo, que conduzca a la solución de un problema, este método no es nada nuevo, hace más de 2000 años, Euclides observó paso a paso como solucionar problemas con matemáticas, ya en el siglo IX, del nombre del matemático persa Al-Khwarizmi derivó la palabra algoritmo. Ahora suele ser un método definido para desarrollar programas de computadoras, desde un programa que suma dos números enteros hasta rutinas complejas con coma flotante. Un algoritmo se representa mediante un diagrama de flujo u organigrama, para bosquejos complicados y visualizarlos, el algoritmo se puede expresar 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: Este es un algoritmo que activa 16 puertas del GPIOC con la puerta 0 como 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, el bit 2 = 1 para activar 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 es la clave de GPIOC(0) para el modo de puerta de salida.
        STR R1,[R0]     ; Valor de R1 se guarda en la dirección 4002:0800 y la puerta de salida 0 de GPIOC se activa.

Ahora ilustramos el algoritmo euclidiano con un programa de Mínimum, donde se busca el máximo divisor común (MDC) de 2 enteros positivos. El MDC de A = 152 y B = 57 el resultado es 19, o el 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.

        A 152 57 MOD = 38         Primera iteración o ciclo
        B 57  38 MOD = 19         Segunda iteración o ciclo
        R 38  19 MOD = 0          Tercera iteración o ciclo,si final es = 0 el resultado de MDC es 19

Programa eficiente del máximo divisor común de Euclides en Mínimum, en este ejemplo se usaron cifras con 8 bit (desde 0 hasta 255), los enteros positivos están escritos con notación hexadecimal.

        MOVS R0,#98     ; R0 = A (152 decimal)
        MOVS R1,#39     ; R1 = B (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 menos R1 si la condición lo permite
        SUBLT R1,R1,R0  ; LT (Less Then) R1 menos 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