Professional Documents
Culture Documents
LABORATORIO DE MICROCONTROLADORES
Paralelo :
3
Grupo:
2
Profesor :
Ing. Carlos Valdivieso
F. Presentación:
19-Diciembre-2011
1.- Enunciado del proyecto
Reloj capaz de ajustar minutos a tiempo real y generar tonos audibles al
momento del ajuste.
µC 4 UNIDADES DE
PIC16F887 SEGUNDOS
Tres (Modo Normal y
Botones de Ajuste de
conteo)
I 3 DECENAS DE
SEGUNDOS
4 UNIDADES DE
MINUTOS
3 DECENAS DE
MINUTOS
UNIDADES
4
DE HORAS
2 DECENAS DE
HORAS
2. Configuramos todos los pines del puerto B como salida donde se verán
las unidades, así como los del puerto C donde saldrán las decenas.
;*********************************************************************
; RELOJ BINARIO CON MINUTOS AJUSTABLES Y TONOS AUDIBLES
; USANDO EL TMR0 COMO BASE DE TIEMPO DE 10ms (10x100)
;*********************************************************************
; NOMBRE: clock_final.asm
; FECHA: 06/dic/2011
; VERSION: 1.00
; PROGRAMADOR: Oscar Veloz
;*********************************************************************
; DESCRIPCION:
;RELOJ BINARIO donde en un mismo puerto están las unidades y decenas de
;segundos, asi como para los minutos en otro puerto, y horas en otro puerto.
; Comentario:
;Una vez ingresado al modo de ajuste, en el 99.9999% del tiempo de vida
;real que percibimos transcurrir como personas, el micro se encuentra
;ejecutando las instrucciones de la etiqueta esperando_aplaste_boton_ajuste
;o sino en la de esperando_suelte_boton_ajuste. Por esa razón es que coloco
;en esa etiqueta la instrucción goto siga_contando (validándola antes),
;para que sea posible SALIR del modo de ajuste (con botón del pin RB2).
;*********************************************************************
;DIRECTIVAS
LIST P=16F887
#include <p16F887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF &
_MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
;advertencia por cambio
;bancos
CBLOCK 0X020
contador ;Cuenta 100 interrupciones
seg_unidades
seg_decenas
min_unidades
min_decenas
hora_unidades
hora_decenas
set_min_decenas
set_min_unidades
aux_seg
aux_min
aux_hora
ENDC
;*********************************************************************
;PROGRAMA
ORG 0x00 ;Vector de RESET
GOTO MAIN
ORG 0x04 ;Vector de interrupción
GOTO Interrupcion ;Va a rutina de interrupción
btfss PORTA,0
goto modo_ajuste
goto siga_contando
esperando_aplaste_boton_ajuste
btfss PORTA,2 ;pregunta si se aplastó botón de salir del modo ajuste
goto siga_contando ;para salir del modo de ajuste
btfsc PORTA,1
goto esperando_aplaste_boton_ajuste ;aún no aplasto
BSF PORTE,1
BSF PORTE,2
goto esperando_suelte_boton_ajuste ;ya aplasté
esperando_suelte_boton_ajuste
btfss PORTA,1
goto esperando_suelte_boton_ajuste ;aún no suelto
BCF PORTE,1
BCF PORTE,2
goto setting ;ya solté
setting
incf set_min_unidades,f
movlw .10
subwf set_min_unidades,w
btfss STATUS,2
goto mostrar_seteo
clrf set_min_unidades
incf set_min_decenas
movlw .6
subwf set_min_decenas,w
btfss STATUS,2
goto mostrar_seteo
clrf set_min_decenas
mostrar_seteo
clrf aux_min
bcf STATUS,0
rlf set_min_decenas,w
movwf aux_min
swapf set_min_unidades,w
iorwf aux_min,w
movwf PORTC
siga_contando
BCF PORTE,0 ; ese led sólo debe estar prendido durante el modo
ajuste
;asignación a los puertos
clrf aux_seg
bcf STATUS,0
rlf seg_decenas,w
movwf aux_seg
swapf seg_unidades,w
iorwf aux_seg,w
movwf PORTB
clrf aux_min
bcf STATUS,0
rlf min_decenas,w
movwf aux_min
swapf min_unidades,w
iorwf aux_min,w
movwf PORTC
clrf aux_hora
bcf STATUS,0
rlf hora_decenas,w
movwf aux_hora
bcf STATUS,0
rlf aux_hora,f ;sólo para horas roto dos veces
swapf hora_unidades,w
iorwf aux_hora,w
movwf PORTD
;segundos
incf seg_unidades,f ;Ahora sí 10x100=1000ms=1seg
movlw .10
subwf seg_unidades,w
btfss STATUS,2
goto cont
clrf seg_unidades
incf seg_decenas
movlw .6
subwf seg_decenas,w
btfss STATUS,2
goto cont
clrf seg_decenas
;minutos
incf min_unidades,f
movlw .10
subwf min_unidades,w
btfss STATUS,2
goto cont
clrf min_unidades
incf min_decenas
movlw .6
subwf min_decenas,w
btfss STATUS,2
goto cont
clrf min_decenas
;hora
incf hora_unidades,f
movlw .2
subwf hora_decenas,w
btfsc STATUS,2
goto son_mas_de_20_horas
movlw .10
subwf hora_unidades,w
btfss STATUS,2
goto cont
clrf hora_unidades
incf hora_decenas,f
goto cont
son_mas_de_20_horas
movlw .4
subwf hora_unidades,w
btfss STATUS,2
goto cont
clrf hora_unidades
clrf hora_decenas
goto cont
Seguir
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 ANSEL
CLRF ANSEL
CLRF ANSELH
BANKSEL TRISB ;Selecciona el Bank1
CLRF TRISA
COMF TRISA,f ;PORTA es el único configurado como entrada
CLRF TRISB ;PORTB configurado como salida
CLRF TRISC ;PORTC configurado como salida
CLRF TRISD
CLRF TRISE
;INICIALIZACION
BANKSEL PORTB ;Selecciona el Bank0
MOVLW 0XFF ;inicialmente y normalmente están en nivel
MOVWF PORTA ;alto los pines de PORTA a menos que se presionen los botones
CLRF PORTB ;Borra latch de salida de PORTB
CLRF PORTC ;Borra latch de salida de PORTC
CLRF PORTD
CLRF PORTE
CLRF seg_unidades
CLRF seg_decenas
CLRF min_unidades
CLRF min_decenas
CLRF hora_unidades
CLRF hora_decenas
clrf set_min_decenas
clrf set_min_unidades
clrf aux_seg
clrf aux_min
clrf aux_hora
;PROGRAMACION DE INTERRUPCION
movlw b'10100000'
movwf INTCON ;Activa la interrupción del TMR0
movlw .100 ;Cantidad de interrupciones a contar
movwf contador ;Nº de veces a repetir la interrupción
Loop
nop
goto Loop
7.- Conclusiones
8.- Recomendaciones