Tabla de contenido:
- Paso 1: Saltemos de inmediato
- Paso 2: mejorar el código: agregar una función
- Paso 3: agregue un retardo de bucle ocupado
- Paso 4: Estándar de llamada a procedimiento de arquitectura ARM (AAPCS)
- Paso 5: Función con parámetro - Funciones anidadas
- Paso 6: Entrada GPIO - Agregar interruptores
Video: PARTE 2 - ENSAMBLE DEL BRAZO GPIO - RGB - LLAMADAS A FUNCIONES - Interruptores: 6 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:43
En la Parte 1, aprendimos cómo alternar un solo LED rojo en la placa de desarrollo MSP432 LaunchPad de Texas Instruments, usando ensamblaje en lugar de C / C ++.
En este Instructable, haremos algo similar: controlar un LED RGB que también está en esa misma placa.
En el camino, esperamos ampliar nuestros conocimientos sobre el ensamblaje de ARM, y no solo divertirnos encendiendo algunos LED.
Paso 1: Saltemos de inmediato
Realmente, el primer video lo dice todo. No hay mucho más que agregar.
El punto principal de esto es llevar a casa la idea de que cada puerto de E / S en el MSP432 consta de un bloque de direcciones de "registro", que a su vez constan de varios bits cada uno.
Además, los bits se agrupan de forma ortogonal. Es decir, el bit 0 de cada dirección de registro se refiere al mismo pin de E / S externo.
Repetimos la idea de que se necesitan varias direcciones de registro para ese puerto, para hacer algo incluso con un solo bit o pin.
Pero que en este caso, dado que estamos tratando con un LED RGB, necesitamos lidiar con tres bits para cada dirección de registro.
Reforzamos que necesitamos varios registros: el registro DIR, el registro SEL0, el registro SEL1 y el registro OUTPUT. Y tres bits cada vez.
Paso 2: mejorar el código: agregar una función
Como vio en el paso anterior, el ciclo principal del programa tenía mucho código repetido, es decir, cuando apagamos los LED.
Entonces podemos agregar una función al programa. Todavía tenemos que llamar a esa función cada vez que queremos apagar los LED, pero hace que parte del código se colapse en una sola declaración.
Si nuestro código de LED apagado hubiera estado más involucrado con muchas más instrucciones, esto hubiera sido un verdadero ahorro de memoria.
Parte de la programación integrada y los microcontroladores es ser mucho más consciente del tamaño del programa.
El video lo explica.
Esencialmente, agregamos una declaración de ramificación a nuestro código principal y tenemos otro bloque de código que es la función a la que nos ramificamos. Y luego, una vez que hayamos terminado, o al final de la función, volvemos a la siguiente instrucción dentro del programa principal.
Paso 3: agregue un retardo de bucle ocupado
En la sección Declaraciones del código, agregue una constante para facilitar el ajuste del tiempo deseado:
; cualquier palabra después de un punto y coma (';') comienza un comentario.
; el código de esta parte asigna un nombre a un valor.; también podría haber usado '.equ' pero son ligeramente diferentes.; '.equ' (creo) no se puede cambiar, mientras que '.set' significa que sí; cambie el valor de 'DLYCNT' más adelante en el código si lo desea.; 'DLYCNT' se utilizará como valor de cuenta atrás en la subrutina de retardo. DLYCNT.set 0x30000
Agregue una nueva función de retardo:
retraso:.asmfunc; el inicio de la subrutina o función 'retardo'.
MOV R5, #DLYCNT; cargue el registro R5 de la CPU del núcleo con el valor asignado a 'DLYCNT'. dlyloop; esto marca el inicio del bucle de retardo. El ensamblador determina la dirección. SUB R5, # 0x1; reste un 1 del valor actual en el registro de la CPU del núcleo R5. CMP R5, # 0x0; compare el valor actual en R5 con 0. BGT dlyloop; bifurcar si el valor en R5 es mayor que 0, para etiquetar (dirección) 'dlyloop'. BX LR; si llegamos hasta aquí, significa que el valor de R5 era 0. retorno de la subrutina..endasmfunc; marca el final de la subrutina.
Luego, en el cuerpo principal, dentro del bucle principal, invoque o llame a esa función de retardo:
; este es un fragmento de código, del cuerpo principal o de la función principal (ver archivo 'main.asm').
; este es un bucle en 'main', y muestra cómo llamamos o usamos esa nueva función de 'delay'.; el '#REDON' y '#GRNON' también son declaraciones (constantes) (vea la parte superior de 'main.asm').; son solo una forma fácil de configurar el color especificado de LED RGB. loop MOV R0, #REDON; Red: establece el registro de la CPU del núcleo R0 con el valor asignado a 'REDON'. STRB R0, [R4]; el registro central R4 se configuró previamente con una dirección de salida GPIO.; escriba lo que hay en R0, en la dirección especificada por R4. Retardo BL; bifurca a la nueva función de 'retardo'. BL ledsoff; bifurca a la función 'ledsoff' preexistente. Retardo BL; lo mismo con MOV R0, #GRNON; Verde - lo mismo con STRB R0, [R4]; etcétera. BL retardo BL ledsoff BL retardo
El video entra en detalles.
Paso 4: Estándar de llamada a procedimiento de arquitectura ARM (AAPCS)
Probablemente sea un buen momento para presentar algo. Es una convención de lenguaje ensamblador. También conocido como el estándar de llamada a procedimiento para la arquitectura ARM.
Hay mucho en esto, pero es solo un estándar. No nos impide aprender a programar en ensamblador, y podemos adoptar partes de ese estándar a medida que avanzamos, una vez que nos sintamos cómodos con algunos conceptos que estamos aprendiendo.
De lo contrario, podríamos sentir que estamos bebiendo de una enorme manguera de agua. Demasiada información.
Registros básicos
Ya que nos hemos familiarizado con los registros centrales del MSP432, intentemos adoptar ahora algunos de estos estándares. Nos ajustaremos a esto cuando escribamos la siguiente función (encender / apagar un LED).
1) Se supone que debemos usar R0 como un parámetro de función. Si deseamos pasar un valor a la función (subrutina), debemos usar R0 para hacerlo.
2) Debemos utilizar el Registro de enlaces para el propósito previsto: contiene la dirección que indica a dónde regresar después de que se complete la subrutina.
Verás cómo las aplicamos.
Paso 5: Función con parámetro - Funciones anidadas
Podemos limpiar nuestro código y reducir la cantidad de memoria que ocupa combinando secciones repetidas en una sola función. La única diferencia en el cuerpo del bucle principal es que necesitamos un parámetro para poder pasar los diferentes colores que queremos ver del LED RGB.
Eche un vistazo al video para obtener más detalles. (perdón por la longitud)
Paso 6: Entrada GPIO - Agregar interruptores
Hagámoslo más interesante. Es hora de agregar algo de control de interruptores a nuestro programa de ensamblaje.
Este Instructable tiene imágenes que muestran cómo los dos interruptores integrados están conectados al MSP432.
Básicamente: el interruptor 1 (SW1 o S1) está conectado a P1.1 y el interruptor 2 (SW2 o S2) está conectado a P1.4.
Esto hace que las cosas sean un poco interesantes no solo porque estamos tratando con entradas en lugar de salidas, sino también porque estos dos interruptores ocupan o ocupan dos bits del mismo bloque de direcciones de registro como lo hace el único LED rojo que es una salida.
Nos ocupamos de alternar el único LED rojo en este Instructable, por lo que solo necesitamos agregar código para manejar los interruptores.
Bloque de dirección de registro del puerto 1
Recuerde que los cubrimos en el Instructable anterior, pero tenemos que incluir uno nuevo:
- Dirección de registro de entrada del puerto 1 = 0x40004C00
- Dirección de registro de salida del puerto 1 = 0x40004C02
- Dirección del registro de dirección del puerto 1 = 0x40004C04
- Dirección de registro de habilitación de resistencia del puerto 1 = 0x40004C06
- Puerto 1 Seleccione 0 Dirección de registro = 0x40004C0A
- Puerto 1 Seleccione 1 Dirección de registro = 0x40004C0C
Al usar los puertos como entradas, es bueno usar las resistencias pull-up o pull-down internas del MSP432.
Dado que la placa de desarrollo del Launchpad ha conectado los dos interruptores a tierra (BAJO cuando se presiona), eso significa que debemos usar resistencias pull UP para asegurarnos de que tenemos un ALTO sólido cuando no están presionados.
Resistencias Pull Up / Pull Down
Se necesitan dos direcciones de registro del puerto 1 diferentes para vincular esas entradas del interruptor a las resistencias pull-up.
1) Utilice el registro de habilitación de resistencia del puerto 1 (0x40004C06) para indicar simplemente que desea resistencias (para esos dos bits), 2) y luego use el registro de salida del puerto 1 (0x40004C02) para configurar las resistencias como pull-up o pull-down. Puede parecer confuso que estemos usando un registro de salida en las entradas. El registro de salida tiene casi un doble propósito.
Entonces, para volver a establecer de otra manera, el registro de salida puede enviar un ALTO o un BAJO a una salida (como el LED rojo único), y / o se usa para configurar resistencias pull-up o pull-down para entradas, PERO SÓLO si esa función se ha habilitado a través del registro Resistor-Enable.
Importante en lo anterior: al enviar / configurar un LOW o HIGH a cualquier bit de salida, deberá mantener el estado pull-up / pull-down de los bits de entrada simultáneamente.
(el video intenta explicar)
Lectura de un bit de entrada de puerto
- Configure el SEL0 / SEL1 para la funcionalidad GPIO
- Configure el registro DIR como entrada para los bits del interruptor, pero como salida para el LED (simultáneamente en el mismo byte)
- Habilitar resistencias
- Configúrelos como resistencias pull-up
- Leer el puerto
- Es posible que desee filtrar el valor leído para aislar solo los bits que necesita (interruptor 1 y 2)
Recomendado:
Introducción al "Kit de bricolaje del generador de funciones profesional ILC8038": 5 pasos
Introducción al "Kit de bricolaje del generador de funciones profesional ILC8038": Estaba buscando nuevos proyectos de electrónica cuando me encontré con un pequeño kit de generador de funciones. Se factura como el "Kit profesional de bricolaje de onda cuadrada triangular sinusoidal con generador de funciones ILC8038" y está disponible en varios proveedores
Parte 1 Ensamblaje del brazo TI RSLK Robotics Learning Curriculum Lab 7 STM32 Nucleo: 16 pasos
Parte 1 Ensamblaje de ARM TI RSLK Laboratorio de currículo de aprendizaje de robótica 7 STM32 Nucleo: El enfoque de este Instructable es el microcontrolador STM32 Nucleo. La motivación para esto es poder crear un proyecto de montaje a partir de los huesos. Esto nos ayudará a profundizar y comprender el proyecto MSP432 Launchpad (el TI-RSLK) que tiene
BRAZO ROBÓTICO Xbox 360 [ARDUINO]: BRAZO AXIOMA: 4 pasos
BRAZO ROBÓTICO Xbox 360 [ARDUINO]: BRAZO AXIOM:
Brazo robótico con módulos Zio Parte 3: 4 pasos
Brazo robótico con módulos Zio Parte 3: esta publicación de blog es parte de la serie Zio Robotics. Introducción En nuestro blog anterior, publicamos el tutorial de la Parte 1 y 2 sobre cómo controlar un brazo robótico usando módulos Zio. La parte 1 se concentró principalmente en controlar automáticamente la garra de su brazo robótico
CÓMO MONTAR UN IMPRESIONANTE BRAZO ROBOT DE MADERA (PARTE 3: BRAZO ROBOT) - BASADO EN MICRO: BITN: 8 pasos
CÓMO MONTAR UN IMPRESIONANTE BRAZO ROBOT DE MADERA (PARTE 3: BRAZO ROBOT) - BASADO EN EL MICRO: BITN: El siguiente proceso de instalación se basa en la finalización del modo de evitación de obstáculos. El proceso de instalación de la sección anterior es el mismo que el proceso de instalación en el modo de seguimiento de línea. Entonces echemos un vistazo a la forma final de A