Práctica 6. Control On-Off del ángulo de un robot de par diferencial M.I. Marco Negrete 1. Objetivos Diseñar un control on-off para el ángulo de un robot de par diferencial. Implementar dicho control en la tarjeta TerasIC proporcionada a los alumnos Implementar el control utilizando los encoders alambrados previamente 2. Desarrollo 1. Escribir las instrucciones necesarias (hexadecimal) para controlar el ángulo del robot de modo que gire un ángulo de 90◦ (sentido antihorario). Se puede utilizar el diseño proporcionado por el profesor o el alumno puede hacer su propio diseño, sin embargo, es necesario utilizar la tarjeta TerasIC que proporciona la Universidad. 2. El robot debe girar 90◦ cada vez que se presione el botón 1 de la tarjeta. 3. Si se utiliza el diseño proporcionado por el profesor, se sugiere alambrar el botón 1 al reset de dicho diseño. 2.1. 2.1.1. Especificaciones del diseño proporcionado por el profesor Instrucciones en Hexadecimal Las instrucciones del diseño proporcionado por el profesor se describen en la tabla 1. Recuerde que todos los datos se manejan en coma flotante de 32 bits, por lo que cada dato ocupa dos localidades de memoria. Las direcciones de datos especificadas en la tabla 1 se refieren a la dirección de la parte alta de cada dato, esto es, si se se especifica que un dato está en la dirección x0001 significa que el dato ocupa las localidades x0001 y x0002 de memoria. 2.1.2. Direcciones de memoria importantes Existen algunas localidades de uso especı́fico: 1 x00C0: En esta dirección se almacena el incremento de ángulo medido por los encoders (en coma flotante). Recordar que el dato es de 32 bits, es decir, la dirección x00C1 contiene la parte baja de dicho incremento. x00FC: Puerto de salida 1. Se puede utilizar para depurado del programa. x00FD: Puerto de salida 2. Se puede utilizar para depurado del programa. x00FE: Los bits 0 a 5 de esta dirección están alambrados a pines de salida como se muestra en la tabla 2. x00FF: El bit 0 de esta dirección está alambrado al reset de los encoders. El mismo pin resetea los contadores tanto derecho como izquierdo. Se sugiere la siguiente secuencia de operaciones para lograr el objetivo: 1. Escribir un cero en algún registro de propósito general. Este registro llevará el conteo del ángulo del robot. 2. Escribir el valor necesario en el registro xFE para encender los motores en el sentido correcto. 3. Sumar el ángulo actual del robot con el incremento de los encoders. 4. Resetear los encocers. Esto se puede hacer escribiendo un x01 al registro xFF. 5. Habilitar nuevamente el conteo de los encoders, es decir, escribir un cero al registro anterior. Recordar que los encoders se resetean con un 1 lógico. 6. Calcular el error dé ángulo, esto es, restar el ángulo actual a 1.5708. Esta constante debe estar almacenada en alguna localidad. 7. Revisar si el error es mayor que cero, si sı́, realizar nuevamente a partir del paso 3. Si no, continuar con el siguiente paso. 8. Apagar los motores. 3. 3.1. Elementos a evaluar Obligatorios El robot debe girar 90◦ cada vez que se presione el botón 1. Todos los componentes deben estar montados en el robot. Incluir en el reporte escrito la secuencia de instrucciones usadas. 3.2. Opcionales Con los botones de la tarjeta, decidir si el robot gira a la derecha o a la izquierda. 2 Instrucción x0002 DIRDATO1 DIRDATO2 RESULT x0002A DIRDATO1 DIRDATO2 RESULT x0069 DIRDATO1 x0072 DIRSUB x0075 x0078 DIRDATO1 DIRSALTO x0080 DIRDATO1 DIRSALTO x0089 LITERAL DIRLIT Descripción Multiplica el dato contenido en la dirección DIRDATO1 por el dato contenido en la dirección DIRDATO2 y almacena el resultado en la dirección RESULT Suma el dato contenido en la dirección DIRDATO1 al dato contenido en la dirección DIRDATO2 y almacena el resultado en la dirección RESULT Multiplica por (-1) el dato contenido en la dirección DIRDATO1 y lo almacena en la misma dirección Llamada a subrutina. Brinca a la dirección DIRSUB y regresa al encontrar la instrucción return Return. Regreso de subrutina Brinca a la dirección DIRSALTO si el dato contenido en DIRDATO1 es igual a cero. Si no, continua con la siguiente instrucción Brinca a la dirección DIRSALTO si el dato contenido en DIRDATO1 es mayor o igual que cero. Si no, continua con la siguiente instrucción Almacena el valor LITERAL (DE 16 BITS) en la dirección DIRLIT. El dato a mover es de 16 bits (una localidad de memoria). Tabla 1: Instrucciones en hexadecimal Bit7 Bit6 NC NC Bit5 Motor2En Bit4 Bit3 Bit2 Motor2B Motor2A Motor1En Tabla 2: Bits de la dirección x00FE 3 Bit1 Bit0 Motor1B Motor1A