INSTITUTO TECNOLÓGICO DE CHIHUAHUA
Microcontroladores (15:00-14:00)
Práctica # 1 Intermitencia con el PIC16F884 (SEMAFORO) (ASM). ALUMNOS González Garza Miguel Angel Medina Piñón Gustavo Abdi Polo Aguilar Gabriela Rodríguez Olivas Erick Daniel
Ing. Jorge Aguirre Beltrán
13 de octubre 2014
con el PIC16F884 (SEMAFORO) (ASM). (ASM). Práctica No.1 Intermitencia con
Objetivo: Realizar un programa en lenguaje ensamblador, usando como base el programa de intermitencia y direccionar las salidas a un solo puerto así como la aplicación de los conocimientos vistos en clase. software Mplab y al Introducción: Esta práctica contribuye a la familiarización con el software utilizar el simulador simulador nos ayudara a comprende como funciona la arquitectura arquitectura del microcontrolador. En el simulador(MPLABSIM) se pueden ver los movimientos en los registros, la memoria de datos, la memoria de programa, el registro de estado, también se le puede asignar las entradas y salidas así como el comportamiento de nuestro programa mientras se corre paso a paso. Además la elaboración de dicha práctica nos ayudara comprender la conexión básica del microcontrolador para que funcione este funcione de la manera adecuada. El programa funciona de la siguiente siguiente manera: Al energizar el sistema, tenemos 4 semáforos funcionando. El semáforo 1 tendrá sus led’s conectados en paralelo a los led’s del semáforo 2, conectado de la siguiente manera: led verde al pin RB0, led amarillo amarillo al pin RB1 y led rojo al pin RB2, y para el semáforo 3 se tiene el mismo puerto B, pero en diferentes pines, el led verde al pin RB3, el led amarillo al pin RB4 y led rojo al pin RB5, este semáforo semáforo estará conectado en paralelo a los otros led’s del semáforo 4. 4. Esto con la finalidad de que cuando los 2 semáforos se encuentren encendidos en verde, los otros 2 semáforos del pin RB3-RB5 estén prendidos en rojo, el semáforo 1 y 2 duran encendidos en verde por un momento, posteriormente comienzan a parpadear y después de unos segundos cambia a amarillo, mientras que el semáforo 3 y 4 se mantienen en rojo y cuando el semáforo 1 y 2 cambie a rojo, el semáforo 3 y 4 cambiara a verde y viceversa. Este ciclo se repetirá indefinidamente.
Esta práctica se correlaciona con el Tema 2.1 de la Unidad 2. Material y Equipo utilizado: 1 Microcontrolador PIC16F884 1 Cristal 4 Mhz 2 Capacitores de 22pf o 15pf 12 Leds 1 Resistencia de 10 Kohms 6 Resistencia de 220 ohms 1 Fuente de +5 VDC (Opcional: 1 Pila Cuadrada de +9Vdc, 1 Reg. 7805) ------------------------------------1 Software de MPLAB 1 Grabador de Pics
I.Metodología: 1- Utilice el software MPLAB para editar el programa intermitencia.asm que se muestra mas adelante.
2- Ensamble, Simule y entienda el funcionamiento del programa. 3- Grabe el archivo (.HEX obtenido al ensamblar) en el PIC NOTA: En este primer ejemplo se utiliza la librería para el PIC 16F884 es necesario poner entonces las siguientes directivas: LIST P=PIC16F84 #include p16f884.inc Si su programador no cuenta con la opción de poner la palabra de configuración , entonces es necesario agregar la configuración por software con la directiva (__config) de la siguiente forma: LIST P=PIC16F884 #include p16f84.inc __confi __co nfig g _XT_ _X T_OSC OSC & _PWRTE _P WRTE_OFF _OFF & _WDT_O _W DT_OFF FF & _CP_OF _C P_OFF F & _LVP_OF _LVP _OFF F & _WRT_ENABLE_OFF Observe que en esta configuración se selecciona la oscilación XT porque el cristal a utilizar es de 4 MHZ y todas las opciones están en OFF. 4- Arme el circuito de acuerdo al diagrama de conexión. 5- Pruebe el buen funcionamiento del programa. 6- Ahora modifique el programa para que realice alguna de las siguientes opciones. a) Cuando prenda el LED en RB0 apague un LED conectado en el pin RB3, realice un retardo de tiempo y luego prenda el LED en RB3 y apague el LED en RB0, este ciclo lo deberá realizar indefinidamente. b) Simular las luces de un semáforo asignando al pin RB0 un led de color verde, al pin RB1 un led de color amarillo y al pin RB2 un led de color rojo. Asigne los tiempos de retardo tal como un semáforo real. 7- Reporte sus resultados.
II. Programa fuente Intermitencia: ;************************************** ;* intermitencia.asm intermitencia.asm * ;* Este programa configura RB0 como salida * ;* y genera una intermitencia intermitencia en dicha salida * ;* * ;* Rev A: By Ing. Jorge Aguirre * ;************************************** ;La siguiente configuración solo se utiliza si usamos alguna librería ejemplo: LIST P=PIC16F874 #include p16f874.inc __confi __c onfig g _XT_O _X T_OSC SC & _PWRTE _P WRTE_OFF _OFF & _WDT_O _W DT_OFF FF & _CP_OF _C P_OF F & _LVP_OF _LVP _OFF F & _WRT_ENABLE_OFF
CUENTA1
EQU
CUENTA2
EQU
F w
EQU EQU
1 0
ORG 00H BSF STATUS,5 BCF TRISB,0 BCF STATUS,5 INICIO BSF PORTB,0 CALL DELAY BCF PORTB,0 CALL DELAY GOTO INICIO
20H ;las variables que usemos siempre a ;partir de la dirección 20Hh 21H ;Constantes del programa
;Inicia en la dirección 00H de la memoria de programa ;banco 1 ;RB0 como salida ;banco 0 ;Pone a "1" RB0 (enciende) ;Llama a la subrutina de retardo ;Cuando vuelve del retardo pone ;a "0" RB0 (apaga) ;llama a la subrutina de retardo ;cuando vuelve del retardo ;repite el ciclo
;======================= ;= DELAY: Subrutina de retardo = ;= Modifica los siguientes registros: = ;= CUENTA1 = ;= CUENTA2 = ;======================= ;(Conviene hacerse un pequeño resumen de lo que ;hace cada subrutina, puede sernos muy útil para ;usarla en otros programas) ;Subrurtina hecha con 2 lazos anidados DELAY MOVLW
0ffH
MOVWF CUENTA1 ACA1 MOVLW 0FFH MOVWF CUENTA2 ACA
DECFSZ CUENTA2,F
GOTO ACA
;Carga el acumulador W con el valor ;de FFH (255 en decimal) ;Mueve el contenido del acumulador ;a CUENTA1 ;Carga CUENTA2 con el valor FFH
;Decrementa CUENTA2, guarda el resultado ;en f(CUENTA2), y si es cero se salta la ;siguiente instrucción ;Vuelve a decrementar mientras
DECFSZ CUENTA1,F GOTO ACA1 RETURN
;CUENTA2 no sea cero ;Se decrementa CUENTA1 cada vez que ;CUENTA2 llega a cero ;mientras CUENTA1 no llegue a cero recarga ;CUENTA2 y repite el proceso ;retorna al programa principal
;= = ;= FIN DE LA SUBRUTINA DELAY = ;=========================== END
;Fin del programa
III. Código de la Intermitencia con el PIC16F884 (SEMAFORO) (ASM). ;************************************** ;* semaforo.asm * ;* Este programa simula un crucero con 4 * ;* semáforos configurados en el puerto B * ;* * ;* Rev A: By Equipo #3 * ;************************************** LIST P=PIC16F884 #include p16f884.inc ; __config _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF & _LVP_OFF & _WRT_ENABLE_OFF CUENTA1
EQU
CUENTA2
EQU
F w
EQU EQU
20H ;las variables que usemos siempre a ;partir de la dirección 20Hh 21H
1 0
ORG 00H BSF STATUS,5 BCF TRISB,0 BCF TRISB,1 BCF TRISB,2 BCF TRISB,3 BCF TRISB,4 BCF TRISB,5 ;MOVLW 00H ;MOVF TRISB BCF STATUS,5
;Constantes del programa
;Inicia en la dirección 00H de la memoria de programa ;banco 1
;Carga un 0 al acumulador ;Asigna una cero todo el puerto ;banco 0
INICIO MOVLW B'00100001' MOVWF PORTB CALL DELAY CALL DELAY CALL DELAY CALL DELAY MOVLW B'00100000' MOVWF PORTB CALL DELAY MOVLW B'00100001' MOVWF PORTB CALL DELAY MOVLW B'00100000' MOVWF PORTB CALL DELAY MOVLW B'00100001' MOVWF PORTB CALL DELAY MOVLW B'00100000' MOVWF PORTB CALL DELAY MOVLW B'00100001' MOVWF PORTB CALL DELAY MOVLW B'00100010' MOVWF PORTB CALL DELAY CALL DELAY CALL DELAY CALL DELAY MOVLW B'00001100' MOVWF PORTB CALL DELAY CALL DELAY CALL DELAY CALL DELAY MOVLW B'00001100' MOVWF PORTB CALL DELAY MOVLW B'00001100' MOVWF PORTB CALL DELAY MOVLW B'00000100'
MOVWF PORTB CALL DELAY MOVLW B'00001100' MOVWF PORTB CALL DELAY MOVLW B'00000100' MOVWF PORTB CALL DELAY MOVLW B'00001100' MOVWF PORTB CALL DELAY MOVLW B'00010100' MOVWF PORTB CALL DELAY CALL DELAY CALL DELAY CALL DELAY GOTO INICIO ;repite el ciclo ;======================= ;= DELAY: Subrutina de retardo = ;= Modifica los siguientes registros: = ;= CUENTA1 = ;= CUENTA2 = ;======================= ;(Conviene hacerse un pequeño resumen de lo que ;hace cada subrutina, puede sernos muy útil para ;usarla en otros programas) ;Subrurtina hecha con 2 lazos anidados DELAY MOVLW 0ffH ;Carga el acumulador W con el valor ;de FFH (255 en decimal) MOVWF CUENTA1 ;Mueve el contenido del acumulador ;a CUENTA1 ACA1 MOVLW 0FFH ;Carga CUENTA2 con el valor FFH MOVWF CUENTA2 ACA DECFSZ CUENTA2,F ;Decrementa CUENTA2, guarda el resultado en f(CUENTA2), y si es cero se salta la siguiente instrucción GOTO ACA ;Vuelve a decrementar mientras CUENTA2 no sea cero
DECFSZ CUENTA1,F llega a cero GOTO ACA1 y repite el proceso RETURN
;Se decrementa CUENTA1 cada vez que CUENTA2 ;mientras CUENTA1 no llegue a cero recarga CUENTA2 ;retorna al programa principal
;= = ;= FIN DE LA SUBRUTINA DELAY = ;=========================== END
;Fin del programa
IV. Diagrama de conexión
V. Conclusión. Gabriela Polo Aguilar El semáforo diseñado cumple con los requisitos pedidos por el maestro, su funcionamiento es correcto aunque tuvimos problemas al momento de direccionarlo todo al puerto B. Pero al final se encontró la solución al problema. Por otro lado el aplicar los conocimientos vistos en clase nos ayudó a comprender el funcionamiento y la importancia que tiene el tiempo en este lenguaje, y a pesar de que en la actualidad se utiliza más el lenguaje C este no le resta importancia al lenguaje ensamblador. Porque siempre es importante conocer el origen de las cosas y así comprender lo que actualmente se tiene.
VI. Bibliografía Preliminar: [1] Microchip Technology Inc., “PIC16F873/874/876/877 Data Sheet”, 2003 [2] Microchip Technology Inc., Inc., “PIC18F2455/2550/4455/4550 Data Sheet”, 2009 [3] Tópicos del Help en el MPLAB(MPLAB-IDE, MPLAB- Editor, MPLAB-SIM) [4] E. Martín Cuenca. Microcontroladores PIC. Diseño práctico de aplicaciones Ed. Mc. Graw Hill [5] Apuntes del Maestro. [6] http://www.microchip.com