Вы находитесь на странице: 1из 22

ESCUELA SUPERIOR POLITCNICA DEL LITORAL

FACULTAD DE INGENIERIA EN EN ELECTRICIDAD Y COMPUTACIN FIEC

PRACTICAS DE LABORATORIO DE MICROCONTROLADORES PARALELO # 1

Integrantes: Juan Carlo Pezo Oquendo Carlos Moiss Daz Espinoza Profesor: Ing. Hugo Villavicencio V. Fecha de Presentacin: Noviembre 23, 2011 PRACTICA 5 CONTADORES

PRACTICA 5 CONTADORES
1.- Enunciado del proyecto Esta prctica consta de tres programas, el primero muestra un display conectado al puerto b, que marca las unidades controladas mediante interrupciones y dems condiciones planteadas en la codificacin del programa. El segundo consta de dos displays que conectados el uno al puerto b y el otro al puerto c, mostrarn, 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 estn conectados ambos al puerto b, aqu utilizaremos la tcnica de multiplexacin. 2.- Diagrama de Bloques

RESISTENCIAS PIC 16F887

DISPLAY

3.- Diagramas de Flujos funcional del Programa principal


CONTADOR CON DISPLAY DE SIETE SEGMENTOS USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms PARA CONTAR CADA SEGUNDO

Subrutina

Subrutina

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

Inicio Seteo de puertos


Cargar con divisor 255 el TMR0

Activar las interrupciones globales TMR0<= 217 Contador <= 100 .


w<= unidades call tabla PortB<= cod 7 seg w<= decenas call tabla PortC<= cod 7 seg

No
TMR <= 217 T0FI<=0

Decfsz Contador Si Incf unidades No

Subwf unidades, w<=10 Si Decenas<=0

No Contador<=100

Subwf unidades, w<=10

Si Unidades<=0 Incf decenas

4.-Descripcin del algoritmo o estrategia utilizada. 1. En el primer ejercicio para realizar el retardo de un segundo se utiliza el TMR0 inicializndolo con 217 para q exista una interrupcin cada 10mS, repitiendo dicha accin 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 configuracin en el TMR0 pero con la tcnica de multiplexacin y los displays se van refrescando cada 20ms. 5.- Listado del programa fuente en lenguaje ensamblador con comentarios en las lneas de cdigo 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 interrupcin 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 ;Tipo de microcontrolador ;Define los SFRs y bits del ;P16F887 __CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC ;Setea parmetros de ;configuracin errorlevel -302 ;Deshabilita mensajes de ;advertencia por cambio bancos ;La directiva "cblock 0X20...endc" reserva espacios de memoria a partir de 0x20 CBLOCK 0X020 contador ;Cuenta 100 interrupciones unidades ;registro de unidades uni_cod ;Cdigo de 7 segmentos de unidades ENDC ;INICIO DE PROGRAMA ORG 0x00 GOTO MAIN ORG 0x04 GOTO INTERRUPCION LIST INCLUDE p=16F887 P16F887.INC

;Vector de RESET ;Vector de interrupcin

INTERRUPCION decfsz contador,f ;Decrementa el contador 100 veces goto Seguir ;No, todava movf unidades,w ;Ya ocurrieron 100 int de 10ms (1000ms) call tabla movwf uni_cod movf uni_cod,w movwf PORTB INCF unidades,f movlw .10 subwf unidades,w btfss STATUS,2 goto cont clrf 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 217 bcf INTCON,T0IF ;Repone flag del TMR0 RETFIE ;Retorno de interrupcin MAIN ;SETEO DE PUERTOS BANKSEL ANSEL CLRF ANSEL CLRF ANSELH BANKSEL TRISB ;Selecciona el Bank1 CLRF TRISB ;PORTB configurado como salida ;PROGRAMACION DEL TMR0 banksel OPTION_REG movlw b'00000111' ;Programa TMR0 como temporizador movwf OPTION_REG ;con preescaler de 256 ;INICIALIZACION BANKSEL PORTB ;Selecciona el Bank 0 CLRF PORTB clrf 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 interrupcin ;cada 10mS. movlw .217 movwf TMR0 movlw .100 movwf contador ;PROGRAMACION DE INTERUPCION movlw b'10100000' movwf INTCON ;MOSTRAR CERO INICIAL clrw call tabla movwf uni_cod movf uni_cod,w movwf PORTB INCF unidades,f Loop nop goto Loop ;Valor decimal 217 ;Carga el TMR0 con 217 ;Cantidad de interrupciones a contar ;N de veces a repetir la interrupcin

;Activa la interrupcin del TMR0

; TABLA DE CONVERSION tabla ADDWF PCL,F

RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW END

0x3F 0x06 0x5B 0x4F 0x66 0x6D 0x7D 0x07 0x7F 0x67

; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

PCL + W -> W El PCL se incrementa con el valor de W proporcionando un salto Retorna con el cdigo del 0 Retorna con el cdigo del 1 Retorna con el cdigo del 2 Retorna con el cdigo del 3 Retorna con el cdigo del 4 Retorna con el cdigo del 5 Retorna con el cdigo del 6 Retorna con el cdigo del 7 Retorna con el cdigo del 8 Retorna con el cdigo del 9 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 interrupcin 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 ;Tipo de microcontrolador ;Define los SFRs y bits del ;P16F887 __CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC ;Setea parmetros de ;configuracin errorlevel -302 ;Deshabilita mensajes de ;advertencia por cambio ;bancos CBLOCK 0X020 contador ;Cuenta 100 interrupciones unidades uni_cod decenas dec_cod ENDC ;********************************************************************* ;PROGRAMA ORG 0x00 ;Vector de RESET GOTO MAIN ORG 0x04 ;Vector de interrupcin LIST INCLUDE p=16F887 P16F887.INC

GOTO

Interrupcion

;Va a rutina de interrupcin

;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES ;PARA COMPLETAR 10x100=1000ms. Interrupcion movf unidades,w call tabla movwf uni_cod movf uni_cod,w movwf PORTB movf decenas,w call tabla movwf dec_cod movf dec_cod,w movwf PORTC decfsz contador,f ;Cuenta espacios de 10ms goto Seguir ;An, no son 100 interrupciones INCF unidades,f ;Ahora s 10x100=1000ms=1seg movlw .10 subwf unidades,w btfss STATUS,2 goto cont clrf unidades incf decenas movlw .10 subwf decenas,w btfss STATUS,2 goto cont clrf decenas cont movlw .100 movwf contador ;Precarga contador con 100 Seguir bcf INTCON,T0IF ;Repone flag del TMR0 movlw .217 movwf TMR0 ;Repone el TMR0 con ~.39 retfie ;Retorno de interrupcin MAIN ;SETEO DE PUERTOS BANKSEL CLRF CLRF BANKSEL CLRF CLRF ;INICIALIZACION BANKSEL CLRF CLRF CLRF CLRF

ANSEL ANSEL ANSELH TRISB TRISB TRISC

;Selecciona el Bank1 ;PORTB configurado como salida ;PORTC configurado como salida

PORTB PORTB PORTC unidades decenas

;Selecciona el Bank0 ;Borra latch de salida de PORTB ;Borra latch de salida de PORTC

;El valor calculado para cargar en TMR0 es de 217 con un ;preescaler de 256 y a una frecuencia de 4MHz, para obtener ;una interrupcin cada 10mS. Clculo al final del ejercicio. ;PROGRAMACION DEL TMR0 banksel OPTION_REG movlw b'00000111' ;TMR0 como temporizador

movwf BANKSEL movlw movwf

OPTION_REG TMR0 .217 TMR0

;con preescaler de 256 ;Valor decimal 217 ;Carga el TMR0 con 217

;PROGRAMACION DE INTERRUPCION movlw b'10100000' movwf INTCON ;Activa la interrupcin del TMR0 movlw .100 ;Cantidad de interrupciones a contar movwf contador ;N de veces a repetir la interrupcin Loop nop goto Loop ; TABLA DE CONVERSION tabla ADDWF PCL,F ; PCL + W -> W ; El PCL se incrementa con el ; valor de W proporcionando un ; salto ; Retorna con el cdigo del 0 ; Retorna con el cdigo del 1 ; Retorna con el cdigo del 2 ; Retorna con el cdigo del 3 ; Retorna con el cdigo del 4 ; Retorna con el cdigo del 5 ; Retorna con el cdigo del 6 ; Retorna con el cdigo del 7 ; Retorna con el cdigo del 8 ; Retorna con el cdigo del 9 ; Fin del programa fuente

RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW END

0x3F 0x06 0x5B 0x4F 0x66 0x6D 0x7D 0x07 0x7F 0x67

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 tcnica de ; multiplexacin. Uno para unidades y otro para decenas. Los displays se ;refrescan cada 20ms. El tmr0 se programa para que genere una interrupcin ;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 INCLUDE p=16F887 P16F887.INC ;Tipo de microcontrolador ;Define los SFRs y bits del ;P16F887

__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC ;Setea parmetros de ;configuracin errorlevel -302 ;Deshabilita mensajes de ;advertencia por cambio ;bancos CBLOCK 0X020 contador ;Cuenta 100 interrupciones unidades uni_cod decenas dec_cod sel ENDC ;********************************************************************* ;PROGRAMA ORG 0x00 ;Vector de RESET GOTO MAIN ORG 0x04 ;Vector de interrupcin GOTO Interrupcion ;Va a rutina de interrupcin ;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES ;PARA COMPLETAR 10x100=1000ms. Interrupcion movf sel,w ;Se mueve a si mismo para afectar bandera btfss STATUS,2 ;sel=0 refresca dig1; sel=1 refresca dig2 goto dig2 dig1 movf unidades,w call tabla movwf uni_cod movf uni_cod,w bsf PORTA,0 bsf PORTA,1 movwf PORTB bcf PORTA,0 comf sel,f goto dec dig2 movf decenas,w call tabla movwf dec_cod movf dec_cod,w bsf PORTA,0 bsf PORTA,1 movwf PORTB bcf PORTA,1 comf sel,f dec decfsz contador,f ;cuenta espacios de 10ms goto Seguir ;An, no son 100 interrupciones INCF unidades,f ;Ahora s 10x100=1000ms=1seg movlw .10 subwf unidades,w btfss STATUS,2 goto cont clrf unidades incf decenas movlw .10 subwf decenas,w btfss STATUS,2

goto clrf cont

cont decenas

movlw .100 movwf contador Seguir bcf INTCON,T0IF movlw ~.39 movwf TMR0 retfie MAIN ;SETEO DE PUERTOS BANKSEL CLRF CLRF BANKSEL CLRF CLRF ;INICIALIZACION BANKSEL CLRF CLRF clrf clrf clrf

;Carga contador con 100 ;Repone flag del TMR0 ;Repone el TMR0 con ~.39 ;Retorno de interrupcin

ANSEL ANSEL ANSELH TRISA TRISA TRISB

;Selecciona el Bank3

;Selecciona el Bank1 ;PORTA configurado como salida ;PORTB configurado como salida

PORTA PORTA PORTB unidades decenas sel

;Selecciona el Bank0 ;Borra latch de salida de PORTB ;Borra latch de salida de PORTC

;PROGRAMACION DEL TMR0 banksel OPTION_REG ;Selecciona el Bank1 movlw b'00000111' ;TMR0 como temporizador movwf OPTION_REG ;con preescaler de 256 BANKSEL TMR0 ;Selecciona el Bank0 movlw .217 ;Valor decimal 217 movwf TMR0 ;Carga el TMR0 con 217 ;PROGRAMACION DE INTERRUPCION movlw b'10100000' movwf INTCON ;Activa la interrupcin del TMR0 movlw .100 ;Cantidad de interrupciones a contar movwf contador ;N de veces a repetir la interrupcin Loop nop goto Loop

; TABLA DE CONVERSION--------------------------------------------------------tabla ADDWF PCL,F ; PCL + W -> W ; El PCL se incrementa con el ; valor de W proporcionando un ; salto ; Retorna con el cdigo del 0 ; Retorna con el cdigo del 1 ; Retorna con el cdigo del 2 ; Retorna con el cdigo del 3 ; Retorna con el cdigo del 4 ; Retorna con el cdigo del 5 ; Retorna con el cdigo del 6 ; Retorna con el cdigo del 7

RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW

0x3F 0x06 0x5B 0x4F 0x66 0x6D 0x7D 0x07

RETLW 0x7F RETLW 0x67 END

; Retorna con el cdigo del 8 ; Retorna con el cdigo del 9 ; Fin del programa fuente

6.- Copia impresa del circuito armado en PROTEUS para la simulacin en el momento de su ejecucin
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 travs de dos displays valores generados entre 0 y 99, ahora bien podemos concluir que para aplicaciones es mejor usar una implementacin ms reducida, y con mejor eficiencia, por lo tanto, se llevo a cabo el uso del mismo contador con el mtodo de multiplexacin que se detalla a continuacin. Mediante la tcnica de multiplexacin lo que hacemos es enviar el dato correspondiente a los dos displays, pero slo encendemos el display1. El display2 permanece apagado, este estado lo mantenemos durante un tiempo de 20ms en nuestra prctica, adems que se genera una interrupcin con repeticin de 100 veces con el fin de activar el conteo cada 1000ms. Con esto podemos visualizar datos de ms de 1 dgito. Finalmente realizamos 4 circuitos con el mismo fin, es decir, que fueron usados como contadores, solo que cada uno present una tcnica distinta de implementacin y mediante esto pudimos llegar a la conclusin que el mtodo mejor empleado sera el de multiplexacin, aunque presenta deficiencias para el uso de programas ms complejos, nos facilit el trabajo a nosotros.

8.- Recomendaciones
Se recomienda para esta prctica aplicar el mtodo de multiplexacin en el microcontrolador ya que reduce pines de entradas y salidas en displays de 7 segmentos porque de otra forma estos necesitaran de 8 pines de salida por cada dgito. No se recomienda para propsitos generales el uso de esta tcnica, porque se pierden numerosos recursos de memoria para manejar la multiplexacin dentro del micro, y con programas ms complejos se torna difcil mantener una compensacin en los tiempos. Se recomienda utilizar subrutinas dentro de un programa para facilitar la resolucin de la misma. Como se observ en la presente prctica, la rutina tabla que se utiliz para presentar los datos por display nos permiti la conversin 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 rpida para poder ;observar el correcto funcionamiento. ; ; Use un reloj de 4MHz. ;********************************************************************* ;DIRECTIVAS LIST p=16F887 ;Tipo de microcontrolador INCLUDE P16F887.INC ;Define los SFRs y bits del ;P16F887 __CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC errorlevel N N1 N3 CNT ft -302 EQU EQU EQU EQU equ .1 0CH .50 0DH .217 ;Deshabilita mensajes de ;advertencia por cambio ;bancos

; *************************** DEFINICIONES **************************** cblock 0x20 contador ;RES 1 ;Cuenta hasta100 interrupciones temp_dh ;RES 1 unidades ;RES 1 decenas ;RES 1 unis_cod ;RES 1 decs_cod ;RES 1 unidades_minutos ;RES 1 decenas_minutos ;RES 1 unim_cod ;RES 1 decm_cod ;RES 1 unidades_horas ;RES 1 decenas_horas ;RES 1 unih_cod ;RES 1 dech_cod ;RES 1 sel ;RES 1 endc ORG GOTO ORG GOTO 0x00 MAIN 0x04 Interrupcion

;Vector de interrupcin ;Va a rutina de interrupcin

; ********************* RUTINA DE INTERRUPCION************************* INTERRUPCION ;PRESIONA LA TECLA RA1 ATECLA1 BTFSC GOTO PORTA,1 ATECLA4

;si apreta salta a LTECLA1

LTECLA1 INSTRUCCION

BTFSS GOTO goto

PORTA,1 LTECLA1

;AQUI espera hasta que se afloje tecla ;si afloja salta a la siguiente parar_contador

;RESET ATECLA4 LTECLA4 instruccion GOTO COMENZAR decfsz goto dec ;SEGUNDOS INCF movlw subwf btfss goto MOVLW MOVWF unidades,f .10 unidades,w STATUS,2 cont 0X00 unidades ;clrf unidades incf decenas movlw .6 subwf decenas,w btfss STATUS,2 goto cont MOVLW 0X00 MOVWF decenas ;clrf decenas ;MINUTOS INCF movlw subwf btfss goto MOVLW MOVWF unidades_minutos,f .10 unidades_minutos,w STATUS,2 cont 0X00 unidades_minutos ;clrf unidades_minutos incf decenas_minutos movlw .6 subwf decenas_minutos,w btfss STATUS,2 goto cont MOVLW 0X00 MOVWF decenas_minutos ;clrf decenas_minutos ;HORA INCF movlw subwf btfss goto MOVLW MOVWF unidades_horas,f .10 unidades_horas,w STATUS,2 cont 0X00 unidades_horas ;clrf unidades_horas incf decenas_horas movlw .2 subwf decenas_horas,w btfss STATUS,2 goto cont MOVLW 0X00 MOVWF decenas_horas ;clrf decenas_horas cont CALL MOSTRAR_HORA ;Ahora s 10x100=1000ms=1seg contador,f Seguir ;cuenta espacios de 10ms ;An, no son 100 interrupciones RESETEAR BTFSC GOTO BTFSS GOTO PORTA,0 COMENZAR PORTA,0 LTECLA4 ;probar si usuario apreta tecla RA0 ;si apreta salta a LTECLA2 ;AQUI espera hasta que se afloje tecla ;si afloja salta a la siguiente

movlw movwf Seguir bcf movlw movwf retfie

.100 contador INTCON,T0IF ~.39 TMR0

;Carga contador con 100 ;Repone flag del TMR0 ;Repone el TMR0 con ~.39 ;Retorno de interrupcin

;*************************************************MAIN************************************************* MAIN ;SETEO DE PUERTOS ;BANKSEL BSF BSF MOVLW MOVWF ;CLRF MOVLW MOVWF ;CLRF ;BANKSEL BSF BCF MOVLW MOVWF ;CLRF MOVLW MOVWF ;CLRF MOVLW MOVWF ;CLRF MOVLW MOVWF ;CLRF MOVLW MOVWF ;BANKSEL BCF BCF MOVLW MOVWF ;CLRF ;INICIALIZACION ;BANKSEL BCF BCF MOVWF ;CLRF ;BANKSEL BCF BCF MOVWF ;CLRF ;BANKSEL BCF BCF MOVWF ;CLRF ;BANKSEL BCF BCF MOVWF ;CLRF MOVWF ;CLRF MOVWF ;CLRF MOVWF ;CLRF MOVWF PORTB STATUS,RP0 STATUS,RP1 PORTB PORTB PORTC STATUS,RP0 STATUS,RP1 PORTC PORTC PORTD STATUS,RP0 STATUS,RP1 PORTD PORTD PORTE STATUS,RP0 STATUS,RP1 PORTE PORTE unidades unidades decenas decenas unidades_minutos unidades_minutos decenas_minutos ANSEL ;Selecciona el Bank3 STATUS,RP0 STATUS,RP1 0X00 ANSEL ANSEL 0X00 ANSELH ANSELH TRISC STATUS,RP0 STATUS,RP1 0X00 TRISC TRISC ;PORTc configurado como salida 0X00 TRISB TRISB ;PORTb configurado como salida 0X00 TRISD TRISD ;PORTd configurado como salida 0X00 TRISE TRISE ;PORTE configurado como salida b'00000111' ; TRISA ;PORTA configurado com I/O Digital PORTA ; STATUS,RP0 STATUS,RP1 0X00 PORTA PORTA ;

;CLRF MOVWF ;CLRF MOVWF ;CLRF MOVLW MOVWF ;CLRF ;PROGRAMACION DEL TMR0 ;banksel BSF BCF movlw movwf ;BANKSEL BCF BCF movlw movwf ;Presiona la tecla para iniciar ATECLA LTECLA BTFSC GOTO BTFSS GOTO CALL CALL

decenas_minutos unidades_horas unidades_horas decenas_horas decenas_horas 0X00 sel sel OPTION_REG STATUS,RP0 STATUS,RP1 b'00000111' OPTION_REG TMR0 STATUS,RP0 STATUS,RP1 .217 TMR0 ;Selecciona el Bank1 ;TMR0 como temporizador ;con preescaler de 256 ;Selecciona el Bank0 ;Valor decimal 217 ;Carga el TMR0 con 217

PORTA,1 ATECLA PORTA,1 LTECLA ALARMA PARAR_ALARMA

;probar si usuario apreta tecla RA1 ;si apreta salta a LTECLA ;AQUI espera hasta que se afloje tecla ;si afloja salta a la siguiente instruccion

;PROGRAMACION DE INTERRUPCION PTMR0 movlw b'10100000' movwf INTCON movlw .100 movwf contador Loop nop goto ;cuando para el conteo parar_contador CALL ALARMA CALL PARAR_ALARMA GOTO ATECLA ;*boton reset RESETEAR Loop

;Activa la interrupcin del TMR0 ;Cantidad de interrupciones a contar ;N de veces a repetir la interrupcin

CALL ALARMA CALL PARAR_ALARMA GOTO MAIN ;*****************************************TONO******************************************************** ALARMA LZO3 250 hz. MOVLW MOVWF CALL DECFSZ GOTO b'110' PORTE DELAY1 CNT,F LZO3 MOVLW MOVWF MOVLW MOVWF CALL N3 CNT B'110' PORTE DELAY1 ;N3=100 veces repite tono de 250Hz. ; ;delay1=2.0 mseg para una frecuencia de

;********************************************* RETURN************************************************ ;DELAY1 = 2MSEG DELAY1 MOVLW N MOVWF N1 LZO2 MOVLW .193 ;Para una frecuencia audible de 250 Hz MOVWF TMR0 ;se requiere TMR0=193 LZO1 BTFSS INTCON,T0IF

GOTO BCF DECFSZ GOTO

LZO1 INTCON,T0IF N1,F LZO2

;****************************RETURN TABLA DE CONVERSION************************** tabla ADDWF PCL,F ; PCL + W -> W ; El PCL se incrementa con el ; valor de W proporcionando un ; salto ; Retorna con el cdigo del 0 ; Retorna con el cdigo del 1 ; Retorna con el cdigo del 2 ; Retorna con el cdigo del 3 ; Retorna con el cdigo del 4 ; Retorna con el cdigo del 5 ; Retorna con el cdigo del 6 ; Retorna con el cdigo del 7 ; Retorna con el cdigo del 8 ; Retorna con el cdigo del 9

RETLW

B'00000000' RETLW B'00001000' RETLW B'00000100' RETLW B'00001100' RETLW B'00000010' RETLW B'00001010' RETLW B'00000110' RETLW B'00001110' RETLW B'00000001' RETLW B'00001001'

;************************************************************************************************** PARAR_ALARMA BCF PORTE,0 BCF PORTE,1 BCF PORTE,2 ;Subrutina que apaga alarma movlw b'001' movwf PORTE NOP RETURN ;*******************************MOSTRAR HORAS EN LOS LEDS**************************** MOSTRAR_HORA ;MOSTRAR SEGUNDOS movf unidades,w call tabla movwf unis_cod movf decenas,w call tabla movwf decs_cod swapf decs_cod,w addwf unis_cod,w movwf sel SWAPF sel,w movwf PORTD ;MOSTRAR MINUTOS movf unidades_minutos,w call tabla movwf unim_cod movf decenas_minutos,w call tabla movwf decm_cod swapf decm_cod,w addwf unim_cod,w movwf sel SWAPF sel,w movwf PORTC ;MOSTRAR HORA movf unidades_horas,w call tabla movwf unih_cod movf decenas_horas,w call tabla movwf dech_cod swapf dech_cod,w addwf unih_cod,w movwf sel SWAPF sel,w

movwf PORTB RETURN END

Вам также может понравиться