Construye tu computadora Mínimum.

Parte 3: Arranque del sistema.

Por: Oscar Toledo Esteva.       Septiembre de 2018.


Como generar frecuencias

Derivado de la frecuencia que genera el registro RCC_CR, con Mínimum es posible producir cinco frecuencias precisas utilizando un pin del microprocesador para la salida y lectura de la frecuencia, en la franja de los bits 26:24 del registro RCC_CFGR (Clock Configuration Register) se coloca la clave binaria del divisor de cada frecuencia, mientras que el registro RCC_AHB1ENR (Peripheral Clock Enable Register) activa la puerta de salida que corresponde a la pata 41 del microprocesador, donde se puede comprobar la lectura de la frecuencia con un frecuencímetro, los pulsos de onda cuadrada con un detector lógico, o ver la frecuencia y la forma de onda en un osciloscopio.

2001:0000 00 C0 01 20     ; Vector a la dirección de la pila
2001:0004 09 00 01 20     ; Dirección + 1 donde empieza el programa

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_GFGR
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]     ; Pulso de ondas cuadradas activado
2001:0024 B 6000:0024     ; Fin del programa y salta en el mismo lugar

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

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

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


Manejo de las puertas de entrada y salida

Cada pin 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. Los pines funcionan en forma multiplexada, en paralelo o serializado, lo cual facilita la creación de proyectos. Minimum tiene varios procesadores independientes que utilizan los pines del microprocesador central, por ejemplo; un 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 lujoso usar las puertas para conectar en paralelo una memoria externa de 2 megabites, que usaría decenas de pines del microprocesador, es un motivo por el que los fabricantes de microprocesadores incluyen 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 16 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 la mayoría de los registros de las puertas contienen ceros, 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, de las 16 puertas cada una ocupa 32 bit

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.


Con un programa se fijan 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 un LED, es una secuencia de instrucciones basada en un algoritmo con los requisitos del microprocesador que vamos a utilizar. El programa comienza con 2 parámetros; el 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 se inicia el volcado de las claves del programa. 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.

Programa para iluminar 8 LEDs

Dirección  Clave máquina  Nemónico        Comentario

2001:0000  00 C0 01 20    Vector a la dirección de la pila
2001:0004  09 00 01 20    Dirección + 1 donde empieza el programa
2001:0008  43 F6 00 00    MOVW R0,#3800   ; Un valor hexadecimal se guarda en
                                          ; el registro R0. MOVW mueve el valor
                                          ; bajo de los 32 bits que maneja R0.
2001:000C  C4 F2 02 00    MOVT R0,#4002   ; Un valor hexadecimal se guarda en
                                          ; el registro R0. 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     ; El valor 4 (binario 0100) activa las
                                          ; puertas C. R1 = 0000 0004
2001:0012  01 63          STR R1,[R0,#30] ; El valor colocado en R1 se almacena
                                          ; en la dirección 4002:3800 + 30 hex
                                          ; = 4002:3830. Este valor es la dirección
                                          ; del microprocesador para
                                          ; activar la 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 las puertas C
2001:0018  45 F2 55 51    MOVW R1,#5555   ; 01 01 01 01 01 01 01 01 = Bit 7:0
                                          ; Modo de salida de GPIOC del bit 7
                                          ; hasta 0
2001:001C  01 60          STR R1,[R0]     ; La salida de GPIOC (bit 7-0) están
                                          ; activadas y los LEDs iluminados
2000:001E  F2 E7          B 2001:001C     ; Programa detenido


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, en su caso se pueden usar 180 ohms, 270 ohms o 330 ohms. Con la resistencia alta la carga de consumo 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.

Conector para periféricos

Conector para experimentos y periféricos externos.

Es necesario tener un conector para crear experimentos externos y 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 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 el dato visualizado. El conector ilustrado suministra todos los pines, dos de ellos alimentan con 5V los dispositivos conectados.



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.

Para las personas que manejan tarjetas comerciales y utilizan lenguaje C, les será fácil interfazar Mínimum con su laptop. A los programadores novatos les puede tomar semanas 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. Los países modernos mueven su economía con sistemas similares a la computadora Mínimum, su ciencia y tecnología son impresionantes, fruto de grandes esfuerzos y como en toda revolución: los inventos, las innovaciones y las nuevas tecnologías crean nuevos ganadores y perdedores, las verdaderas innovaciones se crean en pequeños laboratorios y raras veces aparecen en los medios de comunicación, pero transforman el mundo, aunque no las compremos o las utilicemos. De este lado es notorio como pueblo y gobierno no responden a las circunstancias cambiantes sea por ignorancia o entretenidos en sus intereses particulares, solo consumen productos importados de países que poseen la tecnología digital, que se cobran con divisas de origen hundiendo la economía nacional. Los científicos que trabajan con tecnología para un mundo mejor, investigan y diseñan incluso con algoritmos creados hace cientos de años, continúan en la búsqueda para combatir virus o 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, capaces de proyectar sus respuestas en un anteojo. Como cualquier otra rama de la ciencia, es resultado del trabajo de generaciones de hombres, Minimum es la herramienta adecuada para aventurarse en la investigación, diseño, producción y venta de productos digitales, la electrónica digital puede ser una vivencia vocacional que produce nuevos conceptos en mentes brillantes que honran su trabajo. Podemos ignorar la ciencia y la tecnología, pero nunca podremos evitar sus consecuencias.


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.

Bibliografía:

 

Artículo anterior Artículo anterior