procesadores i guia tp7 introducción al assembler …pmp/archivos/guia_tp7_directivas...
TRANSCRIPT
Página 1
UNIVERSIDAD NACIONAL DE SAN LUIS 2014 Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales
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 Parámetro Función
Watchdog _WTD_ON / _WDT_OFF activa / desactiva
Power-up timer _PWRTE_ON / _PWRTE_OFF activa / desactiva
Protección de código
_CP_ON / _CP_OFF activa / desactiva
Oscilador _XT_OSC Cristal
_HS_OSC cristal frecuencia > 4MHz
_RC_OSC circuito R-C
_LP_OSC cristal low power
_INTOSC_OSC_CLKOUT clock interno 4MHz con salida por pin 15
_INTOSC_OSC_NOCLKOUT clock interno 4MHz sin salida
Entrada MCLR _MCLRE_ON / _MCLRE_OFF pin 4 actúa como MCLR / RA5
Low voltaje programming (LVP)
_LVP_ON / _LVP_OFF 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> ó INCLUDE "DELAY100.INC"
Página 2
UNIVERSIDAD NACIONAL DE SAN LUIS 2014 Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales
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 ;PIN DE ENTRADA DEL INTERRUPTOR
ORG 0000
GOTO INICIO ; 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 3
UNIVERSIDAD NACIONAL DE SAN LUIS 2014 Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales
MOVWF TRISA ;RA (4:0)COMO SALIDA, RA(5),RA(6-7)DEPENDE
DEL MODO DEL OSCILADOR MOVLW B'00000001'
MOVWF TRISB ;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 ;ACTIVA INTERRUPCION POR RB0
BSF INTCON,GIE ;ACTIVA INTERRUPCIONES GLOBALES
BCF INTCON,INTF ;PONE EN BAJO EL FLAG DE INTERRUPCIONES POR
RB0
REPETIR BSF PORTA,LED
SLEEP
GOTO REPETIR
;***********************SUBRUTINA PARA RETARDO DE 1SEG***************
RETARDO
MOVLW P ;1
MOVWF CONT3 ;1
CICLO3 MOVLW M ;1
MOVWF CONT2 ;1
CICLO2 MOVLW N ;1
MOVWF CONT ;1
CICLO DECFSZ CONT,f ;1*(N-1)+2
GOTO CICLO ;2*(N-1)
DECFSZ CONT2,f ;1*(M-1)+2
GOTO CICLO2 ;2*(M-1)
DECFSZ CONT3,f ;1*(P-1)+2
GOTO CICLO3 ;2*(P-1)
RETURN
END
Página 4
UNIVERSIDAD NACIONAL DE SAN LUIS 2014 Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales
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 5
UNIVERSIDAD NACIONAL DE SAN LUIS 2014 Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales
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 6
UNIVERSIDAD NACIONAL DE SAN LUIS 2014 Facultad de Ciencias Físico Matemáticas y Naturales Técnico Universitario en Microprocesadores Ingeniería Electrónica Orientación Sistemas Digitales
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 7
UNIVERSIDAD NACIONAL DE SAN LUIS 2014 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