Profesor Claudio Bustos claudio.bustos@uru.edu Recordando el esquema básico de un programa en Ensamblador para PIC 16F84A Conservamos los pasos iniciales y la configuración Directivas iniciales: list, include Declaración de variables (direcciones de RAM): directiva EQU Definición de origen en memoria de programa: directiva ORG Configuración de puertos (entradas/salidas): TRISA y TRISB Revisamos los bits o palabras de entrada Si son entradas externas revisamos el puerto correspondiente Si son condiciones internas revisamos los registros adecuados Archivo audio: Clase 3-1, 0:00 Recordando el esquema básico de un programa en Ensamblador para PIC 16F84A (cont.) Estructuramos el programa principal Seleccionamos las acciones a tomar, según las entradas Organizamos en forma modular: cada acción con subrutina Al finalizar no olvidemos: Reiniciar el programa Finalizar con directiva END (administrativo) Verificar los comentarios de línea más pertinentes: iniciar con (;)
Archivo audio: Clase 3-1, 0:00
Revisando las entradas del programa Para revisar los bits de entrada (externos o internos) Verificamos si el bit es uno o cero, según nos convenga: Usamos BTFSS para verificar si es uno y saltar una instrucción Si el bit revisado es cero, no salta; continúa la ejecución En cambio, usaremos BTFSC si nos interesa saltar una instrucción cuando el bit revisado es cero En este caso, si en bit revisado es uno, no salta Cada instrucción a la que llegamos desde la revisión será una llamada a subrutina (instrucción CALL) Al final de la subrutina podemos regresar de dos formas: Con RETURN para continuar la ejecución desde donde llamamos esa subrutina Con GOTO para reiniciar el programa Archivo audio: Clase 3-1, 0:00 Revisando las entradas del programa Para revisar palabras completas de entrada Verificamos la palabra binaria del puerto (externa) o del registro RAM (interna), de dos maneras posibles: Forma 1: LÓGICA. Colocamos la palabra de entrada en el registro W y la comparamos con una palabra de referencia fijada en el programa, mediante la instrucción XORLW Si las palabras son iguales, el resultado de la operación XOR para todos los bits será cero y se encenderá la bandera Z del registro STATUS Usaremos BTFSS STATUS, Z si nos interesa saltar una instrucción cuando las palabras sean iguales (bit Z revisado será uno) En caso de que queramos saltar cuando Z sea cero, usamos BTFSC Archivo audio: Clase 3-1, 0:00 Revisando las entradas del programa Para revisar palabras completas de entrada Forma 2: ARITMÉTICA. Podemos también comparar las palabras de entrada (en W) y de referencia (en el programa) a través de una resta aritmética, mediante la instrucción SUBLW Si las dos palabras son iguales el resultado de la resta será cero La revisión de la bandera Z es exactamente igual que para XORWF También es posible colocar la palabra de referencia en el registro W y comparar su contenido con el registro de entrada, mediante XORWF o SUBWF Organizamos las llamadas a subrutina (CALL) en forma idéntica a la utilizada para bits de entrada Archivo audio: Clase 3-1, 0:00 Ejemplo 2 de Programación - PIC 16F84A Problema a resolver Se requiere utilizar un PIC 16F84A para encender en forma intermitente un led conectado al pin 0 del puerto B (RB0) (terminal 6 del circuito integrado) mediante una entrada (pulsador) conectada al pin 4 del puerto A (RA4) (terminal 3 del circuito integrado). Cuando RA4 esté apagado, RB0 será 1 Condiciones del ejemplo Codifique el programa en Ensamblador para que el bit RB0 se utilice como salida y fije cada uno de sus valores (1 y 0) durante un tiempo adecuado. La intermitencia se ejecutará permanentemente siempre que el bit RA4 (entrada) sea 1 Se supone que todo el circuito (hardware) ya está preparado para funcionar: el PIC estará alimentado, el led está conectado en el terminal 6, el pulsador en el terminal 3 y un oscilador de 1 MHz está conectado en los terminales 15 y 16. Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – usando una entrada Directivas iniciales (list, include) Declaración de variables (direcciones de RAM) Usamos dos contadores como el ejemplo 1 (cont1 y cont2) Origen en memoria de programa en 0: ORG 0 Configuración del puerto B como salidas (al menos RB0) Definición de todos los bits en TRISB como ceros Configuración del puerto A como entradas (al menos RA4) Definición de todos los bits en TRISA como unos Estructuración del programa principal Re revisará el bit RA4 Si RA4 es 1, se encenderá el bit RB0 y luego se apagará Si RA4 es 0, se encenderá permanentemente el bit RB0 Se usarán 3 subrutinas: interm, encend y retardo Reinicio del programa (goto al inicio) Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – usando una entrada list p=16F84A ;directivas iniciales include <PIC16F84A.INC> cont1 EQU 0x0C ;dirección variable cont1 cont2 EQU 0x0D ;dirección variable cont2 ORG 0 conf BSF STATUS,RP0 ;selección Banco 1 CLRF TRISB ;todo PORTB: salidas MOVLW 0x1F MOVWF TRISA ;todo PORTA: entradas BCF STATUS,RP0 ;selección Banco 0 CLRF PORTB ;apagar todo Puerto B
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – usando una entrada (cont) inicio BTFSS PORTA, RA4 ;revisar bit de entrada CALL encend CALL interm GOTO inicio ;reinicio encend BSF PORTB,RB0 ;encender led CALL retardo GOTO inicio ;no usamos RETURN interm BSF PORTB,RB0 ;encender led CALL retardo BCF PORTB,RB0 ;apagar led CALL retardo RETURN ;o también GOTO inicio Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – usando una entrada (cont) retardo MOVLW 0x7F ;cargar valor de cont1 MOVWF cont1 lazo1 MOVLW 0xFF ;cargar valor de cont2 MOVWF cont2 lazo2 DECFSZ cont2, F ;decrementar en lazo2 (interno) GOTO lazo2 ;nueva iteración lazo2 DECFSZ cont1, F ;decrementar en lazo1 (externo) GOTO lazo1 ;nueva iteración lazo1 RETURN ;regresar al principal END
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Iniciamos el MPLAB IDE, en este ejemplo es la v8.76 Tenemos disponibles la ventana de archivos y la de salidas
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Creamos un nuevo proyecto en MPLAB mediante el tutor de proyectos (Project Wizard) De esta manera configuraremos todo lo necesario para editar y probar nuestro proyecto Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Seleccionamos el modelo de PIC a utilizar en el proyecto En nuestro caso será PIC16F84A
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Seleccionamos el tipo de programa ensamblador para el proyecto En nuestro caso será el que viene preseleccionado: MPASM de la Microchip MPASM Toolsuite
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Asignamos un nombre al proyecto Este nombre será del archivo que tendrá toda la información de configuración No corresponde a los archivos fuente ni librerías
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Ahora debemos asignar un nombre al archivo fuente La manera más directa es tener ya listo un archivo .asm en blanco Lo podemos crear en bloc de notas y colocarle su nombre entre comillas dobles con la respectiva extensión .asm Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Ahora seleccionamos el archivo .asm en blanco previamente creado y lo agregamos al proyecto (Add)
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Ahora nos aparece el archivo .asm en la carpeta Source Files del proyecto Damos doble click y estamos listos para transcribir nuestro ejemplo
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Antes de transcribir el ejemplo, vamos a incluir el archivo de librería en la carpeta Header Files Damos click derecho en la carpeta y luego Add Files
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación El archivo lo ubicamos en la carpeta Microchip de nuestro disco duro, dentro de Program files o Datos de programa Dependiendo de la versión de MPLAB el archivo puede llamarse distinto. En mi caso encontré el P16F84A.INC
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Durante la transcripción del programa es muy conveniente que respetemos las columnas de etiquetas (1), instrucciones con operandos (2) y comentarios (3) Esto nos da mejor visión del programa y evita mensajes innecesarios Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Transcribimos nuestro programa y ya podemos ensamblarlo (compilarlo) Si nos aparece el mensaje Absolute o Relocatable? Seleccionamos Relocatable para permitir la reubicación del proyecto en memoria del computador, si es necesario Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Cada vez que modifiquemos el archivo fuente o el proyecto podemos guardarlos en dos sitios distintos Los archivos fuente en el símbolo de diskette amarillo (izquierda) El archivo del proyecto en el símbolo de diskette verde (derecha) Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Seleccionamos el icono Build All a la derecha de la barra o en el menú Project -> Build All Verificamos en la ventana Output que sólo hayan mensajes (Message) o advertencias (Warning) y que se ensamble correctamente (BUILD SUCCEEDED) Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Si se presentan errores (BUILD FAILED) damos doble click en la linea que indica el error, lo cual nos lleva a la línea de programa donde debemos hacer la corrección
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación De esta manera podemos ver la línea con el error y el tipo de error que debemos corregir Siempre debemos corregir los primeros errores, que generalmente producen muchos de los siguientes Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Si queremos mostrar las líneas en el editor seleccionamos Edit -> Properties -> Pestaña ‘ASM’ File Types -> Line Numbers
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Ya ensamblado el programa, procedemos a abrir la ventana de Registros de Funciones Especiales (menú View -> Special Function Registers) y allí observamos el estado de los registros más importantes del PIC
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Sólo necesitamos activar el simulador en el menú Debugger - > Select Tool -> MPLAB SIM y veremos una pequeña barra de herramientas nueva
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Aquí podemos correr el programa (RUN) a una velocidad considerable (también en el menú Debugger -> Run) o animarlo ( ANIMATE o en menú Debugger -> Animate) a una velocidad más lenta para observar los cambios Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Podremos observar una flecha verde en el código, indicando la línea que se está ejecutando En la ventana SFR veremos en rojo los registros que están cambiando Si no está la columna Binary podemos agregarla usando click derecho en SFR Name o en Hex Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Para una mejor animación debemos cambiar los valores del retardo a 0x02 o 0x02 para ejecutar los lazos sólo 2 o 3 veces En cualquier momento podemos pausar la animación o ejecutarla paso a paso en la barra de MPLAB SIM Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Ya aquí se aprecia cómo están cargados los registros TRISA y TRISB (config) También el bit RB0 se encendió fijo en el puerto B Sólo nos falta fijar el bit de entrada RA4
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Para fijar el bit de entrada RA4 debemos activar la ventana de estímulos externos en el menú Debugger -> Stimulus -> New Workbook
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación En esta ventana Stimulus podemos asignar distintas acciones a nuestros pines de entrada La simulación de estas acciones las activaremos en el botón Fire a la izquierda de cada fila, cuando estén asignadas Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación Para nuestro ejemplo, vamos a asignar un interruptor (Toggle) al bit RA4 del puerto A Pulsamos Apply para validar y observamos que el botón Fire está listo para funcionar (>)
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Por último, organizamos las ventanas, ya que la que contiene el código siempre estará al frente Pulsamos Fire (>) y observamos el comportamiento del bit RB0 (si RA4 está en cero será fijo encendido, si está en 1 será intermitente) Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación En todo momento podemos observar: las llamadas a subrutinas desde el programa principal y otras subrutinas La ejecución de los lazos anidados en retardo El reinicio al programa principal Archivo audio: Clase 3-1, 0:00 Ejemplo 2 – Simulación En caso de que la ejecución del programa no sea la deseada o que sus condiciones varíen, podemos pausar la simulación y editar directamente el código en la ventana respectiva También podemos agregar más entradas como otra fila en Stimulus (con su pin y su acción) Volvemos a ensamblar el código con Build All (de todas maneras si tratamos de animar sin ensamblar el IDE nos indicará que el ejecutable no está actualizado) De nuevo pulsamos animate y observamos los cambios o ajustes realizados
Archivo audio: Clase 3-1, 0:00
Ejemplo 2 – Simulación Si deseamos observar la ejecución del programa en un simulador de circuitos será necesaria otra herramienta como PROTEUS En el esquemático armaremos el circuito respectivo agregando el PIC correspondiente y tomando en cuenta los pines de conexión según las condiciones del problema Luego cargamos en el PIC el archivo ejecutable de nuestro proyecto (.hex) que encontraremos en la misma carpeta desde la que agregamos el .asm, para poder simular la ejecución del programa