ESCUELA SUPERIOR POLITÉCNICA DEL LITORAL FACULTAD DE INGENIERIA EN EN ELECTRICIDAD Y COMPUTACIÓN FIEC PRACTICAS DE LABORATORIO DE MICROCONTROLADORES PARALELO # 1 Integrantes: Juan Carlo Pezo Oquendo Carlos Moisés Díaz Espinoza Profesor: Ing. Hugo Villavicencio V. Fecha de Presentación: Noviembre 23, 2011 PRACTICA 5 CONTADORES
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
ESCUELA SUPERIOR POLITÉCNICA DEL LITORAL
FACULTAD DE INGENIERIA ENEN ELECTRICIDAD Y COMPUTACIÓN
FIEC
PRACTICAS DE LABORATORIO DE MICROCONTROLADORES
PARALELO # 1
Integrantes:
Juan Carlo Pezo OquendoCarlos Moisés Díaz Espinoza
Profesor:Ing. Hugo Villavicencio V.
Fecha de Presentación:Noviembre 23, 2011
PRACTICA 5CONTADORES
PRACTICA 5CONTADORES
1.- Enunciado del proyecto
Esta práctica consta de tres programas, el primero muestra un display conectado al puerto b, que marca las unidades controladas mediante interrupciones y demás condiciones planteadas en la codificación del programa. El segundo consta de dos displays que conectados el uno al puerto b y el otro al puerto c, mostrarán, uno las unidades y el otro las decenas, utilizando el mismo sistema del programa anterior. El tercero muestra un display con dos displays pero estos están conectados ambos al puerto b, aquí utilizaremos la técnica de multiplexación.
2.- Diagrama de Bloques
PIC 16F887 PIC 16F887
DISPLAYDISPLAY
RESISTENCIASRESISTENCIAS
3.- Diagramas de Flujos funcional del Programa principal
CONTADOR CON DISPLAY DE SIETE SEGMENTOSUSANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms
PARA CONTAR CADA SEGUNDO
Subrutina
Subrutina
CONTADOR DE DOS DIGITOS CON DISPLAY DE SIETE SEGMENTOSUSANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms (10x100)
PARA INCREMENTAR SU VALOR CADA SEGUNDO DE 00-99
.
4.-Descripción del algoritmo o estrategia utilizada.
InicioInicio
Seteo de puertos
Seteo de puertos
Activar las interrupciones
globales
Activar las interrupciones
globales
Cargar con divisor 255 el TMR0
Cargar con divisor 255 el TMR0
TMR0<= 217Contador <= 100
TMR0<= 217Contador <= 100
w<= unidadescall tabla
PortB<= cod 7 segw<= decenas
call tablaPortC<= cod 7 seg
w<= unidadescall tabla
PortB<= cod 7 segw<= decenas
call tablaPortC<= cod 7 seg
Decfsz Contador Decfsz
Contador
No
TMR <= 217T0FI<=0
TMR <= 217T0FI<=0
Decenas<=0Decenas<=0
Subwf unidades,
w<=10
Subwf unidades,
w<=10
Subwf unidades,
w<=10
Subwf unidades,
w<=10Contador<=100Contador<=100
Unidades<=0Incf decenas
Incf unidades
Si
No
Si
No
Si
1. En el primer ejercicio para realizar el retardo de un segundo se utiliza el TMR0 inicializándolo con 217 para q exista una interrupción cada 10mS, repitiendo dicha acción 100 veces para obtener un segundo antes de realizar el incremento y cambiar el valor del display.
2. En el segundo se configura el TMR0 igual q en el del primero sino q en este caso se van mostrando en dos displays las unidades y decenas.
3. Por último se vuelve a utilizar la misma configuración en el TMR0 pero con la técnica de multiplexación y los displays se van refrescando cada 20ms.
5.- Listado del programa fuente en lenguaje ensamblador con comentarios en las líneas de código que considere fundamentales
EJERCICIO # 1;*********************************************************************; CONTADOR CON DISPLAY DE SIETE SEGMENTOS ; USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms; PARA CONTAR CADA SEGUNDO;*********************************************************************; NOMBRE: p5a_1d.asm; FECHA: 21/06/2010; VERSION: 1.00; PROGRAMADOR: Carlos Valdivieso;*********************************************************************; DESCRIPCION: ;Se trata de incrementar un contador cada segundo y mostrar su valor en ;el display. Se programa el tmr0 para que genere ;una interrupción cada 0.01 ;seg. (10 mS) que se repetirá 50 veces con el objeto de activar el conteo;cada 500 Ms. ;Use reloj de 4MHz.;*********************************************************************;DIRECTIVAS
LIST p=16F887 ;Tipo de microcontroladorINCLUDE P16F887.INC ;Define los SFRs y bits del
errorlevel -302 ;Deshabilita mensajes de ;advertencia por cambio bancos
;La directiva "cblock 0X20...endc" reserva espacios de memoria a partir de 0x20CBLOCK 0X020contador ;Cuenta 100 interrupcionesunidades ;registro de unidadesuni_cod ;Código de 7 segmentos de unidadesENDC
;INICIO DE PROGRAMAORG 0x00 ;Vector de RESETGOTO MAINORG 0x04 ;Vector de interrupciónGOTO INTERRUPCION
INTERRUPCION decfsz contador,f ;Decrementa el contador 100 veces
goto Seguir ;No, todavíamovf unidades,w ;Ya ocurrieron 100 int de 10ms (1000ms)call tablamovwf uni_codmovf uni_cod,wmovwf PORTBINCF unidades,f
cont movlw .100 movwf contador ;Repone el contador con 100 Seguir
movlw .217 ;"~.39" es el complemento a 256;equivale a ".217"
movwf TMR0 ;Repone el TMR0 con 217bcf INTCON,T0IF ;Repone flag del TMR0
RETFIE ;Retorno de interrupción
MAIN;SETEO DE PUERTOS
BANKSEL ANSELCLRF ANSELCLRF ANSELHBANKSEL TRISB ;Selecciona el Bank1CLRF TRISB ;PORTB configurado como salida
;PROGRAMACION DEL TMR0banksel OPTION_REG movlw b'00000111' ;Programa TMR0 como temporizadormovwf OPTION_REG ;con preescaler de 256
;INICIALIZACIONBANKSEL PORTB ;Selecciona el Bank 0CLRF PORTBclrf unidades
;El valor calculado para cargar en TMR0 es de 217 con un preescaler ;de 256 y a una frecuencia de 4MHz, para obtener una interrupción ;cada 10mS.
movlw .217 ;Valor decimal 217movwf TMR0 ;Carga el TMR0 con 217movlw .100 ;Cantidad de interrupciones a contarmovwf contador ;Nº de veces a repetir la interrupción
;PROGRAMACION DE INTERUPCIONmovlw b'10100000'movwf INTCON ;Activa la interrupción del TMR0
; TABLA DE CONVERSIONtabla ADDWF PCL,F ; PCL + W -> W
; El PCL se incrementa con el ; valor de W proporcionando un ; salto
RETLW 0x3F ; Retorna con el código del 0RETLW 0x06 ; Retorna con el código del 1RETLW 0x5B ; Retorna con el código del 2RETLW 0x4F ; Retorna con el código del 3RETLW 0x66 ; Retorna con el código del 4RETLW 0x6D ; Retorna con el código del 5RETLW 0x7D ; Retorna con el código del 6RETLW 0x07 ; Retorna con el código del 7RETLW 0x7F ; Retorna con el código del 8RETLW 0x67 ; Retorna con el código del 9END ; Fin del programa fuente
EJERCICIO # 2
;********************************************************************; CONTADOR DE DOS DIGITOS CON DISPLAY DE SIETE SEGMENTOS
; USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms (10x100); PARA INCREMENTAR SU VALOR CADA SEGUNDO DE 00-99;*********************************************************************; NOMBRE: p5b_2d.asm; FECHA: 21/06/2010; VERSION: 1.00; PROGRAMADOR: Carlos Valdivieso;*********************************************************************; DESCRIPCION: ;Se trata de incrementar un contador cada segundo y mostrar su valor;en dos displays. Uno para unidades y otro para decenas. El tmr0 se ;programa para que genere una interrupción cada 0.01 seg. (10 mS) que; se repetirá 100 veces con el objeto de activar el conteo cada 1000 mS. ;Use un reloj de 4MHz.;*********************************************************************;DIRECTIVAS
LIST p=16F887 ;Tipo de microcontroladorINCLUDE P16F887.INC ;Define los SFRs y bits del
ORG 0x00 ;Vector de RESETGOTO MAINORG 0x04 ;Vector de interrupciónGOTO Interrupcion ;Va a rutina de interrupción
;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES;PARA COMPLETAR 10x100=1000ms. Interrupcion
movf unidades,w call tablamovwf uni_codmovf uni_cod,wmovwf PORTBmovf decenas,w call tablamovwf dec_codmovf dec_cod,wmovwf PORTCdecfsz contador,f ;Cuenta espacios de 10msgoto Seguir ;Aún, no son 100 interrupcionesINCF unidades,f ;Ahora sí 10x100=1000ms=1segmovlw .10subwf unidades,wbtfss STATUS,2goto contclrf unidadesincf decenasmovlw .10subwf decenas,wbtfss STATUS,2goto contclrf decenas
cont movlw .100 movwf contador ;Precarga contador con 100Seguir
bcf INTCON,T0IF ;Repone flag del TMR0 movlw .217
movwf TMR0 ;Repone el TMR0 con ~.39 retfie ;Retorno de interrupción
MAIN;SETEO DE PUERTOS
BANKSEL ANSELCLRF ANSELCLRF ANSELHBANKSEL TRISB ;Selecciona el Bank1CLRF TRISB ;PORTB configurado como salidaCLRF TRISC ;PORTC configurado como salida
;INICIALIZACION BANKSEL PORTB ;Selecciona el Bank0CLRF PORTB ;Borra latch de salida de PORTBCLRF PORTC ;Borra latch de salida de PORTCCLRF unidadesCLRF decenas
;El valor calculado para cargar en TMR0 es de 217 con un ;preescaler de 256 y a una frecuencia de 4MHz, para obtener ;una interrupción cada 10mS. Cálculo al final del ejercicio.
;PROGRAMACION DEL TMR0banksel OPTION_REG movlw b'00000111' ;TMR0 como temporizadormovwf OPTION_REG ;con preescaler de 256 BANKSEL TMR0movlw .217 ;Valor decimal 217movwf TMR0 ;Carga el TMR0 con 217
;PROGRAMACION DE INTERRUPCIONmovlw b'10100000'movwf INTCON ;Activa la interrupción del TMR0movlw .100 ;Cantidad de interrupciones a contarmovwf contador ;Nº de veces a repetir la interrupción
Loopnopgoto Loop
; TABLA DE CONVERSION
tabla ADDWF PCL,F ; PCL + W -> W
; El PCL se incrementa con el ; valor de W proporcionando un ; salto
RETLW 0x3F ; Retorna con el código del 0RETLW 0x06 ; Retorna con el código del 1RETLW 0x5B ; Retorna con el código del 2RETLW 0x4F ; Retorna con el código del 3RETLW 0x66 ; Retorna con el código del 4RETLW 0x6D ; Retorna con el código del 5RETLW 0x7D ; Retorna con el código del 6RETLW 0x07 ; Retorna con el código del 7RETLW 0x7F ; Retorna con el código del 8RETLW 0x67 ; Retorna con el código del 9END ; Fin del programa fuente
EJERCICIO # 3
;*********************************************************************; CONTADOR DE DOS DIGITOS MULTIPLEXADO CON DISPLAY DE ; SIETE SEGMENTOS USANDO EL TMR0 COMO BASE DE TIEMPO ; DE 10ms (10x100) PARA INCREMENTAR SU VALOR CADA ; SEGUNDO DE 00-99;*********************************************************************; NOMBRE: p5c_2dm.asm; FECHA: 21/06/2010; VERSION: 1.00; PROGRAMADOR: Carlos Valdivieso;*********************************************************************; DESCRIPCION: ;Se trata de incrementar un contador cada segundo y mostrar su valor ;en dos displays colocados en el puerto B usando la técnica de
; multiplexación. Uno para unidades y otro para decenas. Los displays se;refrescan cada 20ms. El tmr0 se programa para que genere una interrupción;cada 0.01 seg.; (10 mS) que se repetirá 100 veces con el objeto de activar ;el conteo cada 1000 mS. Use un reloj de 4MHz.;*********************************************************************;DIRECTIVAS
LIST p=16F887 ;Tipo de microcontroladorINCLUDE P16F887.INC ;Define los SFRs y bits del
;P16F887
__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC;Setea parámetros de ;configuración
errorlevel -302 ;Deshabilita mensajes de ;advertencia por cambio ;bancos
decdecfsz contador,f ;cuenta espacios de 10msgoto Seguir ;Aún, no son 100 interrupcionesINCF unidades,f ;Ahora sí 10x100=1000ms=1segmovlw .10subwf unidades,wbtfss STATUS,2goto contclrf unidadesincf decenasmovlw .10subwf decenas,wbtfss STATUS,2goto contclrf decenas
cont
movlw .100 movwf contador ;Carga contador con 100Seguir
bcf INTCON,T0IF ;Repone flag del TMR0 movlw ~.39
movwf TMR0 ;Repone el TMR0 con ~.39 retfie ;Retorno de interrupción
MAIN;SETEO DE PUERTOS
BANKSEL ANSEL ;Selecciona el Bank3CLRF ANSELCLRF ANSELHBANKSEL TRISA ;Selecciona el Bank1CLRF TRISA ;PORTA configurado como salidaCLRF TRISB ;PORTB configurado como salida
;INICIALIZACION BANKSEL PORTA ;Selecciona el Bank0CLRF PORTA ;Borra latch de salida de PORTBCLRF PORTB ;Borra latch de salida de PORTCclrf unidadesclrf decenasclrf sel
;PROGRAMACION DEL TMR0banksel OPTION_REG ;Selecciona el Bank1movlw b'00000111' ;TMR0 como temporizadormovwf OPTION_REG ;con preescaler de 256 BANKSEL TMR0 ;Selecciona el Bank0movlw .217 ;Valor decimal 217movwf TMR0 ;Carga el TMR0 con 217
;PROGRAMACION DE INTERRUPCIONmovlw b'10100000'movwf INTCON ;Activa la interrupción del TMR0movlw .100 ;Cantidad de interrupciones a contarmovwf contador ;Nº de veces a repetir la interrupción
Loopnopgoto Loop
; TABLA DE CONVERSION---------------------------------------------------------
tabla ADDWF PCL,F ; PCL + W -> W
; El PCL se incrementa con el ; valor de W proporcionando un ; salto
RETLW 0x3F ; Retorna con el código del 0RETLW 0x06 ; Retorna con el código del 1RETLW 0x5B ; Retorna con el código del 2RETLW 0x4F ; Retorna con el código del 3RETLW 0x66 ; Retorna con el código del 4RETLW 0x6D ; Retorna con el código del 5RETLW 0x7D ; Retorna con el código del 6RETLW 0x07 ; Retorna con el código del 7RETLW 0x7F ; Retorna con el código del 8RETLW 0x67 ; Retorna con el código del 9END ; Fin del programa fuente
6.- Copia impresa del circuito armado en PROTEUS para la simulación en el momento de su ejecución
EJERCICIO # 1
EJERCICIO # 2
EJERCICIO # 3
7.- Conclusiones
En el ejercicio 2 utilizamos el puerto B configurado como unidades y el puerto C como decenas para mostrar a través de dos displays valores generados entre 0 y 99, ahora bien podemos concluir que para aplicaciones es mejor usar una implementación más reducida, y con mejor eficiencia, por lo tanto, se llevo a cabo el uso del mismo contador con el método de multiplexación que se detalla a continuación.
Mediante la técnica de multiplexación lo que hacemos es enviar el dato correspondiente a los dos displays, pero sólo encendemos el display1. El display2 permanece apagado, este estado lo mantenemos durante un tiempo de 20ms en nuestra práctica, además que se genera una interrupción con repetición de 100 veces con el fin de activar el conteo cada 1000ms. Con esto podemos visualizar datos de más de 1 dígito.
Finalmente realizamos 4 circuitos con el mismo fin, es decir, que fueron usados como contadores, solo que cada uno presentó una técnica distinta de implementación y mediante esto pudimos llegar a la conclusión que el método mejor empleado sería el de multiplexación, aunque presenta deficiencias para el uso de programas más complejos, nos facilitó el trabajo a nosotros.
8.- Recomendaciones
Se recomienda para esta práctica aplicar el método de multiplexación en el microcontrolador ya que reduce pines de entradas y salidas en displays de 7 segmentos porque de otra forma estos necesitarían de 8 pines de salida por cada dígito.
No se recomienda para propósitos generales el uso de esta técnica, porque se pierden numerosos recursos de memoria para manejar la multiplexación dentro del micro, y con programas más complejos se torna difícil mantener una compensación en los tiempos.
Se recomienda utilizar subrutinas dentro de un programa para facilitar la resolución de la misma. Como se observó en la presente práctica, la rutina tabla que se utilizó para presentar los datos por display nos permitió la conversión respectiva y resolver el problema de manera efectiva y estructurada.
Ejercicio Extra
;*********************************************************************; RELOJ BINARIO;*********************************************************************; NOMBRE: p5d_2dm.asm; FECHA: 21/06/2010; VERSION: 1.00; PROGRAMADOR: Carlos Valdivieso;*********************************************************************; DESCRIPCION: ;Se trata de mostrar valores de segundos minutos y horas utilizando ;como DISPLAY para los segundos 6 LEDS del puerto A, para los minutos ;6 LEDS del puerto B y para las horas 2 LEDS del puerto C.;Deberá simularlo a velocidad normal y a velocidad rápida para poder;observar el correcto funcionamiento.;; Use un reloj de 4MHz.;*********************************************************************;DIRECTIVAS
LIST p=16F887 ;Tipo de microcontroladorINCLUDE P16F887.INC ;Define los SFRs y bits del ;P16F887__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC
errorlevel -302 ;Deshabilita mensajes de ;advertencia por cambio ;bancos
;PROGRAMACION DEL TMR0;banksel OPTION_REG ;Selecciona el Bank1BSF STATUS,RP0
BCF STATUS,RP1 movlw b'00000111' ;TMR0 como temporizadormovwf OPTION_REG ;con preescaler de 256 ;BANKSEL TMR0 ;Selecciona el Bank0BCF STATUS,RP0BCF STATUS,RP1 movlw .217 ;Valor decimal 217movwf TMR0 ;Carga el TMR0 con 217
;Presiona la tecla para iniciar
ATECLA BTFSC PORTA,1 ;probar si usuario apreta tecla RA1GOTO ATECLA ;si apreta salta a LTECLA
LTECLA BTFSS PORTA,1 ;AQUI espera hasta que se afloje teclaGOTO LTECLA ;si afloja salta a la siguiente instruccionCALL ALARMACALL PARAR_ALARMA
;PROGRAMACION DE INTERRUPCIONPTMR0
movlw b'10100000'movwf INTCON ;Activa la interrupción del TMR0movlw .100 ;Cantidad de interrupciones a contarmovwf contador ;Nº de veces a repetir la interrupción
;****************************RETURN TABLA DE CONVERSION**************************
tabla ADDWF PCL,F ; PCL + W -> W
; El PCL se incrementa con el ; valor de W proporcionando un ; salto
RETLW B'00000000' ; Retorna con el código del 0RETLW B'00001000' ; Retorna con el código del 1RETLW B'00000100' ; Retorna con el código del 2RETLW B'00001100' ; Retorna con el código del 3RETLW B'00000010' ; Retorna con el código del 4RETLW B'00001010' ; Retorna con el código del 5RETLW B'00000110' ; Retorna con el código del 6RETLW B'00001110' ; Retorna con el código del 7RETLW B'00000001' ; Retorna con el código del 8RETLW B'00001001' ; Retorna con el código del 9