Sistemas con Microprocesadores I 1 2 El PIC16F84 Registros relacionados con los puertos Segundo Ejemplo: Ejercicio 2 Grabando el primer Programa Instrucción: CLRF, BCF y BSF Directivas: END, EQU y ORG Directivas: INCLUDE y CONFIG Directiva: IF y ENDIF Registro de Estados Macros Contador de Programa Arquitectura interna del PIC16F84 Tablas Instrucción: RETLW Tercer Ejemplo: Ejercicio 3 Instrucción: RETLW Formas de distribuir el código del programa Constantes numéricas y alfanuméricas Subrutinas anidadas Pila Laminillas complementarias Mauricio López V. (Ingenierı́a) Microcontroladores PIC Mayo, 2015 1 / 84 El PIC16F84 Registros relacionados con los puertos Puertos Un puerto permite que el microcontrolador se comunique con los periféricos. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 2 / 84 El PIC16F84 Registros relacionados con los puertos Registros relacionados con los puertos PORTA (en el Banco 0). Puerto de entrada/salida de 5 bits (RA4:RA0). El puerto A puede leerse o escribirse como se tratara de un registro cualquiera. El registro que controla el sentido (entrada o salida) de sus pines se llama TRISA (en el Banco 1). PORTB (en el Banco 0). Puerto de entrada/salida de 8 bits (RB7:RB0). El puerto B puede leerse o escribirse como se tratara de un registro cualquiera. El registro que controla el sentido (entrada o salida) de sus pines se llama TRISB (en el Banco 1). TRISA (en el Banco 1). Registro de configuración de las lı́neas del Puerto A. Registro de control para el Puerto A. Un “0” en el bit correspondiente al pin lo configura como salida, mientras que un “1” lo hace como entrada. TRISB (en el Banco 1). Registro de configuración de las lı́neas del Puerto B. Registro de control para el Puerto B. Un “0” en el bit correspondiente al pin lo configura como salida, mientras que un “1” lo hace como entrada. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 3 / 84 El PIC16F84 Registros relacionados con los puertos Ubicación return Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 4 / 84 El PIC16F84 Registros relacionados con los puertos Función del TRIS y del PORT Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 5 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Segundo Ejemplo Ejercicio 2 : Utilizar un microcontrolador PIC16F84 para desplegar secuencias de luces en un arreglo de ocho LED, para simular luces intermitentes. Para ello: En las 8 terminales del puerto B del microcontrolador conectar los LED. Realizar un programa que muestre, en los LED del puerto B, la siguiente secuencia de luces. RB7RB6RB5RB4RB3RB2RB1RB0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 Esperar 2 segundos entre cambio de desplegado de luces. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 6 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Diagrama de conexión con un PIC16F84 (8 luces) Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 7 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Diagrama de fuente de alimentación Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 8 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Segundo Ejemplo En este segundo ejercicio, también se aprenderá: El conjunto de instrucciones del lenguaje ensamblador utilizados en la solución del ejercicio. MOVLW MOVWF CLRF DECFSZ BSF BCF GOTO CALL RETURN TRISB PORTB El uso de Directivas (EN D, EQU , ORG, IN CLU DE, CON F IG, IF y EN DIF ) y configuración de los fusibles. El uso de Macros. El uso y configuración de los puertos (TRIS y PORT). El uso de rutinas de retardo. Identificar las banderas del Registro de Estados (STATUS). Cómo grabar un programa. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 9 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Solución al Ejercicio 2 Para dar solución al problema se lleva a cabo la siguiente metodologı́a: 1. Armar el circuito. 2. Establecer el pseudocódigo del programa principal. 3. Establecer el pseudocódigo de la(s) rutina(s) de retardo. 4. Realizar los diagramas de flujo (programa principal y de retardo). 5. Escribir el programa tomando como base los diagramas de flujo. 6. Comprobar el funcionamiento del algoritmo utilizando las herramientas de simulación. 7. Grabar el programa en el microcontrolador. 8. Energizar el microcontrolador y verificar la funcionalidad del algoritmo implementado. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 10 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Solución al Ejercicio 2: Pseudocódigo del programa principal 1. Configurar el PIC 2. Mostrar la primera secuencia de luces en el puerto B (’10101010’). 3. Esperar a que el usuario visualice la secuencia. Retado de tiempo de 2 seg. 4. Mostrar la segunda secuencia de luces en el puerto B (’01010101’). 5. Esperar a que el usuario visualice la secuencia. Retado de tiempo de 2 seg. 6. Regresar al punto 2 Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 11 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Solución al Ejercicio 2: Pseudocódigo del retardo de 2 seg. 1. Inicializar el registro contador de retardo, que controla la repetición del bucle (con valor 100). 2. Esperar un tiempo de 20 mseg. 3. Decrementar el contador de retardo, que controla la repetición del bucle. 4. Si el contador de retardo es cero Entonces Ha terminado el tiempo de retardo y salir de la subrutina. Otro caso Regresar al punto 2. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 12 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Solución al Ejercicio 2: Pseudocódigo del retardo de 20 mseg. 1. Inicializar el registro contador de retardo, que controla la repetición del bucle no anidado (con valor 40). 2. Inicializar el registro contador de retardo, que controla la repetición del bucle anidado (con valor 100). 3. Esperar dos ciclos de instrucción. Estos dos ciclos de instrucción se repiten 100 veces en el bucle anidado. 4. Decrementar el contador de retardo que controla la repetición del bucle anidado. 5. Si el contador que controla la repetición del bucle anidado es cero Entonces Otro caso Pasar al punto 6 Regresar al punto 3 6. Decrementar el contador de retardo que controla la repetición del bucle no anidado. 7. Si el contador que controla la repetición del bucle no anidado es cero Entonces Otro caso Ha terminado el tiempo de retardo y salir de la subrutina. Regresar al punto 2. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 13 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Diagrama de flujo del programa principal INICIO Configuración del PIC (puertos) PORTB <-- B'10101010' rt2seg PORTB <-- B'01010101' rt2seg Configuración del microcontrolador. Las terminales del Puerto B configurados como de salida. Manda al puerto B el dato B'10101010'. Se mantiene ocioso un tiempo aproximado de 2 segundos, para permitir al usuario que visualice el desplegado en los LED. Manda al puerto B el dato B'01010101'. Se mantiene ocioso un tiempo aproximado de 2 segundos, para permitir al usuario que visualice el desplegado en los LED. código Mauricio López V. (Ingenierı́a) banck Microcontrolador PIC16F84 Mayo, 2015 14 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Diagrama de flujo de retardo de 20 milisegundos ret20ms V1_20ms V2_20ms EQU EQU D'100' ; Valor del Loop interior. D'40' ; Valor del Loop exterior. RLe20ms <-- V2_20ms Inicializa el primer registro contador de retardo. RLi20ms <-- V1_20ms Inicializa el segundo registro contador de retardo. 2 NOP RLi20ms <-- RLi20ms - 1 NO RLi20ms = 00? Ejecuta dos instrucciones. Decrementa segundo contador de retardo. ¿ Terminó este lazo ? | NO. Ejecuta una nuevo ciclo de este lazo. SI RLe20ms <-- RLe20ms - 1 NO RLe20ms = 00? Decrementa primer contador de retardo. ¿ Terminó este lazo ? | NO. Ejecuta una nuevo ciclo de este lazo. SI SALIR Mauricio López V. (Ingenierı́a) Fin de la subrutina. Microcontrolador PIC16F84 código Mayo, 2015 15 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Listado de la rutina de retardo de 20 milisegundos ;------------------------------------------------------------------; Procedimiento que genera un retardo de aproximadamente 20mseg. ; Ejemplo de diseño ; Delay_time = [([([(Vl1_20ms*5)-1]+5)*Vl2_20ms]-1)+2+2+2]*Cycle_time ; ; i.e. (4MHz crystal) con Vl1_4ms = D'100' y Vl2_4ms = D'40'. ; Delay_time = ([([(100 * 5) - 1] + 5) * 40] - 1 + 2 + 2 + 2) * 1useg ; = ([(499 + 5) * 40] + 5 ) * 1useg ; = 20,165useg = 20.165mseg ; Subrutina: ret20ms. ;------------------------------------------------------------------; Retardo de 20mseg. rt20ms MOVLW V2_20ms ; Inicialización del contador que controla el MOVWF RLe20ms ; anidamiento externo para el conteo de 20 mseg. loplon2 MOVLW V1_20ms ; Inicialización del contador que controla el MOVWF RLi20ms ; anidamiento interno para el conteo de 20 mseg. lopshr2 NOP ; Invierte un ciclo de máquina. NOP ; Invierte un ciclo de máquina. DECFSZ RLi20ms, F ; ¿ Ya terminó el conteo del anidamiento interno ? GOTO lopshr2 ; No. Continúa el conteo. DECFSZ RLe20ms, F ; ¿ Ya terminó de contar el intervalo de tiempo de 20 milisegundos ? GOTO loplon2 ; No. Continúa el conteo. RETURN ; Termina la rutina de retardo de 20 mseg. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 16 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Diagrama de flujo de retardo de 2 segundos rt2sec R_2seg <-- Vr2seg Vr2seg EQU D'100' ; Valor para generar retardo de 2seg. Decrementa contador de retardo. ret20ms Llama a la rutina que espera 20,165 ciclos. R_2seg <-- R_2seg - 1 Decrementa segundo contador de retardo. NO R_2seg = 00? ¿ Terminó de ejecutar el lazo ? | NO. Ejecuta una nuevo ciclo de este lazo. SI SALIR Fin de la subrutina. código Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 17 / 84 El PIC16F84 Segundo Ejemplo: Ejercicio 2 Listado de la rutina de retardo de 2 segundos ;---------------------------------------------------; Procedimiento que genera un retardo de aproximadamente 2 seg. ; Ejemplo de diseño ; Delay_time = [(Vr2seg * 20,168) - 1 + 2 + 2 + 2] * Cycle_time ; ; i.e. (4MHz crystal) con Val20ms = D'100'. ; Delay_time = [(100 * 20,168) + 5] * 1useg ; = 2.016,805 seg ; Subrutina: rt2seg. ;------------------------------------------------------------------; Retardo de 2 seg. rt2seg MOVLW Vr2seg ; Inicialización del contador que MOVWF R_2seg ; controla el tiempo de retardo de 2 seg. lp2sec CALL rt20ms ; Llama a la rutina de retardo de 20 mseg. DECFSZ R_2seg, F ; ¿ Ya terminó de contar el intervalo de tiempo de 2 segundos ? GOTO lp2sec ; No. Continúa el conteo. RETURN ; Termina la rutina de retardo de 2 seg. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 18 / 84 El PIC16F84 Grabando el primer Programa Grabando el primer Programa Uso del MPLAB IDE para simular y grabar el programa. Generar un proyecto. Seleccionar dispositivo PIC16F84. Visualizar registros de funciones especiales y de usuario. Visualizar el Reloj de paro (StopWatch). Compilar el Programa. Grabar el PIC y probar su funcionalidad en una tarjeta de experimentación. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 19 / 84 El PIC16F84 Grabando el primer Programa Proceso de grabación Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 20 / 84 El PIC16F84 Grabando el primer Programa Proceso de grabación Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 21 / 84 El PIC16F84 Grabando el primer Programa Proceso de grabación Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 22 / 84 El PIC16F84 Grabando el primer Programa Proceso de grabación Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 23 / 84 El PIC16F84 Grabando el primer Programa Proceso de grabación Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 24 / 84 El PIC16F84 Grabando el primer Programa Proceso de grabación Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 25 / 84 El PIC16F84 Instrucción: CLRF, BCF y BSF Instrucción: CLRF Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 26 / 84 El PIC16F84 Instrucción: CLRF, BCF y BSF Instrucción: BCF Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 27 / 84 El PIC16F84 Instrucción: CLRF, BCF y BSF Instrucción: BSF Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 28 / 84 El PIC16F84 Directivas: END, EQU y ORG Directivas Son comandos insertados en el programa. Son usados para controlar el proceso de ensamblado. No son parte del repertorio de instrucciones. Suelen escribirse en la segunda columna y en mayúsculas. Se tienen más de 50 directivas. Se explican en el menú help y son proporcionados por Microchip en su página Web. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 29 / 84 El PIC16F84 Directivas: END, EQU y ORG Directivas EN D Indica fin de programa. Es una directiva obligatoria. Todas las lı́neas posteriores a la lı́nea en la que se encuentra esta directiva son ignorados y no se ensamblan. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 30 / 84 El PIC16F84 Directivas: END, EQU y ORG Directivas EQU Es una directiva de asignación. Sintaxis: <label> EQU <expr> − El valor de <expr> es asignado a la etiqueta <label> Usualmente las asignaciones con EQU van al principio del programa. Siempre que el nombre aparece el programa es sustituido por el valor numérico de la expresión que se le haya asignado. Se utiliza para definir constantes y direcciones de memoria. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 31 / 84 El PIC16F84 Directivas: END, EQU y ORG Directivas ORG (SetP rogramOrigin) Indica al programa ensamblador la dirección de memoria de programa a partir de la cual deben ensamblarse las instrucciones del código fuente. Sintaxis: [<label>] ORG <expr> − <expr> fija la dirección de la memoria de programa donde se almacenan las instrucciones. Si un programa comienza a escribirse sin indicar ORG, el ensamblador toma por defecto ORG 0x00. Cuando distintas secuencias de programa se colocan en diferentes áreas de memoria se usa una directiva ORG. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 32 / 84 El PIC16F84 Directivas: INCLUDE y CONFIG Directiva: IN CLU DE Formato: #IN CLU DE <include file> El fichero especificado por <include file> es leı́do como un fichero fuente. El efecto es el miso que si el texto entero del <include file> hubiera sido insertado dentro del fichero origen. Este fichero <include file> no debe finalizar con la directiva END. Cuando se incluye: #INCLUDE <P16f84a.inc> en los programas, se añade al programa la definición de los SFR y de sus bits. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 33 / 84 El PIC16F84 Directivas: INCLUDE y CONFIG Directiva: CON F IG Indica la configuración elegida para el proceso de grabación del microcontrolador. Formato para configurar los fusibles: #INCLUDE <P16f84a.inc> CONFIG XT OSC & WDT OFF & PWRTE ON & CP OFF En este caso: − Se utiliza el oscilador por cristal de cuarzo ( XT OSC). − No se habilita el Watchdog ( WDT OFF). − Se habilita el reset mediante Power−Up Timer ( PWRTE ON). − No hay protección de código ( CP OFF). Es importante resaltar que Mauricio López V. (Ingenierı́a) CONFIG se inicia con dos subrayados (guión bajo). Microcontrolador PIC16F84 Mayo, 2015 34 / 84 El PIC16F84 Directivas: INCLUDE y CONFIG Constantes de configuración ;========================================================= ; Configuration Bits ;========================================================= CP ON EQU H’000F’ CP OFF EQU H’3FFF’ PWRTE ON EQU H’3FF7’ PWRTE OFF EQU H’3FFF’ WDT ON EQU H’3FFF’ WDT OFF EQU H’3FFB’ LP OSC EQU H’3FFC’ XT OSC EQU H’3FFD’ HS OSC EQU H’3FFE’ RC OSC EQU H’3FFF’ Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 35 / 84 El PIC16F84 Directiva: IF y ENDIF Directiva: IF y EN DIF Limitan el principio y el fin de un bloque condicional de ensamblado. IF y ENDIF actúan solamente durante el tiempo de ensamblado y no pueden utilizarse como instrucciones condicionales que deba ejecutar el microcontrolador. Sintaxis: IF <expr> ... <código> ... ELSE ... <código> ... ENDIF − Si <expr> es verdadera, el código inmediato al IF se ensamblá. − En caso contrario, las instrucciones siguientes se saltan hasta encontrar una directiva ELSE o una directiva ENDIF. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 36 / 84 El PIC16F84 Directiva: IF y ENDIF Ejemplo de directiva: IF − EN DIF ;——————————————————————; Definiciones ;——————————————————————#DEFINE Simula 1 ; Configura a Simulacion. #DEFINE NSimula 0 ; Configura a No Simulacion. #DEFINE CSML Simula ; Condicion de la simulacion. ;——————————————————————; Una sección del programa. ; Ejemplo de uso de la directiva IF. ;——————————————————————IF(CSML == NSimula) CALL rt2sec ; Llama a la rutina de retardo de 2 segundos. ENDIF Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 37 / 84 El PIC16F84 Registro de Estados Registro STATUS Sus bits indican: El estado de la última operación aritmética o lógica realiza. La causa de reset y los bits de selección de banco para la memoria de datos. Sus bits suelen denominarse banderas (flags). IRP1 (Register Bank Select bit). Usado para direccionamiento indirecto. No utilizado en el PIC16F84. RP1 (Register Bank Select bit). Usado para direccionamiento directo. No utilizado en el PIC16F84. RP0 (Register Bank Select bit). Selección del banco para el direccionamiento directo. Señala el banco de memoria de datos seleccionado. RP0=0. Selecciona el Banco 0. RP0=1. Selecciona el Banco 1. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 38 / 84 El PIC16F84 Registro de Estados Registro STATUS TO (Timer Out). Bit o bandera indicador de fin de temporización del Watchdog. Bit de sólo lectura. Se activa en “0” cuando el circuito de vigilancia Watchdog finaliza la temporización. Sirve para detectar si una condición de reset fue producida por el Watchdog Timer. TO =0. Al desbordar el temporizador del Watchdog. TO =1. Tras conectar VDD (funcionamiento normal) o al ejecutar las instrucciones CLRWDT o SLEEP. PD (Power Down). Bit o bandera de bajo consumo. Bit de sólo lectura. Sirve para detectar el modo de bajo consumo. PD =0. Al ejecutar la instrucción SLEEP y entrar en reposo. PD =1. Tras conectar la alimentación VDD o al ejecutar clrwdt. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 39 / 84 El PIC16F84 Registro de Estados Registro STATUS Z (Zero). Bit o bandera de cero. Se activa a “1” cuando el resultado de una operación aritmética o lógica es cero. Z=0. El resultado de la última operación ha sido distinto de cero. Z=1. El resultado de la última operación ha sido cero. DC (Digital bit). Bit o bandera de acarreo en el 4o bit de menos peso. En operaciones aritmética se activa cando hay un acarreo entre el bit 3 y 4, es decir, acarreo entre los nibbles de menor y de mayor peso. C (Carry bit). Bit o bandera de acarreo. En instrucciones de suma aritmética se activa cuando se presenta acarreo, es decir, el resultado de la operación ha superado el valor 111111112 (25510 ): C=0. En la suma significa que no ha habido acarreo y en la resta que el resultado ha sido negativo. C=1. En la suma significa que ha habido acarreo y en la resta que el resultado ha sido positivo. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 40 / 84 El PIC16F84 Macros Macros Es una serie de instrucciones y directivas. Se comportan como una única instrucción cuando es invocada. Se utiliza para automatizar la utilización de grupos de instrucciones usadas con frecuencia. Acepta argumentos. Antes de ser invocada en una lı́nea de programa debe estar definida. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 41 / 84 El PIC16F84 Macros Macros Sintaxis: <macro name> MACRO ... <algoritmo de la Macro> ... ENDM [<arg>, <arg>, . . ., <arg>] − <macro name> es la etiqueta que define a la macro. − <arg> es cualquier número de argumentos opcionales que se le proporciona a la macro. − Los valores asignados a estos argumentos, cuando se invoca la macro, son sustituidos por los nombres de los argumentos que se encuentran dentro de la macro. Esta puede ser invocada en cualquier punto del programa, utilizando la sintaxis: <macro name> [<arg>, <arg>, . . ., <arg>] No ocupa código de máquina mientras no sea invocada, cuando esto ocurre la macro se expandirá en el lugar del programa en que se encuentra. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 42 / 84 El PIC16F84 Macros Ejemplo de MACROS ;——————————————————————; Macro que direcciona al Banco 0 ; Selección del Banco 0 ; Nombre: banco0 ;——————————————————————banco0 MACRO BCF STATUS, RP0 BCF STATUS, RP1 ENDM ;——————————————————————; Macro que direcciona al Banco 1 ; Selección del Banco 1 ; Nombre: banco1 ;——————————————————————banco1 MACRO BSF STATUS, RP0 BCF STATUS, RP1 ENDM Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 43 / 84 El PIC16F84 Macros Ejemplo de MACROS ;——————————————————————; Macro para transferir un número a un registro ; numero ---> registro ; Nombre: MOVLF ;——————————————————————MOVLF MACRO numero, registro MOVLW numero MOVWF registro ENDM ;——————————————————————; Transfiere el contenido de un registro fuente a un destino ; registro fuente ---> registro destino ; Nombre: MOVFF ;——————————————————————MOVFF MACRO reg fuente, reg destino MOVF reg fuente, W MOVWF reg destino ENDM Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 44 / 84 El PIC16F84 Macros Ejemplo de MACROS (pantalla grafica) ;---------------------------------------------------------------------------------------------------------------------; Macro que escribira un grafico en la memoria de la pantalla grafica de 128x128. ; Controla la direccion o apuntador de la tabla, la posicion de inicio donde se desea escribir ; el grafico en la pantalla grafica y el contador del numero de caracteres a escribir. ; adrs: Direccion de inicio en la pantalla grafica. ; posic: Posicion o apuntador de la tabla. ; datos: Contador del numero de datos graficos. ; Nombre: grflogo. ; Uso del Macro con sintaxis: cmnd3pl MACRO datcm, Hbyte, Lbyte. ;-----------------------------------------------------------------------------------------------------------------------grflogo MACRO adrs, posic, datos cmnd3pl 0X24, HIGH posic, LOW posic ; Set Address Pointer (ADP). Direcciona en que localidad de ; la memoria se escribe. Area Grafica. ; Localidad de memoria 0xAABB (AA = HIGH posic; Parte alta del ; apuntador de la tabla y BB = LOW posic; Parte baja del ; apuntador de la tabla). MOVLFLOW datos, ContL ; Parte baja de datos a leer se transfiere a parte baja del contador. MOVLFHIGH datos, ContH ; La parte alta del numero de datos a leer se transfiere a la parte alta del contador. MOVLFLOW adrs, tblptrl ; En tblptrl se almacena la parte baja del apuntador de la tabla. MOVLFHIGH adrs, tblptrh ; En tblptrh se almacena la parte alta del apuntador de la tabla. MOVLFH'C0', dtcomnd ; Data Write Command. Escribe un dato e incrementa la direccion ; del apuntador (ADP). CALL Llamlog ; Llama a la rutina que lee los datos y los escribe. ENDM Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 45 / 84 El PIC16F84 Contador de Programa Registro PCL y Contador de Programa Es un contador de programa de 13 bits constituido por dos registros. PCL (Program Counter Low byte). Implementado en la memoria RAM. Su contenido corresponde con los 8 bits más bajos del contador de programa. Este registro puede ser leı́do o escrito directamente. PCH (Program Counter High byte). Los cinco bits de mayor peso del PC corresponden con este registro. No puede ser leı́do o escrito directamente. Durante la ejecución normal del programa el PCL, se incrementa con cada instrucción, a menos que se trate de alguna instrucción de salto. Al conectar la alimentación se inicializa a (PCL) = b’00000000’ y (PCH) = b’00000’. En el PIC16F84 los 3 bits de mayor peso del PC no son tomados en cuenta. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 46 / 84 El PIC16F84 Arquitectura interna del PIC16F84 Arquitectura interna del PIC16F84 Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 47 / 84 El PIC16F84 Tablas Tablas Serie de datos ordenados secuencialmente en memoria de programa que forman una lista de constantes. Los valores de las constantes están grabados y no se pueden alterar. El usuario accede a un elemento de esta lista mediante la instrucción RETLW . Sintaxis de la instrucción RETLW (Return with Literal in W ): <Nombre de la tabla> RETLW RETLW RETLW RETLW RETLW RETLW − − − − ADDW F <dato> <dato> <dato> <dato> <dato> <dato> P CL, F Funciona de forma similar que RETURN. Produce el retorno de una subrutina pero con un valor en el registro W. <dato> es el valor de la constante que se carga en el registro de trabajo W. Para leer uno de ellos se le suma el valor del registro W al contador de programa mediante la instrucción de salto indexado ADDWF PCL, F . Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 48 / 84 El PIC16F84 Instrucción: RETLW Instrucción: RETLW (primera parte) Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 49 / 84 El PIC16F84 Instrucción: RETLW Instrucción: RETLW (segunda parte) Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 50 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Tercer Ejemplo Ejercicio 3 : Se desea controlar diferentes secuencias de luces en un arreglo de ocho LED, utilizando un microcontrolador PIC16F84. Para ello: En las 8 terminales del puerto B del microcontrolador conectar los LED. Realizar un programa que muestre, en los LED del puerto B, las siguientes tres secuencias de luces. RB7RB6RB5RB4RB3RB2RB1RB0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 RB7RB6RB5RB4RB3RB2RB1RB0 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 Secuencia 1 0 1 1 1 1 1 1 0 1 Secuencia 2 RB7RB6RB5RB4RB3RB2RB1RB0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 Secuencia 3 Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 51 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Tercer Ejemplo Para ello: Las secuencias deben repetirse de manera cı́clica: primero la secuencia 1, después la secuencia 2 y luego la secuencia 3, e iniciar de nuevo con la secuencia 1. Cada secuencia debe repetirse ocho veces antes de continuar con la siguiente. Los valores establecidos por las secuencias 1 y 2 deben obtenerse a partir de tablas (implementadas en la memoria de programa). Para las secuencias 1 y 2 el cambio consecutivo de desplegado debe durar aproximadamente 60 mseg. Para la secuencia 3 el cambio consecutivo de desplegado debe durar aproximadamente 2 seg. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 52 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Diagrama de conexión con un PIC16F84 (8 luces) Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 53 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Tercer Ejemplo En este tercer ejercicio, también se aprenderá: El uso de Tablas, Macros y Directivas (configuración de los fusibles, el IF y ENDIF). El uso de la instrucción: RETLW. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 54 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Solución al Ejercicio 3 Para dar solución al problema se lleva a cabo la siguiente metodologı́a: 1. Armar el circuito. 2. Establecer el pseudocódigo del programa principal. 3. Establecer el pseudocódigo de las rutinas de las secuencias. 4. Establecer el pseudocódigo de la(s) rutina(s) de retardo. 5. Realizar los diagramas de flujo (programa principal y de retardo). 6. Escribir el programa tomando como base los diagramas de flujo. 7. Comprobar el funcionamiento del algoritmo utilizando las herramientas de simulación. 8. Grabar el programa en el microcontrolador. 9. Energizar el microcontrolador y verificar la funcionalidad del algoritmo implementado. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 55 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Solución al Ejercicio 3: Pseudocódigo del programa principal a) Configurar el microcontrolador. Puerto B como salida. b) Invocar a la primera secuencia. 1 Inicializar el número de veces que se repite esta secuencia, variable veces. 2 Inicializar el número de datos que contiene la tabla, variable cuenta. 3 Inicializa el offset (apuntador) de la tabla, variable offset. 4 Invocar a la tabla para obtener el dato. 5 Despliegar en los LED el dato obtenido de la tabla. 6 Esperar 60 mseg. 7 Incrementar apuntador de tabla, variable offset. 8 Decrementar contador del número de datos de la tabla, cuenta ¿Terminó de leer toda la tabla? Then Decrementar el número de veces que se repite la secuencia, veces. ¿Terminó de ejecutar todas las repeticiones? Then Terminar la secuencia y pasar a la siguiente, punto [c]. Else Else Regresar al punto [2] de esta secuencia. Regresar al punto [4] de esta secuencia. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 56 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Solución al Ejercicio 3: Pseudocódigo del programa principal c) Invocar a la segunda secuencia. 1 Inicializar el número de veces que se repite esta secuencia, variable veces. 2 Inicializar el número de datos que contiene la tabla, variable cuenta. 3 Inicializar el offset (apuntador) de la tabla, variable offset. 4 Invocar a la tabla para obtener el dato. 5 Despliegar en los LED el dato obtenido de la tabla. 6 Esperar 60 mseg. 7 Incrementar apuntador de tabla, variable offset. 8 Decrementar contador del número de datos de la tabla, cuenta ¿Terminó de leer toda la tabla? Then Decrementar el número de veces que se repite la secuencia, veces. ¿Terminó de ejecutar todas las repeticiones? Then Terminar la secuencia y pasa a la siguiente, punto [d]. Else Else Regresar al punto [2] de esta secuencia. Regresar al punto [4] de esta secuencia. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 57 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Solución al Ejercicio 3: Pseudocódigo del programa principal d) Invocar a la tercera secuencia. 1 Inicializar el número de veces que se repite esta secuencia, variable veces. 2 Desplegar en los LED el dato B’10101010’. 3 Esperar 2 seg. 4 Desplegar en los LED el dato B’01010101’. 5 Esperar 2 seg. 6 Decrementar el número de veces que se repite la secuencia, variable veces. ¿Terminó de ejecutar todas las repeticiones? Then Terminar la secuencia y pasa a la primera secuencia, punto [b], generando un proceso cı́clico. Else Regresar al punto [2] de esta secuencia. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 58 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Diagrama de flujo del programa principal INICIO Configuración del PIC (puertos) Inicialización de la configuración del microcontrolador. Terminales del Puerto B configuradas como de salida. secuc1 Ejecuta la primera secuencia. secuc2 Ejecuta la segunda secuencia. unosino Ejecuta la tercera secuencia, y repite una vez más las secuencias. código Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 59 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Diagrama de flujo de retardo de 60 milisegundos ret60ms R_2seg <-- D'3' Vr60ms EQU D'3' ; Valor para generar retardo de 60 mseg. Inicializa contador de retardo. ret20ms Rutina de espera de 20,165 ciclos. R_2seg <-- R_2seg - 1 Decrementa contador de retardo. NO R_2seg = 00? ¿ Terminó de ejecutar el lazo ? | NO. Ejecuta un nuevo ciclo de este lazo. SI Fin Fin de la subrutina. código Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 60 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Subrutina de la secuencia 1 secuc1 1 W <-- H'08' veces <-- W Inicializa el número de veces que se repite la secuencia. W <-- H'08' cuenta <-- W Inicializa el número de datos que contiene la secuencia. offset <-- offset + 1 Incremento offset para acceder al siguiente dato de la secuencia. 2 cuenta <-- cuenta - 1 offset <-- H'00' Inicializa el offset para acceder a los valores de la secuencia. 3 NO Cuenta =00? ¿Terminó de leer toda la tabla? | NO. Lee el siguiente dato. SI 3 veces <-- veces - 1 W <-- offset tabla1 PORTB <-- W ret60ms Actualiza W que sirve como apuntador y obtiene el dato de la tabla. Despliega en los LED el dato leído en la tabla. 2 NO ¿Terminó de repetir la secuencia? | NO. Repite una ves más. veces = 00? SI Fin Fin de la subrutina. Se mantiene ocioso aproximadamente 60 mseg. 1 Mauricio López V. (Ingenierı́a) código Microcontrolador PIC16F84 Mayo, 2015 61 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Subrutina de la secuencia 2 secuc2 4 W <-- H'08' veces <-- W Inicializa el número de veces que se repite la secuencia. W <-- H'09' cuenta <-- W Inicializa el número de datos que contiene la secuencia. offset <-- offset + 1 Incremento offset para acceder al siguiente dato de la secuencia. 5 cuenta <-- cuenta - 1 offset <-- H'00' Inicializa el offset para acceder a los valores de la secuencia. 6 NO Cuenta =00? ¿Terminó de leer toda la tabla? | NO. Lee el siguiente dato. SI 6 veces <-- veces - 1 W <-- offset tabla2 PORTB <-- W ret60ms Actualiza W que sirve como apuntador y obtiene el dato de la tabla. Despliega en los LED el dato leído en la tabla. 5 NO ¿Terminó de repetir la secuencia? | NO. Repite una ves más. veces = 00? SI Fin Fin de la subrutina. Se mantiene ocioso aproximadamente 60 mseg. 4 Mauricio López V. (Ingenierı́a) código Microcontrolador PIC16F84 Mayo, 2015 62 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 Subrutina de la secuencia 3 Unosino H'08' --> veces B'10101010' --> PORTB rt2seg B'01010101' --> PORTB rt2seg Inicializa el número de veces que se repite la secuencia. Despliega en los LED el primer valor de la secuencia. Se mantiene ocioso aproximadamente 2 segundos. Despliega en los LED el segundo valor de la secuencia. Se mantiene ocioso aproximadamente 2 segundos. veces - 1 --> veces NO ¿Terminó de repetir la secuencia? | NO. Repite una ves más. veces = 00? SI Fin Mauricio López V. (Ingenierı́a) Fin de la subrutina. Microcontrolador PIC16F84 código Mayo, 2015 63 / 84 El PIC16F84 Tercer Ejemplo: Ejercicio 3 tabla 1 ;----------------------------------------------------------------------; Tabla de la primera secuencia a desplegar. ; Subrutina: tabla1 ;----------------------------------------------------------------------tabla1 ADDWF PCL, F ; PCL <-- W + PCL RETLW B'01111111' RETLW B'00111111' RETLW B'00011111' RETLW B'00001111' RETLW B'00000111' RETLW B'00000011' RETLW B'00000001' RETLW B'00000000' RB7RB6RB5RB4RB3RB2RB1RB0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 1 1 1 1 1 1 1 0 Mayo, 2015 64 / 84 El PIC16F84 Instrucción: RETLW Instrucción: RETLW (primera parte) Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 65 / 84 El PIC16F84 Instrucción: RETLW Instrucción: RETLW (segunda parte) Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 66 / 84 El PIC16F84 Formas de distribuir el código del programa Formas de distribuir el código del programa Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 67 / 84 El PIC16F84 Formas de distribuir el código del programa Formas de distribuir el código del programa Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 68 / 84 El PIC16F84 Formas de distribuir el código del programa Formas de distribuir el código del programa Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 69 / 84 El PIC16F84 Constantes numéricas y alfanuméricas Constantes numéricas y alfanuméricas El ensamblador MPASM soporta los sistemas de numeración decimal, hexadecimal, octal, binario y el código alfanumérico ASCCI. TIPO Decimal Hexadecimal Octal Binario ASCCI String o Cadena de caracteres Mauricio López V. (Ingenierı́a) SINTAXIS D’<cantidad>’ d’<cantidad>’ .’<cantidad>’ H’<cantidad>’ h’<cantidad>’ 0x<cantidad> <cantidad>H <cantidad>h O’<cantidad>’ o’<cantidad>’ B’<cantidad>’ b’<cantidad>’ A’<cantidad>’ a’<cantidad>’ ’<cantidad>’ “ <string> ” Microcontrolador PIC16F84 EJEMPLO MOVLW D’109’ MOVLW d’109’ MOVLW .’109’ MOVLW H’6D’ MOVLW h’6D’ MOVLW 0x6D MOVLW 6DH MOVLW 6Dh MOVLW O’155’ MOVLW o’155’ MOVLW B’01101101’ MOVLW b’01101101’ MOVLW A’M’ MOVLW a’M’ MOVLW ’M’ DT “Estudia SDII” Mayo, 2015 70 / 84 El PIC16F84 Subrutinas anidadas Mecanismo de funcionamiento de una subrutina Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 71 / 84 El PIC16F84 Subrutinas anidadas Subrutinas anidadas Cuando una subrutina llama a otra subrutina se produce lo que se conoce como anidamiento de subrutinas. Cada instrucción call sucesivo sin que intervenga un return crea un nivel de anidamiento adicional. El nivel de anidamiento está limitado, para el PIC16F84 es de 8 niveles. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 72 / 84 El PIC16F84 Pila Pila (Stack) Es una zona de memoria que se encuentra separada de la memoria de programa y de la de datos. Su estructura es de tipo LIFO (Last In First Out), último dato que se guarda es el primero que sale. Se dispone de una pila de ocho niveles de longitud y cada nivel constituido de 13 bits cada uno. Se carga la pila con el contenido del contador de programan (PC) cuando hay un llamado a una subrutina o cuando ocurre una interrupción. Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 73 / 84 El PIC16F84 Pila Pila (Stack) Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 74 / 84 El PIC16F84 Pila Estructura de la pila y memoria de programa Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 75 / 84 Laminillas complementarias Laminillas complementarias Laminillas complementarias Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 76 / 84 Laminillas complementarias Diagrama de flujo del programa principal INICIO Inicialización Configuración del PIC (puertos) PORTB <-- B'10101010' rt2seg PORTB <-- B'01010101' rt2seg TRISB PORTB ESTADO W F RP0 EQU EQU EQU EQU EQU EQU BSF CLRF BCF 0x06 ; Localidad de memoria. 0x06 ; Localidad de memoria. 0x03 ; Localidad de memoria. 0 ; Variable W (acumulador). 1 ; Variable F (registro). 5 ; Variable RP0 (bit 5 STATUS). ESTADO, RP0 ; banco 1. TRISB ; Puerto B (Salida). ESTADO, RP0 ; banco 0. MOVLW MOVWF B'10101010' PORTB ; PORTB <-- B'10101010'. CALL rt2seg ; Llama a la rutina de retardo. MOVLW MOVWF B'01010101' PORTB ; PORTB <-- B'01010101'. CALL GOTO rt2seg desply1 ; Llama a la rutina de retardo. ; Se repite la secuencia. return Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 77 / 84 Laminillas complementarias Diagrama de flujo de retardo de 20 milisegundos ret20ms V1_20ms V2_20ms EQU EQU D'100' ; Valor del Loop interior. D'40' ; Valor del Loop exterior. RLe20ms <-- V2_20ms MOVLW MOVWF V2_20ms RLe20ms ; +1 ; +2 1 ciclo 1 ciclo RLi20ms <-- V1_20ms MOVLW MOVWF V1_20ms RLi20ms ; +3 ; +4 1 ciclo 1 ciclo ; +5 ; +6 1 ciclo 1 ciclo 2 NOP NOP NOP RLi20ms <-- RLi20ms - 1 NO RLi20ms = 00? DECFSZ GOTO RLi20ms, F lopshr2 ; paso 1 ; paso 2 1 ciclo 2 ciclos DECFSZ GOTO RLe20ms, F loplon2 ; paso 1 ; paso 2 1 ciclo 2 ciclos ; +7 2 ciclos SI RLe20ms <-- RLe20ms - 1 NO RLe20ms = 00? SI SALIR RETURN return Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 78 / 84 Laminillas complementarias Diagrama de flujo de retardo de 2 segundos rt2seg R_2seg <-- Vr2seg ret20ms Vr2seg MOVLW MOVWF EQU D'100' ; Valor para generar retardo de 2seg. Vr2seg R_2seg ; +1 ; +2 1 ciclo 1 ciclo CALL ret20ms ; 20,165 ciclos DECFSZ GOTO ; paso 1 ; paso 2 1 ciclo 2 ciclos ; +7 2 ciclos R_2seg <-- R_2seg - 1 NO R_2seg = 00? R_2seg, F lp2seg SI SALIR RETURN return Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 79 / 84 Laminillas complementarias Diagrama de flujo del programa principal INICIO Inicialización Configuración del PIC (puertos) #include <P16f84a.inc> ; Definicion de los registros ; SFR y sus bits. #include <macros.asm> ; Declaracion de macros. banco1 CLRF TRISB banco0 ; Pasa al banco 1. ; Puerto B (Salida). ; Pasa al banco 0. secuc1 CALL secuc1 ; Llama a la rutina de la secuencia 1. secuc2 CALL secuc2 ; Llama a la rutina de la secuencia 2. unosino CALL GOTO unosino; Llama a la rutina de la secuencia. desply1; Se repite la secuencia de salida. return Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 80 / 84 Laminillas complementarias Diagrama de flujo de retardo de 60 milisegundos ret60ms R_2sec <-- D'3' ret20ms Vr60ms MOVLW MOVWF EQU D'3' ; Valor para generar retardo de 60 mSec. Vr60ms R_2sec ; +1 ; +2 1 ciclo 1 ciclo CALL ret20ms ; 20,165 ciclos DECFSZ GOTO ; paso 1 ; paso 2 1 ciclo 2 ciclos ; +7 2 ciclos R_2sec <-- R_2sec - 1 NO R_2sec = 00? R_2sec, F lp60ms SI Fin RETURN return Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 81 / 84 Laminillas complementarias Subrutina de la secuencia 1 secuc1 1 W <-- H'08' veces <-- W MOVLW MOVWF 0x08 veces offset <-- offset + 1 2 W <-- H'08' cuenta <-- W offset <-- H'00' MOVLW MOVWF 0x08 cuenta CLRF offset INCF offset, F DECFSZ GOTO cuenta, F proce1 DECFSZ GOTO veces, F cuent1 cuenta <-- cuenta - 1 3 NO cuenta = 0 3 W <-- offset MOVF SI offset, W veces <-- veces - 1 tabla1 CALL tabla1 2 PORTB <-- W MOVWF PORTB CALL ret60ms NO veces = 0 SI ret60ms Fin RETURN 1 return Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 82 / 84 Laminillas complementarias Subrutina de la secuencia 2 secuc2 4 W <-- H'08' veces <-- W MOVLW MOVWF 0x08 veces offset <-- offset + 1 5 W <-- H'09' cuenta <-- W offset <-- H'00' MOVLW MOVWF 0x09 cuenta CLRF offset INCF offset, F DECFSZ GOTO cuenta, F proce2 DECFSZ GOTO veces, F cuent2 cuenta <-- cuenta - 1 6 NO cuenta = 0 6 W <-- offset MOVF SI offset, W veces <-- veces - 1 tabla2 CALL tabla2 5 PORTB <-- W MOVWF PORTB CALL ret60ms NO veces = 0 SI ret60ms Fin RETURN 4 return Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 83 / 84 Laminillas complementarias Subrutina de la secuencia 3 Unosino H'08' --> veces MOVLW MOVWF 0x08 ; Veces se repite la secuencia de salida. veces B'10101010' --> PORTB MOVLW MOVWF B'10101010' PORTB CALL rt2sec ; Llama a retardo de 2 segundos. MOVLW MOVWF B'01010101' PORTB CALL rt2sec ; Llama a retardo de 2 segundos. DECFSZ GOTO veces, F despla1 rt2sec B'01010101' --> PORTB rt2sec ; PORTB <-- B'10101010'. ; PORTB <-- B'01010101'. veces - 1 --> veces NO ; Veces que se repite la secuencia. ; No se ha terminado. veces = 00? SI Fin RETURN return Mauricio López V. (Ingenierı́a) Microcontrolador PIC16F84 Mayo, 2015 84 / 84