Construye tu computadora Mínimum.

Parte 3: Arranque del sistema.

Por: Oscar Toledo Esteva.       Septiembre de 2018.


Programación de puertas de entrada y salida

Cada pata del microprocesador puede transmitir, recibir o bloquear una señal digital, el GPIO (General Purpose Input/Output) del microprocesador ya programado habilita que la pata se vuelva entrada o salida para una función específica de un periférico o para una función alterna, y puede recibir o emitir señales análogas. Las patas o pines también se programan para usos multiplexados, con conexión en paralelo o serializado, que facilita cualquier proyecto de control. Minimum incluye procesadores independientes que utilizan pines asignados por el microprocesador central, por ejemplo; un procesador UART requiere por lo menos dos pines 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, los pines para PC12, PC11, PC10, PC9, PC8 y PD2 son exclusivos para el controlador de memoria MicroSD, una vez ocupados para esta función no deben ser utilizados para otra tarea. Es necesario usar un microprocesador de 208 patas para que las puertas conecten en paralelo una memoria externa de 2 megabites, que ocuparía decenas de pines del microprocesador, motivo por el que los fabricantes de microprocesadores ya incluyen las memorias internamente.

Cada GPIO es un grupo de 16 puertas programables con 16 pines indicado por una letra, GPIOA (0) es del grupo A señalando el pin 0 de 0-15 puertas. Cada puerta maneja hasta 32 bits de datos en conexión paralela, o miles de bits en comunicación serializada. Mínimum tiene 10 registros para cada grupo del GPIO, estos programan 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 entrada o salida de 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 un candado de una 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 los registros de las puertas contienen ceros por omisión, por ejemplo: Al principio MODER contiene un par de ceros, que es la clave 00 para el modo de entrada de una señal externa, cada registro maneja 16 puertas y cada una es de 32 bits.

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. 4002:0800 es la dirección del registro GPIOC MODER. Al reinicio esta dirección contiene ceros.


Hay que programar y fijar los parametros del GPIO para una tarea con los pines del microprocesador, luego se fija la cadencia de la frecuencia con el registro RESET A CLOCK CONTROL (RCC), este activa los periféricos disponibles y los GPIOs. Para trabajar con el GPIOC se utiliza el registro Peripheral Clock 1 Enable (RCC_AHB1ENR), que con el bit 2=1 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. Al habilitar el GPIOC quedan activadas sus 16 puertas en sus 16 pines.

Por ejemplo: Este programa activa las 16 puertas del GPIOC, luego la puerta 0 se activa como salida para enviar datos, esto se realiza con el registro RCC_AHB1ENR que selecciona al GPIOC para una tarea.

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 ; Borra dos bits, ahora R0 = 4002:0800 GPIOC MODER
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.

Un programa para encender 8 LEDs, es una secuencia de instrucciones basada en un algoritmo, y comienza fijando 2 datos de 32 bits del vector para la pila de memoria del microprocesador y el vector +1 que apunta a la dirección donde comienza el programa principal. Con la orden W del debug las claves del programa se trasladan a la memoria del microprocesador, y la orden G ejecuta el programa.

W 20010000 = Orden W (Write) luego 20010000 (dirección del inicio del programa)

G 20010000 = Orden G (Go) luego 20010000 (dirección del inicio del programa)

Una vez depositado el programa, se envía la orden G con 20010000 y se ejecuta el programa. Oprimir el botón del RESET apaga el LED, interrumpe el programa y reinicia el microprocesador.

Computador Mínimum con regulador de voltaje e interface RS232. Integrados en una placa impresa.

Como generar frecuencias

Cuando el microprocesador de Mínimum opera con 16 MHZ, esta frecuencia puede ser dividida entre 1, 2, 3, 4 y 5, generando frecuencias precisas con la programación del registro de control del reloj RCC_CR (RCC Clock Control Register), se utiliza un pin como salida para leer las frecuencias en los bits 26, 25 y 24, donde se coloca la clave binaria del divisor de cada frecuencia del registro RCC_CFGR (RCC Clock Configuration Register) que activa la puerta de salida en la pata 41 del microprocesador, aqui se coloca la punta de prueba para medir con un frecuencímetro el valor de la frecuencia, con un detector lógico se detectan los pulsos negativos y positivos, mientras que con un osciloscopio se grafica la onda cuadrada de la frecuencia.

2001:0000 00 C0 01 20     ; Dato del vector a la dirección de la pila
2001:0004 09 00 01 20     ; Dato de la dirección + 1 donde empieza el programa
                          ; Lo que sigue son instrucciones del microprocesador
2001:0008 MOVW R0,#3800   ; 4002:3800 registro (RCC_CR)
2001:000C MOVT R0,#4002   ;
2001:0010 MOVT R1,#400    ; Bit 26:24 Clave del divisor Ej. Bit 26 = 1 (8 mhz)
2001:0014 STR R1,[R0,#8]  ; 4002:3808 RCC_CFGR
2001:0016 MOVS R1,#01     ; Bit 0 = 1 activa las puertas de GPIOA
2001:0018 STR R1[R0,#30]  ; 4002:3830 GPIOA activado
2001:001A BFC R0,#0,#10   ; BFC (Bit Field Clear) borra una franja de 16 bits
                          ; (10 hexadecimal) y R0 = 4002:0000 GPIOA MODER
2001:001E MOVT R1,#2      ; Puerta 8 = 10b función alterna para emitir
                          ; la frecuencia
2001:0022 STR R1,[R0]     ; Salida de una frecuencia de 8 MHZ
2001:0024 B 6000:0024     ; Salto sin fin y final del programa

Franjas bit 26, bit 25, bit 24 para las claves del divisor:

000 Divisor 1 = 16 mhz
100 Divisor 2 = 8 mhz
101 Divisor 3 = 5.333 mhz
110 Divisor 4 = 4 mhz
111 Divisor 5 = 3.2 mhz

Programa para iluminar 8 LEDs

Dirección  Clave máquina  Nemónico        Comentario

2001:0000  00 C0 01 20                    ; Vector que indica la dirección de la pila
2001:0004  09 00 01 20                    ; Dirección + 1 donde empieza este programa
2001:0008  43 F6 00 00    MOVW R0,#3800   ; Cifra hexadecimal en R0 para
                                          ; el registro RCC_CR. MOVW mueve el valor
                                          ; bajo de los 32 bits que maneja R0.
2001:000C  C4 F2 02 00    MOVT R0,#4002   ; Cifra hexadecimal en R0 para
                                          ; el registro RCC_CR. MOVT mueve el valor
                                          ; alto de los 32 bits que maneja R0.
                                          ; La instrucción MOVT no borra el valor
                                          ; bajo del registro.
2001:0010  04 21          MOVS R1,#04     ; La cifra 4 (binario 0100) = 0000:0004
                                          ; de R1 activa la puerta GPIO C.
2001:0012  01 63          STR R1,[R0,#30] ; La cifra de R1 se almacena
                                          ; en la dirección 4002:3800 + 30 hex
                                          ; = 4002:3830. RCC_AHB1ENR.
                                          ; Que es la clave para
                                          ; activar las 16 puertas del GPIO C
2001:0014  20 F4 40 50    BIC R0,R0,#3000 ; Esta instrucción borra los bits 12 y 13
                                          ; del registro R0. BIC significa
                                          ; "borrado de bits", al borrar los 2 bits
                                          ; de R0, su contenido se modifica y
                                          ; R0 = 4002:0800. Esta es la dirección
                                          ; para operar los bits de la puerta C
2001:0018  45 F2 55 51    MOVW R1,#5555   ; 01 01 01 01 01 01 01 01 = Bit 7 a 0
                                          ; Clave para fijar la salida del
                                          ; GPIOC para bit 0 hasta el bit 7
2001:001C  01 60          STR R1,[R0]     ; GPIOC activado como salida, bit 7-0
                                          ; y sus patas 38, 37, 23, 24, 11, 10, 9 y 8
                                          ; iluminan 8 LEDs
2001:001E  01 21          MOVS R1,#01     ; R1 = 1
2001:0020  C9 04          LSLS R1,R1,#13  ; R1 = 80000 como contador de retardo
2001:0022  01 39          SUBS R1,#01     ; Decrementa R1 a 1
2001:0024  FD D1          BNE 2001:0022   ; Salta hasta que el contador = 0
2001:0026  01 60          STR R1,[R0]     ; R1 = 0 Apaga 8 LEDs por milisegundos
2001:0028  01 21          MOVS R1,#01     ; R1 = 1
2001:002A  C9 04          LSLS R1,R1,#13  ; R1 = 80000 como contador de retardo
2001:002C  01 39          SUBS R1,#01     ; Decrementa R1 a 1
2001:002E  FD D1          BNE 2001:0022   ; Salta hasta que el contador = 0
2001:0030  F2 E7          B 2001:0018     ; Retorna y repite la secuencia


La lógica del programa habilita los 16 bits de la puerta C y activa la puerta C0 como linea de salida (PC0) que corresponde al pin 8 del microprocesador. Al reiniciar el microprocesador, el registro GPIO ODR contiene por omisión la lógica 0, equivalente al polo negativo de los 3.3V positivos. La corriente de una puerta de salida del GPIO es limitada, en cada microprocesador de diferentes fabricantes varia de 10 mA (miliamperes) a 40 mA. Minimum se alimenta con 3.3 voltios y cada puerta de salida soporta 25 mA. Un led que consume 10 mA. con 1.7 voltios, es adecuado para una puerta de salida, para proporcionar la corriente de consumo se elige el valor en ohms de la resistencia del led. Usando la relación matemática entre voltaje (V), corriente (I), y la resistencia (R), esto, con la ley de George Simon Ohm es:

       V    (3.3V - 1.7 V del led)
   R = —                            (R = ohms)
       I    (consumo del led en mA)

        3.3-1.7
 160 =  ———————
         .010

Una resistencia de 160 ohms es difícil de conseguir, se puede reemplazar con 180 ohms, 270 ohms o 330 ohms. Con una resistencia mayor el consumo de la carga se reduce a 4.8 mA, lo explica:

       V
   I = —
       R

Si se conecta un transistor al GPIO, puede manejar en su salida cargas inductivas o resistivas con una corriente y voltaje elevado hasta el limite especificado por el transistor.

Volviendo a las primeras computadoras, el primer dato del programa estaría escrito con números binarios para operar 32 interruptores de palancas:

        0000 0000 1100 0000 0000 0000 0001 0010 0000 = 20 00 C0 00 hexadecimal
Conexión del LED controlado por la computadora Mínimum, la resistencia de 330 ohmios limita la corriente a los miliamperios que el LED necesita. El LED conectado a PC0 que corresponde al pin 8 se enciende cuando PC0 es igual a cero, es el lado negativo del voltaje del LED, y el lado positivo es el voltaje de 3.3 voltios.

Activando o desactivando sincrónicamente varios LEDs, se pueden crear adornos o imágenes llamativas ocupando miles de lineas de código, programas bien elaborados obtienen ganancias similares a varios barriles de petróleo.

El programa "Como generar frecuencias" con el programa "Para iluminar ocho LEDs" se pueden juntar como multitarea en una sola ejecución. Un microprocesador solo puede ejecutar una tarea a la vez, cuando interviene un sistema operativo, este por medio de un interruptor selecciona en milisegundos varias tareas y puede hacer parecer que cada tarea es ejecutada al unísono con las otras, creando la ilusión de una poderosa computadora multitarea.

Formato de punto flotante para 32 bits


El conjunto de números racionales y los números irracionales que pertenecen al conjunto de los números reales los manejan las instrucciones de punto flotante del microprocesador Mínimum, donde los algoritmos obtienen una precisión óptima, ya sea números enteros, fraccionarios, naturales y naturales negativos, se procesan en microsegundos.

El formato usa 32 bits fraccionados para colocar un bit como indicador del signo, 8 bits como exponente y 23 bits para la fracción significativa del número procesado. 127 es la constante del exponente y cada cifra produce un desplazamiento que aporta un exceso para ser sumado con la constante, esto facilita codificar la fracción significativa donde cada bit opera como un valor exponencial que son sumados en su conjunto.

En una conversión de un decimal siempre se utilizan números binarios, desde el origen hasta el resultado, un decimal tecleado por un usuario de la computadora oculto por el microprocesador es convertido a binario, si tenemos el decimal 25.25 este de inmediato es fraccionado en dos partes binarias con un punto decimal por las instrucciones del microprocesador de punto flotante para 32 bits, como se indica:


A continuación el punto flotante es desplazado a la izquierda.


Luego el punto decimal se desplaza a la izquierda hasta situarse junto al bit mas significativo de la cifra binaria.


En esta cifra del binario fraccionado fueron desplazados 4 bits por el punto decimal, el bit mas significativo se guarda temporalmente para ser utilizado al codificar la cifra de 32 bits, quedando solo la fracción significativa.


Valores de la posiciones de la fracción significativa.

El valor 4 de los bits desplazados es el exponente que se agrega al constante 127 de 8 bits, de esto 4 se multiplica y luego multiplicado con la suma de la fracción significativa, de acuerdo a la siguiente formula: S es el signo positivo si es 0, o negativo si es 1, e como exponente, 1 es el bit mas significativo guardado temporalmente + F que es la suma de los bits de la fracción significativa (solo el binario indicado con un bit igual a 1).


Programar con punto flotante

El repertorio de las instrucciones de punto flotante cuenta con su propio registro de estatus, 32 registros para intercambiar datos, además de 128 constantes inmediatas de los primeros multiplos de 4, 8, 16 y 31, como un procesador aparte del procesador central. Para usar las instrucciones del punto flotante solo hay que activar el acceso a través de un programa con siete instrucciones, hecho esto, se crean programas como el siguiente:

Programa para inicializar instrucciones de punto flotante

MOVW R0,#ED00      ; Registro SCB CPACR (E000:ED00)
MOVT R0,#E000      ;
LDR R1,[R0]        ; SCB CPACR
ORR R1,R1,#F00000  ; Clave para habilitar CP10 y CP11 Bit 23:20
STR R1,[R0,#]      ; SCB CPACR
DSB                ; Sincronización de datos
LSB                ; Sincronización de instrucciones


Conector para experimentos

Conector para experimentos y periféricos externos.

Se necesita un conector para crear experimentos externos que pueda usar las puertas apropiadas para las señales que son frecuentes en las tareas para conectar sensores, pantallas LCD u OLED, teclados y otros periféricos que manejan protocolos de conexión serializados. Los graficadores LCD funcionan con 4 y 8 bits de datos (D0-D7), con un pin se habilita el LCD, otro controla la escritura y lectura del dato, con otro pin se activa un dato de orden y 8 pines para las ordenes o los datos graficados. El conector ilustrado suministra todos los pines, dos de ellos alimentan con 5V los dispositivos conectados.

LCD de 16x2 carácteres para el conector de Mínimum.



LCD con 16 caracteres y 2 lineas con sus claves de inicio para recibir datos ASCII (American Standard Code for Information Interchange)

La computadora Mínimum montada en un circuito impreso y su regulador de voltaje, conectores para periféricos, interfaz UART, fuente regulada de 5 voltios, memoria SD, y el botón RESET.

Interfaz I2C

Conexión de Mínimum con display OLED.

Computadora Minimum con pantalla LCD que ilustra paso a paso los valores de los registros del microprocesador, para diseñar, optimizar y construir software que descubre la magia y el misterio que animan la creación de un sistema operativo. Esto es un laboratorio de prácticas con software para aprender y enseñar en una sola placa.

Los que ya usan tarjetas de desarrollo comerciales, les será fácil interfazar Mínimum con su laptop. A los programadores novatos les puede tomar mas tiempo establecer una conexión con el microprocesador con el arte perdido del lenguaje ensamblador, afortunadamente, la computadora no se daña con una mala programación. La instrucción para los nuevos conocimientos es un proceso comunicativo y complejo, en la literatura especializada hay pocos ejemplos prácticos para programar determinados microprocesadores, para que el usuario elija adecuadamente sus materiales del diseño. La economía de los países emergentes es impulsada por estas tecnologías, crean zonas para fomentar start-ups de vanguardia, que demandan un conocimiento muy sofísticado, industrias dinámicas que crecen, se fusionan, y otras quiebran, con planes de negocios en evolución contínua, con financiamiento de capital de riesgo, venta de acciones, y lanzan productos a un mercado vertiginoso, mas que el de las industrias convencionales, cada nación quiere adoptar a Silicon Valley como modelo para construir su industria de alta tecnología, muchas veces olvidan que la información sobre el dinero es mas importante que el propio dinero, y sus bancos pueden quebrar si no ven esta diferencia, no se logrará dominar la tecnología sin el apoyo de una gran inversión en documentación, componentes e instrumentos para la investigación, diseño y fabricación de herramientas. Las empresas seguirán compitiendo si adquieren, desarrollan, y utilizan nuevos conocimientos mas rápido que sus competidores, este talento no es abundante en estos dias, pero de el depende nuestro futuro. De este lado pueblo y gobierno aplazan su futuro al no responder a las circunstancias cambiantes sea por ignorancia o entretenidos en sus intereses particulares, son consumidores de países que producen tecnología digital, que se cobran con divisas de origen que hunde la economía nacional. Los científicos que trabajan con tecnología para un mundo mejor, investigan y diseñan incluso con algoritmos descubiertos hace cientos de años, continúan en una búsqueda incesante para combatir enfermedades, descifrar glifos antiguos, o descubrir nuevos materiales y su transformación, así como la mecánica evolucionó a los relevadores eléctricos, los bulbos a transistores y hoy los circuitos integrados, que son capaces de proyectar sus respuestas en un anteojo. Como cualquier otra rama de la ciencia, es resultado del trabajo de generaciones de hombres, quizá ignoremos la ciencia y la tecnología, pero nunca podremos evitar sus consecuencias. Minimum es la herramienta adecuada para aventurarse en la investigación, diseño, producción y venta de productos digitales, esta ciencia es el nuevo heraldo del impulso creativo que siempre trabaja para el futuro.


Bibliografía:

 

Artículo anterior Artículo anterior