Home MundoTec Software Código fuente Tutorial / pdf Minijuegos
Cerrar

Tutorial Microcontroladores

Tutorial Microcontroladores.







Microcontroladores

El Lazo Cíclico o “lazo de paso” .

Este capítulo presenta una estructura de programa de uso general que puede usarse como un “entorno de trabajo” (framework) para muchas aplicaciones con microcontroladores. La mayoría de las tareas de los sistemas se escriben como sub- rutinas. Estas sub-rutinas están organizadas dentro de un lazo (loop) de forma tal que cada una es llamada una vez por cada pasada por el lazo. En el tope del lazo hay una pequeña rutina que cíclicamente “lanza” al mismo a su ejecución en intervalos regulares. Este tipo de estructuras son conocidas como de “lazo cíclico” o programa tipo “lazo de paso”. Un programa de reloj se mantiene como la primera tarea a ejecutar en el lazo. Este reloj puede usarse como una entrada para otra sub-rutina de tareas que decidirá cuál de las sub-rutinas deberá activarse en cada pasada del lazo principal. Adicionalmente a la estructura de lazo en si misma, este capítulo discutirá la inicialización de un sistema y las definiciones de software que facilitarán la tarea para dedicar nuestro tiempo a las rutinas específicas de nuestra aplicación.

Equates del Sistema.

Es poco conveniente el uso de patrones binarios y direcciones en las instrucciones de un programa. Las directivas “Equate” (EQU) se usan para asignar nombres Mnemónicos a registros de direcciones y posiciones de bits. Estos nombres pueden usarse en instrucciones de un programa en lugar de los números binarios. Esto hace al programa mucho más fácil de escribir y de leer. Cuando se usa un Simulador / Emulador En Circuito para depurar un programa de aplicación, los nombres mnemónicos pueden usarse en la pantalla de depuración en lugar de los números y direcciones binarias.

Equates para los Registros del MC68HC705J1A.

Los nombres para los registros y bits de control recomendados por el fabricante (Freescale) están incluidos en el programa de lazo cíclico o programa “lazo de paso” en el entorno de trabajo (framework) del listado 7-1. Esto permite escribir instrucciones de programa que tengan sentido para las personas en lugar de oscuros números y direcciones binarias.

Cada registro se iguala (equate) a una dirección de página directa con una directiva EQU.

Cada bit de control se define de dos formas. Primero, una directiva EQU iguala el nombre del bit a un número entre 7 y 0 correspondiente al número de bit donde cada bit se localiza en un registro de control dado. Segundo, la mayoría de los bits de control son igualados a un patrón binario de bits tal como 0010 0000 ($20) el cuál puede usarse como una máscara de bits para identificar la localización del bit en un registro.

Como no se puede igualar (hacer un equate) con el mismo nombre para dos valores binarios diferentes, el segundo equate (EQU) usará un punto “.” después del nombre del bit. Para obtener un nombre de bit correspondiente al número de bit (7 – 0) se debe usar el nombre simplemente, para obtener una máscara de indicación de la posición del bit, se debe usar el mismo nombre seguido de un punto. Esta convención se usa en el entorno de trabajo (framework) del lazo cíclico o programa calesita, pero no necesariamente es un estándar recomendado por Freescale o por las companías de ensambladores.

En el set de instrucciones del MC68HC05, las instrucciones de manipulación de bits son de la siguiente forma....

xxxx 14 08 ------- BSET bit#,dd ; Set bit in location dd

Bit# es un número entre 7 y 0 que identifica el bit dentro del registro en la localización dd a ser cambiado o testeado.

En otros casos, si uno quisiera construir una máscara con varios bits en “1” (seteados) y luego escribir este valor compuesto en la localización de un registro, por ejemplo supongamos querer setear los bits RTIFR, RTIE y RT1 en el Registro TCSR, podríamos usar las siguientes instrucciones.

Xxxx A6 16 LDA #{RTIFR.+RTIE.+RT1.} ;Form Mask Xxxx B7 08 STA TCSR ;Write mask to TCSR Register El símbolo # significa modo de direccionamiento inmediato. La expresión (RTIFR.+RTIE.+RT1.) es la operación OR booleana de tres bits de la máscara de posición.

El ensamblador evalúa la expresión booleana durante la compilación (ensamblado) del programa y sustituye la respuesta ( un solo valor binario de 8 bits) dentro del programa ensamblado. La siguiente sentencia de programa produciría exactamente el mismo resultado, pero no sería tan fácil de leer como la anterior.

xxxx A6 16 LDA #%00010110 ;Form mask
xxxx B7 08 STA TSCR ;Write mask to Register

Equates del sistema de aplicación.

Será común encontrar directivas Equates específicas en un programa que definen las señales conectadas a los pines de I/O. Estas directivas EQU deberían ubicarse después de las directivas equates estándar del MCU y antes del comienzo del programa propiamente dicho. El entorno de trabajo del tipo lazo cíclico fue desarrollado teniendo en mente una pequeña placa de desarrollo. Este sistema tiene un interruptor (switch) conectado al bit 0 del puerto A (PA0) y un LED conectado al bit 7 del puerto A (PA7) de forma tal que dichas conexiones fueron definidas con directivas EQU. El interruptor no se usó en el programa de lazo cíclico o calesita del listado 7-1 , pero no sería malo incluir la directiva EQU relativa al mismo. Las directivas EQU no generan código objeto alguno que ocupe lugar de memoria en el sistema microcontrolado final.

Seteo de Vectores.

Todos los programas deben tener SETEADOS (definidos) los vectores de RESET y de interrupciones!!!!. Los vectores especifican la dirección donde el CPU comenzará el procesamiento de la instrucciones cuando un RESET o una INTERRUPCION ocurran.

El RESET y cada fuente de interrupción esperan encontrar sus vectores asociados en un específico par de locaciones de memoria. Por ejemplo, el vector de reset está en las dos más altas posiciones de memoria ($07FE y $07FF en el MC68HC705J1A). Si no se pusieran valores en esas posiciones, el CPU tomaría cualquiera de los valores binarios encontrados en dicha posición y los interpretaría como si fueran la dirección de comienzo del programa o de la rutina correspondiente a dicha interrupción, sin poder distinguir el error cometido.

El Reset Vector (vector de Reset) debe SIEMPRE especificarse y es una buena práctica también especificar los vectores de interrupciones aún si no se usaran los mismos. Un error muy común en los programadores noveles (recién iniciados) es omitir los vectores de Reset e interrupciones, originando de esta forma que el ensamblador no incluya los mismos en la memoria de programa del MCU. Este error genera que el MCU al ser alimentado y salir de la etapa de Power On Reset (inicialización interna) busque el vector de Reset con un contenido frecuente de $0000 (memoria de programa virgen del MCU tipo OTP ROM ) o $FFFF (memoria de programa virgen del MCU tipo HC908 FLASH) que NO SON POSICIONES DE MEMORIA DE PROGRAMA VALIDAS y dan como resultado que el MCU quede en un loop errático sin posibilidad de salir de el.

RESET VECTOR (VECTOR DE RESET).

La forma usual para definir un vector es con la directiva FDB.

07FE 03 00 RESETV FDB START ;Beginning of program on reset

Durante el ensamblado, el ensamblador evalúa la etiqueta START en una dirección de dos bytes y almacena esa dirección en los próximos dos lugares disponibles de la memoria del programa. Las columnas a la izquierda de la línea de listado muestran que la dirección $0300 fue almacenada en $07FF. ($03 en $07FE y $00 en $07FF).

RESETV es una etiqueta opcional en esa línea de programa. Vemos también que no es usada como referencia por otra sentencia en este programa en particular. Solo fue incluida para identificar esa línea de directiva FDB como la sentencia que define el vector de reset.

El vector de reset fue seteado para apuntar a la etiqueta START. Los variados sistemas simuladores en circuito y emuladores que Motorola y otros fabricantes de terceras partes ofrecen como herramientas de muy bajo costo, usan esta información para setear la pantalla de simulación. Cuando un programa se carga en el simulador, el simulador busca la dirección en el vector de reset del programa cargado. Si se encuentra, el simulador selecciona la instrucción de programa y muestra ello en la ventana del código fuente del simulador. Si no hubiera un vector de reset, el simulador mostraría un mensaje de atención indicando que el vector de reset no fue inicializado. Aun así se podría seguir con la depuración del programa, pero el mismo no funcionaría si se quisiera programar este en la memoria de un MCU EPROM , porque el programa no comenzaría cuando se produjera el reset.