UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales 2014 PROCESADORES I Guia TP7 – Introducción al Assembler del PIC Pseudo-instrucciones PIC16F628 Se describen a continuación las más relevantes, que serán necesarias para la realización de los diferentes ejercicios. Para una descripción completa se recomienda consultar la bibliografía. PROCESSOR Define el PIC que se va a usar. Es equivalente a LIST P= Ej.: PROCESSOR PIC16F628A ó LIST P=PIC16F628A __CONFIG Define la palabra de configuración específica para el PIC que se esté usando. Se puede usar en su lugar __FUSES de forma equivalente. Opción Watchdog Power-up timer Protección de código Oscilador Parámetro _WTD_ON / _WDT_OFF _PWRTE_ON / _PWRTE_OFF Función activa / desactiva activa / desactiva _CP_ON / _CP_OFF activa / desactiva _XT_OSC _HS_OSC _RC_OSC _LP_OSC _INTOSC_OSC_CLKOUT _INTOSC_OSC_NOCLKOUT _MCLRE_ON / _MCLRE_OFF Cristal cristal frecuencia > 4MHz circuito R-C cristal low power clock interno 4MHz con salida por pin 15 clock interno 4MHz sin salida pin 4 actúa como MCLR / RA5 Entrada MCLR Low voltaje _LVP_ON / _LVP_OFF programming (LVP) pin 10 actúa como LVP PGM / RB4 Ej: __CONFIG _MCLRE_ON &_PWRTE_ON& _WDT_OFF & _XT_OSC & _LVP_OFF Terminal de MCLR disponible, Power up timer activado, Sin watchdog, Oscilador a cristal, y pin 10 para RB4 INCLUDE Incluye como parte del programa al archivo que se indica. Generalmente usado para incluir definiciones estándar de etiquetas, o bien archivos de usuario conteniendo por ejemplo subrutinas de uso frecuente. Ej. INCLUDE <P16F628A.INC> ó Página 1 INCLUDE "DELAY100.INC" UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales 2014 Programa resuelto para PIC16F628A LIST P=PIC16F628A ; Carga etiquetas para el PIC 16F628 INCLUDE <P16F628A.INC> ; ; ; ; ; Proteccion de codigo = OFF Watchdog = No usado Power On Timer = Usado ! Tipo de oscilador = Cristal XT Low voltaje programming = OFF __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _LVP_OFF CONT EQU 20 CONT2 EQU 21 CONT3 EQU 22 ;DATOS PARA RETARDO DE 1 SEGUNDO P EQU D'100' M EQU D'97' N EQU D'33' LED EQU 0 ORG 0000 GOTO INICIO ;PIN DE ENTRADA DEL INTERRUPTOR ; primera instrucción después RESET ;------------------------------------------------------------------------; SUBRUTINA DE INTERRUPCION ;------------------------------------------------------------------------ORG 0004 ;vector de interrupciones BTFSS INTCON,INTF ;TESTEA EL FLAG DE INTERRUP EXTERNA RBO GOTO SALTO ;SI ES '1' SALTO LA PROX INTRUCCION BCF PORTA,LED ;APAGO LED CALL RETARDO ;RETARDO DE 1 SEG BSF PORTA,LED ;ENCIENDO LED SALTO BCF INTCON,INTF ;BORRO LA BANDERA DE INTERRUPCION EXTERNA RBO RETFIE ;------------------------------------------------------------------------; Programa principal ;------------------------------------------------------------------------INICIO MOVLW B'00000111' MOVWF CMCON ; DESABILITO COMPARADORES DEL 16F628 BSF STATUS,RP0 ;PASA A BANCO 1 MOVLW B'00000000' ;CONFIGURA LOS PUERTOS Página 2 UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales MOVWF TRISA DEL MODO DEL OSCILADOR MOVLW B'00000001' MOVWF TRISB 2014 ;RA (4:0)COMO SALIDA, RA(5),RA(6-7)DEPENDE ;RB(0) COMO ENTRADA BCF OPTION_REG,NOT_RBPU ;RESISTENCIAS PULL-UP ACTIVAS/habilitadas BCF OPTION_REG,INTEDG ;FLANCO DE BAJADA DE RB(0) BCF STATUS,RP0 ;VUELVE A BANCO 0 CLRF PORTA CLRF PORTB BSF INTCON,INTE BSF INTCON,GIE BCF INTCON,INTF ;ACTIVA INTERRUPCION POR RB0 ;ACTIVA INTERRUPCIONES GLOBALES ;PONE EN BAJO EL FLAG DE INTERRUPCIONES POR RB0 REPETIR BSF PORTA,LED SLEEP GOTO REPETIR ;***********************SUBRUTINA PARA RETARDO DE 1SEG*************** RETARDO CICLO3 CICLO2 CICLO MOVLW P MOVWF CONT3 MOVLW M MOVWF CONT2 MOVLW N MOVWF CONT DECFSZ CONT,f GOTO CICLO DECFSZ CONT2,f GOTO CICLO2 DECFSZ CONT3,f GOTO CICLO3 ;1 ;1 ;1 ;1 ;1 ;1 ;1*(N-1)+2 ;2*(N-1) ;1*(M-1)+2 ;2*(M-1) ;1*(P-1)+2 ;2*(P-1) RETURN END Página 3 UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales 2014 Retardo en PIC Tal como se mencionó anteriormente el PIC16F628A tiene un oscilador interno de 4MHz, si utilizamos ese oscilador tenemos que todas las instrucciones se ejecutan en 1uS, exceptuando los saltos que tardan 2 ciclos, es decir 2uS. Tomando en cuenta esto vamos a generar nuestros retardos, pero siempre partiendo del supuesto de que se está trabajando a una frecuencia de 4MHz. Partiendo de la siguiente rutina: A la derecha de cada instrucción aparece el número de ciclos que tomará cada una. Las primeras dos toman solamente 1 ciclo, la tecera decfsz toma (N-1)+2, porque decrementará N-1 veces la variable N y en el último decremento hará un salto, es por eso el +2. La instrucción goto se ejecuta en 2 ciclos y se ejecutará N-1 veces, es por eso que se toma como 2*(N-1). De esta forma tenemos que el número de ciclos, y por lo tanto el tiempo que tendremos de retardo está dado por la siguiente expresión: 1+1+(1)(N-1)+2+(2)(N-1) , ó 4+N-1+2N-2, o lo que es lo mismo 3N+1. Si queremos un retardo de 100uS entonces tenemos que 3N+1=100, despejando tenemos N=(100-1)/3=33, asi que para tener un retardo de 100uS el valor de la variable N debe ser 33. Ahora veamos esta rutina: Podemos darnos cuenta que ahora nuestra rutina original (desde CICLO2 hasta goto CICLO) está afectada por la variable M, así que es como si M multiplicara a nuestro retardo. Para saber el nuevo valor del retardo de nuevo sumamos todos los ciclos, tomando en cuenta que M multiplica al retardo original de modo que la expresión ahora queda de la siguiente manera: [3N+1]M+1+1+(1)(M-1)+2+(2)(M-1), o lo que es lo mismo [3N+1]M+3M+1, de manera que tenemos dos retardos anidados. Para saber cuánto sería el retardo total primero calculamos el retardo básico, si queremos que ese retardo sea de 100uS entonces N=33, si ahora queremos que el retardo total sea de 10mS entonces ocupamos completar 10000 ciclos, así que igualamos nuestra expresión a ese número: [(3*33)+1]M+3M+1=10000, despejando tenemos M=(9999)/103, esto es aproximadamente igual a 97, así que para un retardo de 10mS nuestra variable N debe valer 33 y la variable M debe tener un valor de 97. Así podemos seguir anidando retardos. Para obtener un retardo de 1 segundo utilizaremos la siguiente rutina: Página 4 UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales 2014 Aquí se puede visualizar que la variable P afecta a los dos retardos que ya habíamos definido de modo que la expresión para calcular el nuevo retardo total seria [(3N+1)M+3M+1 ]P+1+1+(1)(P-1)+2+(2)(P-1),y reduciendo términos la expresión seria [(3N+1)M+3M+1]P+3P+1. Queremos un retardo de 1 segundo, esto son 1000000 ciclos, por lo que nuestra expresión del retardo debe ser igual a un millón: [(3N+1)M+3M+1 ]P+3P+1=1000000. Sustituyendo N y M tenemos 9995P+1=1000000, entonces tenemos que P=(999999)/9995 y P entonces es aproximadamente igual a 100. Página 5 UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales 2014 Instructivo de Uso MPLAB 1. Una vez ingresado al programa MPLAB IDE ( seleccionar Inicio> Programas> Microchip> MPLAB IDE> MPLAB),se desplegará la presentación del software seguido de la pantalla principal. 2. Ir a al item “Project” del menú e iniciar el “Project Wizard”. 3. Especificar como device el PIC16F628A y como Toolsuite el ensamblador MPASM. 4. Por medio del botón “Browse” ir al disco D, crear una nueva carpeta e ingresar en ella y finalmente dar un nombre al proyecto y poner GUARDAR. 5. Ene l caso de ya tener escrito el código en assembler, se puede agregar en este momento el archivo *.ASM con el botón ADD>> al nuevo proyecto. 6. Luego poner SIGUIENTE y FINALIZAR. 7. En caso de no contar aún con el archivo *.ASM, podrá ir al item “Project” del menú y luego a “Add new file to Project…”. Seguidamente dar un nombre con extensión .ASM al archivo y poner GUARDAR. 8. Escribir el programa en assembler. 9. Una vez escrito, para ensamblar ir al menú “Project” y poner “Build all”. En el caso de salir el siguiente mensaje “do you want this project to generate absolute or relocate code?” seleccionar ABSOLUTE. 10. Si no hubo errores de sintaxis, aparecerá el mensaje “BUILD SUCCEEDED”. Simulación 11. Para realizar una simulación del programa, primero ir a “Debugger” “Select tool” y seleccionar “MPLAB SIM”. 12. Luego ir a “Debugger” “Stimulus” para establecer el estado que tendrán las entradas PIC. a. New workbook b. Agregar el/los pines de entrada y establecer el estado bajo el cual será modificado en la simulación, por ej. En el caso del ejercicio resuelto se toma el pin RB0 en Toggle, es decir al presionar sobre el mismo cambia el estado. c. Guardar el Stimulus workbook File. 13. En el menú “View” activar los elementos que se deseen visualizar durante la simulación. a. View>”Watch” allí agregar los Registros (SFR) “Add SFR” que se desee visualizar en la simulación así como se pueden agregar las variables “Add Symbol”. 14. Para iniciar la simulación, ir a “Debugger”> “Animate”. 15. Si la simulación fue satisfactoria, hay buenas posibilidades de que el programa funcione correctamente una vez grabado en el PIC. Página 6 UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales Pin-out PIC16F628 Página 7 2014 UNIVERSIDAD NACIONAL DE SAN LUIS Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales Página 8 2014