Top Banner
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
24

Lab.Microcont_Práctica5

Oct 30, 2014

Download

Documents

Jack Román
Welcome message from author
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
Page 1: Lab.Microcont_Práctica5

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

Page 2: Lab.Microcont_Práctica5

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

Page 3: Lab.Microcont_Práctica5

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

Page 4: Lab.Microcont_Práctica5

Subrutina

Page 5: Lab.Microcont_Práctica5

Subrutina

Page 6: Lab.Microcont_Práctica5

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

Page 7: Lab.Microcont_Práctica5

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

;P16F887__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC

;Setea parámetros de ;configuración

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

Page 8: Lab.Microcont_Práctica5

movlw .10subwf unidades,wbtfss STATUS,2goto contclrf unidades

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

;MOSTRAR CERO INICIALclrwcall tablamovwf uni_codmovf uni_cod,wmovwf PORTBINCF unidades,f

Loopnopgoto Loop

; 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

Page 9: Lab.Microcont_Práctica5

; 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

;P16F887__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC

;Setea parámetros de ;configuración

errorlevel -302 ;Deshabilita mensajes de ;advertencia por cambio ;bancos

CBLOCK 0X020contador ;Cuenta 100 interrupcionesunidadesuni_coddecenasdec_codENDC

;*********************************************************************;PROGRAMA

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

Page 10: Lab.Microcont_Práctica5

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

Page 11: Lab.Microcont_Práctica5

; 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

CBLOCK0X020contador ;Cuenta 100 interrupcionesunidadesuni_coddecenasdec_codselENDC

;*********************************************************************;PROGRAMA

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 sel,w ;Se mueve a si mismo para afectar banderabtfss STATUS,2 ;sel=0 refresca dig1; sel=1 refresca dig2goto dig2

dig1 movf unidades,w call tablamovwf uni_codmovf uni_cod,wbsf PORTA,0bsf PORTA,1movwf PORTBbcf PORTA,0comf sel,fgoto dec

dig2movf decenas,w call tablamovwf dec_codmovf dec_cod,wbsf PORTA,0bsf PORTA,1movwf PORTBbcf PORTA,1comf sel,f

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

Page 12: Lab.Microcont_Práctica5

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

Page 13: Lab.Microcont_Práctica5

EJERCICIO # 2

Page 14: Lab.Microcont_Práctica5

EJERCICIO # 3

7.- Conclusiones

Page 15: Lab.Microcont_Práctica5

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

Page 16: Lab.Microcont_Práctica5

;*********************************************************************; 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

N EQU .1N1 EQU 0CHN3 EQU .50CNT EQU 0DHft equ .217

; *************************** DEFINICIONES ****************************cblock 0x20

contador ;RES 1 ;Cuenta hasta100 interrupciones

temp_dh ;RES 1unidades ;RES 1decenas ;RES 1unis_cod ;RES 1decs_cod ;RES 1unidades_minutos ;RES 1decenas_minutos ;RES 1unim_cod ;RES 1decm_cod ;RES 1unidades_horas ;RES 1decenas_horas ;RES 1unih_cod ;RES 1dech_cod ;RES 1sel ;RES 1

endc

ORG 0x00GOTO MAINORG 0x04 ;Vector de interrupciónGOTO Interrupcion ;Va a rutina de interrupción

; ********************* RUTINA DE INTERRUPCION*************************INTERRUPCION ;PRESIONA LA TECLA RA1ATECLA1 BTFSC PORTA,1

GOTO ATECLA4 ;si apreta salta a LTECLA1LTECLA1 BTFSS PORTA,1 ;AQUI espera hasta que se afloje tecla

GOTO LTECLA1 ;si afloja salta a la siguiente INSTRUCCION

goto parar_contador;RESET

ATECLA4 BTFSC PORTA,0 ;probar si usuario apreta tecla RA0GOTO COMENZAR ;si apreta salta a LTECLA2

LTECLA4 BTFSS PORTA,0 ;AQUI espera hasta que se afloje teclaGOTO LTECLA4 ;si afloja salta a la siguiente

instruccionGOTO RESETEAR

Page 17: Lab.Microcont_Práctica5

COMENZARdecfsz contador,f ;cuenta espacios de 10msgoto Seguir ;Aún, no son 100 interrupciones

dec

;SEGUNDOSINCF unidades,f ;Ahora sí 10x100=1000ms=1segmovlw .10subwf unidades,wbtfss STATUS,2goto contMOVLW 0X00MOVWF unidades

;clrf unidadesincf decenasmovlw .6subwf decenas,wbtfss STATUS,2goto contMOVLW 0X00MOVWF decenas

;clrf decenas

;MINUTOSINCF unidades_minutos,fmovlw .10subwf unidades_minutos,wbtfss STATUS,2goto contMOVLW 0X00MOVWF unidades_minutos

;clrf unidades_minutosincf decenas_minutosmovlw .6subwf decenas_minutos,wbtfss STATUS,2goto contMOVLW 0X00MOVWF decenas_minutos

;clrf decenas_minutos

;HORA

INCF unidades_horas,fmovlw .10subwf unidades_horas,wbtfss STATUS,2goto contMOVLW 0X00MOVWF unidades_horas

;clrf unidades_horasincf decenas_horasmovlw .2subwf decenas_horas,wbtfss STATUS,2goto contMOVLW 0X00MOVWF decenas_horas

;clrf decenas_horas

cont CALL MOSTRAR_HORA movlw .100

movwf contador ;Carga contador con 100

Seguir bcf INTCON,T0IF ;Repone flag del TMR0 movlw ~.39

movwf TMR0 ;Repone el TMR0 con ~.39 retfie ;Retorno de interrupción

;*************************************************MAIN*************************************************

MAIN

Page 18: Lab.Microcont_Práctica5

;SETEO DE PUERTOS ;BANKSEL ANSEL ;Selecciona el Bank3BSF STATUS,RP0BSF STATUS,RP1MOVLW 0X00MOVWF ANSEL;CLRF ANSELMOVLW 0X00MOVWF ANSELH;CLRF ANSELH;BANKSEL TRISCBSF STATUS,RP0BCF STATUS,RP1 MOVLW 0X00MOVWF TRISC;CLRF TRISC ;PORTc configurado como salidaMOVLW 0X00MOVWF TRISB;CLRF TRISB ;PORTb configurado como salidaMOVLW 0X00MOVWF TRISD;CLRF TRISD ;PORTd configurado como salidaMOVLW 0X00MOVWF TRISE;CLRF TRISE ;PORTE configurado como salidaMOVLW b'00000111' ;MOVWF TRISA ;PORTA configurado com I/O Digital;BANKSEL PORTA ;BCF STATUS,RP0BCF STATUS,RP1MOVLW 0X00MOVWF PORTA;CLRF PORTA ;

;INICIALIZACION ;BANKSEL PORTBBCF STATUS,RP0BCF STATUS,RP1 MOVWF PORTB;CLRF PORTB;BANKSEL PORTCBCF STATUS,RP0BCF STATUS,RP1 MOVWF PORTC;CLRF PORTC;BANKSEL PORTDBCF STATUS,RP0BCF STATUS,RP1 MOVWF PORTD;CLRF PORTD;BANKSEL PORTEBCF STATUS,RP0BCF STATUS,RP1 MOVWF PORTE;CLRF PORTEMOVWF unidades;CLRF unidadesMOVWF decenas;CLRF decenasMOVWF unidades_minutos;CLRF unidades_minutosMOVWF decenas_minutos;CLRF decenas_minutosMOVWF unidades_horas;CLRF unidades_horasMOVWF decenas_horas;CLRF decenas_horasMOVLW 0X00MOVWF sel;CLRF sel

;PROGRAMACION DEL TMR0;banksel OPTION_REG ;Selecciona el Bank1BSF STATUS,RP0

Page 19: Lab.Microcont_Práctica5

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

Loopnopgoto Loop

;cuando para el conteoparar_contador

CALL ALARMACALL PARAR_ALARMAGOTO ATECLA

;*boton reset

RESETEARCALL ALARMACALL PARAR_ALARMAGOTO MAIN

;*****************************************TONO********************************************************

ALARMA MOVLW N3 ;N3=100 veces repite tono de 250Hz.MOVWF CNT

LZO3 MOVLW B'110'MOVWF PORTE ;CALL DELAY1 ;delay1=2.0 mseg para una frecuencia de

250 hz. MOVLW b'110' MOVWF PORTE CALL DELAY1 DECFSZ CNT,F GOTO LZO3

;********************************************* RETURN************************************************ ;DELAY1 = 2MSEG DELAY1 MOVLW N

MOVWF N1LZO2 MOVLW .193 ;Para una frecuencia audible de 250 Hz

MOVWF TMR0 ;se requiere TMR0=193LZO1 BTFSS INTCON,T0IF

GOTO LZO1BCF INTCON,T0IFDECFSZ N1,FGOTO LZO2

;****************************RETURN TABLA DE CONVERSION**************************

tabla ADDWF PCL,F ; PCL + W -> W

; El PCL se incrementa con el ; valor de W proporcionando un ; salto

Page 20: Lab.Microcont_Práctica5

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

;**************************************************************************************************PARAR_ALARMA BCF PORTE,0

BCF PORTE,1BCF PORTE,2 ;Subrutina que apaga alarmamovlw b'001'movwf PORTENOP

RETURN

;*******************************MOSTRAR HORAS EN LOS LEDS****************************MOSTRAR_HORA

;MOSTRAR SEGUNDOSmovf unidades,w call tablamovwf unis_codmovf decenas,w call tablamovwf decs_codswapf decs_cod,waddwf unis_cod,wmovwf selSWAPF sel,wmovwf PORTD

;MOSTRAR MINUTOSmovf unidades_minutos,w call tablamovwf unim_codmovf decenas_minutos,w call tablamovwf decm_cod

swapf decm_cod,waddwf unim_cod,wmovwf selSWAPF sel,wmovwf PORTC

;MOSTRAR HORAmovf unidades_horas,w call tablamovwf unih_codmovf decenas_horas,w call tablamovwf dech_cod

swapf dech_cod,waddwf unih_cod,wmovwf selSWAPF sel,wmovwf PORTB

RETURN END