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.
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
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:
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.
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
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.
Interfaz I2C
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 |
![]() |